![]() |
Модераторы: ginnie, korob2001 |
![]() ![]() ![]() |
|
kosyakLA |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 16.2.2007 Репутация: нет Всего: нет |
столкнулся с такой проблемой. вот код:
переписывается целиком ячейка эксельная, соответственно и форматирование удаляется. Если возможность: 1) изъять формат ячейки до внесения изменений 2) или же не переписывать ячейку по новой, а просто внести изменения заранее спасибо |
|||
|
||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: нет Всего: 4 |
В Spreadsheet::WriteExcel вроде есть форматирование. Как минимум, можно пропарсить табличку вашим модулем и отформатировать этим.
|
|||
|
||||
kosyakLA |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 16.2.2007 Репутация: нет Всего: нет |
В модуле ParseExcel тоже про форматирование сказано...но не нашел инфы как применять
|
|||
|
||||
NuINu |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: нет Всего: 6 |
покажу код, которым я когда то заполнял отчеты по обслуживаемому оборудованию в эксел таблицы, смысл простой имею шаблоннный файл, в котором проставлено форматирование ячеек, далле код читает это форматирование - заголовок, обычная строка, и подвал таблицы отчета. ну то как там работется с форматированием видно.
далее по имеющимся данным формируются файлы с отчетами, и формируются отчет с произвольным количеством строк. Обращу внимание на функцию МайСейф, дело в том что стандартная процедура сейф сохраняет не всю информацию о полученной таблице ))) но возвращает указатель ввода. что дает возможность, досохранить данные, я этим воспользовался и досохранил нужное мне обьединение ячеек. досохранять там можно много чего... да замечеу что делалось это довольно двано, так что код вполне возможно или не работает или код современного Spreadsheet уже изменен. не знаю
|
|||
|
||||
kosyakLA |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 16.2.2007 Репутация: нет Всего: нет |
Я так понял, что {FormatNo} - это тип поля будет числовой?...а как задать тип поля текстовый?
|
|||
|
||||
kosyakLA |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 16.2.2007 Репутация: нет Всего: нет |
В обшем проблема в мерджет целлс(...как из сохранить не пойму...пролучают вот что
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 |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: нет Всего: 6 |
по команде $oBook->{Worksheet}[$i_sheet]->{Cells}[$irow_center][$i]->{FormatNo}; вы получаете номер формата определенного для конкретной ячейки, как он может быть текстовым? если может посмотрите полностью поле дампом. не понимаю зачем вам именно текстовое название формата?
вы совершенно не прочитали то что я написал, и код программы, там ведеться работа специально по сохранению данного форматирования.
ну как что? мы сохраняем книгу, в книге есть страницы шити, там стоит цикл пройтись по всем страницам и что бы не городить длинные ссылки я присваиваю адрес конкретной странцы этой переменной, w это рабочая WkS воркшит страница. ну к какому обьекту применять? у меня там даже расшифровка стоит отладочная что получается при @{$oWkS->{MergedArea}} тут из обьекта извлекаются диапазоны которые выделены как обьединенные ячейки. в моем случае я применяю мердже целс в УЖЕ СОХРАНЕННОМ документе, к диапазону ячеек. в вашем случае надо применять тоже к диапазону для кторого вы хотите чтобы он был обьединен. Это сообщение отредактировал(а) NuINu - 27.6.2011, 17:08 |
||||||
|
|||||||
NuINu |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: нет Всего: 6 |
ну и если у вас в исходной книге есть форматирование с обьединением ячеек а при изменении значений оно удаляется, ну перед изменением возьмите как у меня и методом @{$oWkS->{MergedArea}} сохраните все обьединенные диапазоны в массиве, а потом при сохранении продитесь по этому диапазону, и все будет сохранено.
|
|||
|
||||
kosyakLA |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 16.2.2007 Репутация: нет Всего: нет |
перечитал ещё раз....
добавил к своему коду: $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 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 16.2.2007 Репутация: нет Всего: нет |
Сегодня попробовал Ваш код. Результат такой же. По виду файла сделал вывод, что просто мерж кривой какой-то делается или просто не применяется. По крайней мере, если например объединяешь в исходном файле несколько вертикальных ячеек и ставишь в свойствах переносить по строкам , то после обработки "переностить по строкам" остается, а галочка "объединить ячейки" исчезает
|
|||
|
||||
NuINu |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: нет Всего: 6 |
ну что я могу сказать ищите пробуйте, все работает! смотрите демо
в конце у файла убирите .pl Присоединённый файл ( Кол-во скачиваний: 7 ) ![]() |
|||
|
||||
kosyakLA |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 16.2.2007 Репутация: нет Всего: нет |
В примере так же не ставится галочка ;-)...У меня в файле около 100
![]() |
|||
|
||||
shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 1 Всего: 18 |
||||
|
||||
NuINu |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: нет Всего: 6 |
вы хотите сказать что в файле DemoXls1.xls ячейки не обьединены? не знаю чем вы смотрите я смотрю опенофисом, все форматирование есть. кхм.. я посмотрел в экселе действительно есть проблема, думаю решить ее можно, но для этого надо заняться небольшими исследованиями. выполнив пару трюков я добился того что эксел начал воспринимать обьединенные ячейки, но отображает данные в обьединенном регионе он по прежнему не правильно. собственно тут и надо смотреть и сравнивать форматы полученных файлов. признаться мне заниматься этим лень ). так что видно не судьба. Это сообщение отредактировал(а) NuINu - 1.7.2011, 11:33 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl: Системное программирование" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |