Модераторы: ginnie, korob2001

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spreadsheet::ParseExcel::SaveParser, на винде работает на линухе нет 
:(
    Опции темы
des00
Дата 22.9.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Простой до офигивания пример.
Открываю экселевский файл пишу новый текст в произвольную ячейку, сохраняю под другим именем.

На винде этот код работает без проблем (немного валит в консоль шлака)
Use of uninitialized value in division (/) at C:/usr/site/lib/Spreadsheet/ParseE
xcel/SaveParser.pm line 148.
Use of uninitialized value in division (/) at C:/usr/site/lib/Spreadsheet/ParseE
xcel/SaveParser.pm line 149.
Use of uninitialized value in division (/) at C:/usr/site/lib/Spreadsheet/ParseE
xcel/SaveParser.pm line 150.
Use of uninitialized value in division (/) at C:/usr/site/lib/Spreadsheet/ParseE
xcel/SaveParser.pm line 151.

но с этим я потом разберусь.. главное что файл создает и текст вставляет..
на линухе же нифига.. говорит что типа забыл я модуль определить и пр.. умничает чёто кроче smile

Can't locate object method "Parse" via package "Spreadsheet::ParseExcel::SaveParser::Workbook" (perhaps you forgot to load "Spreadsheet::ParseExcel::SaveParser::Workbook"?) at /tmp/excel.pl line 7.




Код

#!/usr/bin/perl -w

use strict;
use Spreadsheet::ParseExcel::SaveParser;
use Encode qw(decode);

my $oBook = Spreadsheet::ParseExcel::SaveParser::Workbook->Parse('d:/file.xls');

my $oWs = $oBook->{Worksheet}[0];

$oWs->AddCell(9, 2, decode('utf-8', 'New Cell НОВЫЙ ТЕКСТ'));
$oBook->SaveAs('d:/est.xls');



Подскажите, что не так?
PM MAIL   Вверх
nitr
Дата 23.9.2008, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



Это вам поможет:
Код

use Spreadsheet::ParseExcel::SaveParser;
use Spreadsheet::ParseExcel::SaveParser::Workbook;
use Spreadsheet::ParseExcel::SaveParser::Worksheet;


Как бы странно это не звучало smile но модуль реально так себя ведет, есть подозрения на некие кривости в нём ;)
Я думаю многие знают ответ ;)


--------------------
PM   Вверх
des00
Дата 23.9.2008, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Блин))) реально...

я прежде чем задать вопрос попрбовал вот так
Код

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::SaveParser;
use Spreadsheet::ParseExcel::SaveParser::Workbook;


но потом одумался, ибо бред.. и пошел на форум.. а оставалось лишь одну строку дописать smile
PM MAIL   Вверх
des00
Дата 23.9.2008, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



а как в S:PE объеденить ячейки?

я пытался так..

Код

my $oBook = Spreadsheet::ParseExcel::SaveParser::Workbook->Parse($xls.'docs.xls');
my $oWs = $oBook->{Worksheet}[0];
$oWs->{MergedArea} = [6,0,6,25];

PM MAIL   Вверх
nitr
Дата 23.9.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



des00, ну это уже читать доку ;)
а вот бредом является, то что эти модули используются в SaveParser.pm, но нигде там "не подгружаются" smile

Добавлено через 1 минуту и 8 секунд
А может эта задумка такая? Кто сможет объяснить? smile


--------------------
PM   Вверх
des00
Дата 23.9.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



да читал я доку.. день уже читаю)) дока то какаято неподробная.. 
PM MAIL   Вверх
nitr
Дата 23.9.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



des00, дам подсказку - объединение это свойство ячейки/ячеек.

Добавлено через 29 секунд
А потому что проект - alpha


--------------------
PM   Вверх
des00
Дата 23.9.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Код

my $oBook = Spreadsheet::ParseExcel::SaveParser::Workbook->Parse($xls.'docs.xls');
my $oWs = $oBook->{Worksheet}[0];
$oWS->{Cells}[$iR][$iC] ->{Merged} = 1


оно?

А в каком видел задается  [$iR][$iC] ?

Судя по всему это нето.. вот в WriteExcel есть метод merge_range, там все ясно.. а тут нифига блин

дай примерчик,а ? ))

Это сообщение отредактировал(а) des00 - 23.9.2008, 13:45
PM MAIL   Вверх
nitr
Дата 23.9.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



des00, я не нашел у него нормального описания методов smile да и сами методы...
Модуль явно не дописан, или они должны документировать методы (ну и написать их)

Вот вам поможет...
Код

sub MergeArea {
    my $oWs = shift;
    my ($sR, $sC, $eR, $eC) = (@_);
    
    for(my $i = $sR-1; $i<=$eR-1; $i++) {
        for(my $j = $sC-1; $j<=$eC-1; $j++) {
            $oWs->{Cells}[$i][$j]->{Merged} = 1 if $oWs->{Cells}[$i][$j];
        }
    }
}

Только доработайте smile

Использовать как
Код

my $oBook = Spreadsheet::ParseExcel::SaveParser::Workbook->Parse($xls.'docs.xls');
my $oWs = $oBook->{Worksheet}[0];
MergeArea($oWs, 6, 1, 6, 25);

Т.е. в Экселе это строка №6 столбец №1 по строку №6 по строку №25.

ну и конечно протестировать стоит smile

Это сообщение отредактировал(а) nitr - 23.9.2008, 14:17


--------------------
PM   Вверх
des00
Дата 23.9.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Спасибо, завтра обязательно испытаю..
Ежели пойдет что не так, ждите снова в той же теме в тот же час  smile 
PM MAIL   Вверх
des00
Дата 24.9.2008, 06:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



эксперименты ни к чему не привели :(

Код

my $oBook = Spreadsheet::ParseExcel::SaveParser::Workbook->Parse($xls.'docs.xls');
my $oWs = $oBook->{Worksheet}[0];
MergeArea($oWs, 6, 1, 6, 25);

Undefined subroutine &main::MergeArea 

Код

my $oBook = Spreadsheet::ParseExcel::SaveParser::Workbook->Parse($xls.'docs.xls');
my $oWs = $oBook->{Worksheet}[0];
$oBook->{Worksheet}[0]->MergeArea($oWs, 6, 1, 6, 25);

Can't locate object method "MergeArea" via package "Spreadsheet::ParseExcel::SaveParser::Worksheet"

Код

my $oBook = Spreadsheet::ParseExcel::SaveParser::Workbook->Parse($xls.'docs.xls');
my $oWs = $oBook->{Worksheet}[0];
$oWs->MergeArea($oWs, 6, 1, 6, 25);

Can't locate object method "MergeArea" via package "Spreadsheet::ParseExcel::SaveParser::Worksheet"

Код

my $oBook = Spreadsheet::ParseExcel::SaveParser::Workbook->Parse($xls.'docs.xls');
my $oWs = $oBook->{Worksheet}[0];
$oWs->{Cells}->MergeArea($oWs, 6, 1, 6, 25);

Can't call method "MergeArea" on unblessed reference


p.s. попробовал вариации с MergeArea и MergedArea

Это сообщение отредактировал(а) des00 - 24.9.2008, 06:51
PM MAIL   Вверх
des00
Дата 24.9.2008, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Вот нашел, что модуль оказывается использует какойто древний метод объединения вместо нужного..

http://www.perlmonks.org/index.pl?node_id=666704

Теперь, прошу помощи, как это решение применить к моему случаю.
PM MAIL   Вверх
shamber
Дата 24.9.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 1
Всего: 18



des00, а вы в main добавляли 
Код

my $oBook = Spreadsheet::ParseExcel::SaveParser::Workbook->Parse($xls.'docs.xls');
my $oWs = $oBook->{Worksheet}[0];
MergeArea($oWs, 6, 1, 6, 25);

sub MergeArea {
    my $oWs = shift;
    my ($sR, $sC, $eR, $eC) = (@_);
    
    for(my $i = $sR-1; $i<=$eR-1; $i++) {
        for(my $j = $sC-1; $j<=$eC-1; $j++) {
            $oWs->{Cells}[$i][$j]->{Merged} = 1 if $oWs->{Cells}[$i][$j];
        }
    }
}


PM MAIL Jabber   Вверх
des00
Дата 24.9.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Теперь все добавил, ошибок нет, но и объединения не происходит.
PM MAIL   Вверх
nitr
Дата 24.9.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



des00, тогда приведите (лучше вложите) вывод вот дампа...

Код

...
use Data::Dumper 'Dumper'

...
MergeArea...;
print Dumper($oWs);

запустите примерно так perl script.pl > log.txt. Потом выложите сюда этот log.txt.

У меня всё сработало и нормально объединило. Что вам ещё посоветовать: так это самому написать "обложку" для Spreadsheet::ParseExcel и Spreadsheet::WriteExcel.

P.S.: Лично я бы не использовал модуль Spreadsheet::ParseExcel::SaveParser. Можно взять за основу некоторые его "моменты" для своего модуля.

Это сообщение отредактировал(а) nitr - 24.9.2008, 14:35


--------------------
PM   Вверх
des00
Дата 24.9.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Сделал дамп,
т.к. стуктура документа у меня сложная, то и дамп вышел офгенно большой.
Делал по ячейкам 1,2,1,10

Код

MergeArea ($oWs,1,2,1,10);


Такое чувство, что файл сохраняется в формате xls95 (в котором нет объед. ячеек)
Что конкретно смотреть в логах?

Скачать файл excel.tgz

Также сделал простой файлик в OpenOffice Calc, сохранил в формате XLS 97/2000
и прогнал тот же скрипт, лог поменьше.
Скачать файл excel-oo.tgz

Может кто поделится 100% верным файлом xls нужной версии, чтобы я попробовал именно на вашем.

По поводу своих обверток и других модулей. Мне надо то 3-5 строк объединить и все. Все остальное меня устраивает и вполне работает. Не хочется городить огороды из-за этого.

PM MAIL   Вверх
des00
Дата 25.9.2008, 07:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



создал в excel 2000 простой файл, сделал в нем средствами экселя объединенную ячейку.
Запустил скрипт
лог Скачать файл excel2000.tgz

на выходе в файле все тоже самое что у меня было но нет ни одной объединенной ячейки.. :(
даже той что средствами экселя делал

Вывод: S:PE:SP создает файл xls 5\95 где форматом не предусмотрены объд.ячейки.. иного я не могу подумать

Это сообщение отредактировал(а) des00 - 25.9.2008, 07:07
PM MAIL   Вверх
nitr
Дата 25.9.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



des00, тогда почему я смог это сделать?

P.S.: у меня не было времени смотреть логи, позже гляну как освобожусь.

Добавлено через 16 секунд
Цитата(des00 @  25.9.2008,  07:04 Найти цитируемый пост)
Вывод: S:PE:SP создает файл xls 5\95 где форматом не предусмотрены объд.ячейки.. иного я не могу подумать

не в этом проблема.


--------------------
PM   Вверх
des00
Дата 25.9.2008, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Спасибо, жду. Очень хочется побороть этот косяк.

Вот пробный xls-файлик (excel 2000)  Скачать файл docs.xls

PM MAIL   Вверх
nitr
Дата 26.9.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



des00, в логах всё нормально (на первый взгляд). В ячейках, которые вы объединяете есть текст?


--------------------
PM   Вверх
des00
Дата 26.9.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



изначально, в оригинальном файле, был.. 

но пробуя на пустом документе (что я выложил выше) без текста, все равно ничего не выходит :(
PM MAIL   Вверх
nitr
Дата 3.10.2008, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



des00, я про то, что вы, например, объединяете ячейки 1 2 3, в которых есть (хотя бы в одной) значения. Тогда надо иначе, из первой ячейки запомнить значение, в остальных удалять, затем снова в первую вставить запомн.значение... Но думаю, можно погуглить и есть готовые решения.


--------------------
PM   Вверх
nitr
Дата 3.10.2008, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 2
Всего: 84



Код
#/usr/bin/perl    
use strict;
use warnings;

use Spreadsheet::ParseExcel::SaveParser;
use Spreadsheet::ParseExcel::SaveParser::Workbook;
use Spreadsheet::ParseExcel::SaveParser::Worksheet;

my $oExcel = new Spreadsheet::ParseExcel::SaveParser;
my $oBook = $oExcel->Parse('new.xls');

my $oWs = $oBook->{Worksheet}[0];

MergeArea($oWs, 1, 2, 1, 4);

$oExcel->SaveAs($oBook, 'temp.xls');  # as the same name

sub MergeArea {
    my $oWs = shift;
    my ($sR, $sC, $eR, $eC) = (@_);
    
    my $value = $oWs->{Cells}[$sR-1][$sC-1]->{_Value};
    for(my $i = $sR-1; $i<=$eR-1; $i++) {
    for(my $j = $sC-1; $j<=$eC-1; $j++) {
        $oWs->{Cells}[$i][$j]->{_Value} = '';
        $oWs->{Cells}[$i][$j]->{Val} = '';
        $oWs->{Cells}[$i][$j]->{Merged} = 1 if $oWs->{Cells}[$i][$j];
    }
    }
    $oWs->{Cells}[$sR-1][$sC-1]->{_Value} = $value;
    $oWs->{Cells}[$sR-1][$sC-1]->{Val} = $value;
}

на выходе отличный результат smile (в архиве temp.xls)

Добавлено через 1 минуту и 11 секунд
Лучше в доке прочесть как изменить значение (по правилам модуля этого smile )
        $oWs->{Cells}[$i][$j]->{_Value} = '';
        $oWs->{Cells}[$i][$j]->{Val} = '';

Думаю это не очень "эстетично" smile)

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  attach.tgz 1,67 Kb


--------------------
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.