Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Системное программирование > Spreadsheet::ParseExcel::SaveParser |
Автор: kosyakLA 24.6.2011, 04:39 | ||
столкнулся с такой проблемой. вот код:
переписывается целиком ячейка эксельная, соответственно и форматирование удаляется. Если возможность: 1) изъять формат ячейки до внесения изменений 2) или же не переписывать ячейку по новой, а просто внести изменения заранее спасибо |
Автор: afiskon 24.6.2011, 06:52 |
В Spreadsheet::WriteExcel вроде есть форматирование. Как минимум, можно пропарсить табличку вашим модулем и отформатировать этим. |
Автор: kosyakLA 24.6.2011, 09:25 |
В модуле ParseExcel тоже про форматирование сказано...но не нашел инфы как применять |
Автор: NuINu 24.6.2011, 22:28 | ||
покажу код, которым я когда то заполнял отчеты по обслуживаемому оборудованию в эксел таблицы, смысл простой имею шаблоннный файл, в котором проставлено форматирование ячеек, далле код читает это форматирование - заголовок, обычная строка, и подвал таблицы отчета. ну то как там работется с форматированием видно. далее по имеющимся данным формируются файлы с отчетами, и формируются отчет с произвольным количеством строк. Обращу внимание на функцию МайСейф, дело в том что стандартная процедура сейф сохраняет не всю информацию о полученной таблице ))) но возвращает указатель ввода. что дает возможность, досохранить данные, я этим воспользовался и досохранил нужное мне обьединение ячеек. досохранять там можно много чего... да замечеу что делалось это довольно двано, так что код вполне возможно или не работает или код современного Spreadsheet уже изменен. не знаю
|
Автор: kosyakLA 27.6.2011, 09:56 |
Я так понял, что {FormatNo} - это тип поля будет числовой?...а как задать тип поля текстовый? |
Автор: kosyakLA 27.6.2011, 14:59 |
В обшем проблема в мерджет целлс(...как из сохранить не пойму...пролучают вот что my $parser = Spreadsheet::ParseExcel::SaveParser->new(); my $template = $parser->Parse($fileIn); for my $worksheet ( $template->worksheet(0) ) { foreach my $merg (@{$worksheet->{MergedArea}}) { print $merg->[0]; } my ( $row_min, $row_max ) = $worksheet->row_range(); my ( $col_min, $col_max ) = $worksheet->col_range(); for my $row ( $row_min .. $row_max ) { for my $col ( $col_min .. $col_max ) { my $cell = $worksheet->get_cell( $row, $col ); next unless $cell; my $value = $cell->value(); my $format = $cell->get_format(); foreach $newVals(keys %arrayData) { if($value =~/$newVals/igs) { my $mrg = $cell->is_merged(); my $out_val = Encode::decode('cp1251',$arrayData{$newVals}); my $format_number = $cell->{FormatNo}; $value=~s/$newVals/$out_val/igs; $worksheet->AddCell( $row, $col, "$value$arrayData{add_symbol}", $format_number); } } } } } у $template->SaveAs($fileOut); к какому объектру в моем случае нужно применить merge_cells? чтобы они не потерялись в примере вообще не понял, что есть $wWkS |
Автор: NuINu 27.6.2011, 17:13 |
ну и если у вас в исходной книге есть форматирование с обьединением ячеек а при изменении значений оно удаляется, ну перед изменением возьмите как у меня и методом @{$oWkS->{MergedArea}} сохраните все обьединенные диапазоны в массиве, а потом при сохранении продитесь по этому диапазону, и все будет сохранено. |
Автор: kosyakLA 28.6.2011, 08:47 |
перечитал ещё раз.... добавил к своему коду: $wBook = $template->SaveAs($fileOut); my @w_sheets=$wBook->sheets(); for(my $iSheet=0; $iSheet < $template->{SheetCount} ; $iSheet++) { my $oWkS = $template->{Worksheet}[$iSheet]; my $wWkS = $w_sheets[$iSheet]; foreach my $merg (@{$oWkS->{MergedArea}}) { $wWkS->merge_cells(@$merg); } } $wBook->close(); Правда не срабатывает после сохранения данный код. Ошибок не выдает по строкам пробегается. |
Автор: kosyakLA 28.6.2011, 14:28 |
Сегодня попробовал Ваш код. Результат такой же. По виду файла сделал вывод, что просто мерж кривой какой-то делается или просто не применяется. По крайней мере, если например объединяешь в исходном файле несколько вертикальных ячеек и ставишь в свойствах переносить по строкам , то после обработки "переностить по строкам" остается, а галочка "объединить ячейки" исчезает |
Автор: NuINu 28.6.2011, 17:53 |
ну что я могу сказать ищите пробуйте, все работает! смотрите демо в конце у файла убирите .pl |
Автор: kosyakLA 30.6.2011, 14:03 |
В примере так же не ставится галочка ;-)...У меня в файле около 100 ![]() |
Автор: shamber 30.6.2011, 14:33 | ||
я в свое время проблему решил подобным образом. Работал с XML |
Автор: NuINu 30.6.2011, 18:28 |
вы хотите сказать что в файле DemoXls1.xls ячейки не обьединены? не знаю чем вы смотрите я смотрю опенофисом, все форматирование есть. кхм.. я посмотрел в экселе действительно есть проблема, думаю решить ее можно, но для этого надо заняться небольшими исследованиями. выполнив пару трюков я добился того что эксел начал воспринимать обьединенные ячейки, но отображает данные в обьединенном регионе он по прежнему не правильно. собственно тут и надо смотреть и сравнивать форматы полученных файлов. признаться мне заниматься этим лень ). так что видно не судьба. |