use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtUnicode;
my $file='test.xls';
my $spar = new Spreadsheet::ParseExcel;
my $frmt = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>"cp1251");
my $excel = $spar -> Parse($file,$frmt);
foreach my $sheet (@{$excel->{Worksheet}}) {
printf("Sheet: %s\n", $sheet->{Name});
$sheet->{MaxRow} ||= $sheet->{MinRow};
foreach my $row ($sheet->{MinRow} .. $sheet->{MaxRow}) {
$sheet->{MaxCol} ||= $sheet->{MinCol};
foreach my $col ($sheet->{MinCol} .. $sheet->{MaxCol}) {
my $cell = $sheet->{Cells}[$row][$col];
if ($cell) {
printf("( %s , %s ) => %s\n", $row, $col, $cell->{Val});
}
}
}
}
названия листов пишутся на русском, а значения ячеек - нет. причем при изменении кодировок меняются опять же только названия листов, а значения ячеек - нет.
прога взята собственно с www.cpan.org, изменил только первые строки согласно рекомендациям форума http://www.linux.opennet.ru/prog/info/950.shtml
Интересно конечно, но у меня локаль CP1251. а как я вижу тут перекодировка идет из CP1251 в UTF8. и ведь почему-то имена листов у меня пишутся правильно, а вот значения в ячейках - нет. Причем у меня есть еще прога на перле для преобразования XLS в HTML, в ней все нормально работает, хотя вроде все сделано так же как и у меня. Меня интересует именно причина, если кто сккккажет, где ошибка - буду очень благодарен. Приведенная программа - только пример, я ее использую только для того, чтобы в библиотечке разобраться, дальше буду писать прогу, чтоб в XML преобразовывать.
Интересно конечно, но у меня локаль CP1251. а как я вижу тут перекодировка идет из CP1251 в UTF8. и ведь почему-то имена листов у меня пишутся правильно, а вот значения в ячейках - нет. Причем у меня есть еще прога на перле для преобразования XLS в HTML, в ней все нормально работает, хотя вроде все сделано так же как и у меня. Меня интересует именно причина, если кто сккккажет, где ошибка - буду очень благодарен. Приведенная программа - только пример, я ее использую только для того, чтобы в библиотечке разобраться, дальше буду писать прогу, чтоб в XML преобразовывать.
Привести к корретному выводу в локали cp1251 просто
Предположу, что причина в том, что данные в excel пишутся в cp1251, а хранятся в юникоде. А названия листов пишутся и хранятся в юникоде.
UPDATE: предположение фигня скорее всего. Как-то была задачка получения данных и екселя. Как получить данные из перла я понял, но форматом xls особо не интересовался.
нет, уж это вряд ли. т.к. ексель формат все-таки виндовый. Тем более у меня есть пример, где все нормально работает, если надо - могу зааттачить, но сомневаюсь, что это целесообразно, т.к. пример довольно большой. Я его просмотрел, вроде бы все так как у меня, но почему-то там все нормально. Ладно, сейчас - спать, а уж в понедельник попробую тот вариант упростить, хотя хотелось бы узнать, где у меня ошибка, а не урезать чужой код. Не хочется опять попасть в тупик, когда большая чать проги будет уже написана
нет, уж это вряд ли. т.к. ексель формат все-таки виндовый. Тем более у меня есть пример, где все нормально работает, если надо - могу зааттачить, но сомневаюсь, что это целесообразно, т.к. пример довольно большой. Я его просмотрел, вроде бы все так как у меня, но почему-то там все нормально. Ладно, сейчас - спать, а уж в понедельник попробую тот вариант упростить, хотя хотелось бы узнать, где у меня ошибка, а не урезать чужой код. Не хочется опять попасть в тупик, когда большая чать проги будет уже написана
В общем, если в твоем первоначальном коде заменить $cell->{Val} на $cell->Value() - все будет ок в локали CP1251. А ексель действительно все данные в юникоде хранит .
Удачи.
попробовал с Cell->Value().
Проблема с русским решилась, но появилась другая - с числами.
при выводе ячейки с числом (именно когда используется числовой формат) вместо числа выводится GENERAL.
что, делать условие и если значение 'GENERAL', то читать через cell->{Val} ?
Некрасиво как-то. есть лидругое решение?
Возможно есть проблемы с другими форматами ячеек. сталкивался ли кто-нибудь?
еще нашел проблему с денежным форматом: вместо 11руб. выводит 1..[$руб.419].
попробовал с Cell->Value().
Проблема с русским решилась, но появилась другая - с числами.
при выводе ячейки с числом (именно когда используется числовой формат) вместо числа выводится GENERAL.
что, делать условие и если значение 'GENERAL', то читать через cell->{Val} ?
Некрасиво как-то. есть лидругое решение?
Возможно есть проблемы с другими форматами ячеек. сталкивался ли кто-нибудь?
еще нашел проблему с денежным форматом: вместо 11руб. выводит 1..[$руб.419].
тип (здесь - суффикс) - издержки cp/m философии, перекочевавшие в dos и движок этого форума.
добавил разрешение на прикрепление файлов с суффиксом .xls
p.s. но можно ведь было обойти и элементарным переименованием. например, добавкой разрешенного суффикса. хотя бы .txt
проблемы с ячейками (2,0) (числовой формат) и (3,0) (денежный формат)
если читать через {Val}, то с этими ячейками все в порядке. Неудели придется писать условие и читать через {Val}?
нет ли более красивого способа?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
проблемы с ячейками (2,0) (числовой формат) и (3,0) (денежный формат)
если читать через {Val}, то с этими ячейками все в порядке. Неудели придется писать условие и читать через {Val}?
нет ли более красивого способа?
Да, все так и есть. Сорри сейчас на работе запарка, как разгребусь - посмотрю. Но кроме условия, вижу лишь вариант с написанием своего Fmt класса(куда это условие и вставить). Если найдешь решение - дай знать плз
пока с глючными полями не связываюсь, а потом наверное просто условие вставлю. а вообще хорошо-бы саму эту бмблиотечку покопать. кстати и работает она не очень-то быстро