URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6674
[ Назад ]

Исходное сообщение
"Perl+Excel"

Отправлено aas202 , 14-Авг-07 11:34 
Привет всем.
Мне нужно отредактировать excel файл. Проблема в том что модель Spreadsheet::WriteExcel позволяет создать только новый excel файл и работать в нем. А как открыть файл для редактирования?
Спасибо

Содержание

Сообщения в этом обсуждении
"Perl+Excel"
Отправлено cat , 14-Авг-07 12:49 
>Привет всем.
>Мне нужно отредактировать excel файл. Проблема в том что модель Spreadsheet::WriteExcel позволяет
>создать только новый excel файл и работать в нем. А как
>открыть файл для редактирования?
>Спасибо

Spreadsheet::ParseExcel


"Perl+Excel"
Отправлено aas202 , 14-Авг-07 13:03 

> Spreadsheet::ParseExcel

ParseExcel не позволяет писать, только читать


"Perl+Excel"
Отправлено tx2 , 14-Авг-07 14:15 
use Spreadsheet::WriteExcel;

"Perl+Excel"
Отправлено aas202 , 14-Авг-07 14:16 
>use Spreadsheet::WriteExcel;

WriteExcel только новый файл создает и в нем работает, а мне нужно отредактировать файл.


"Perl+Excel"
Отправлено phpcoder , 14-Авг-07 14:18 
>WriteExcel только новый файл создает и в нем работает, а мне нужно
>отредактировать файл.

Ну раз читать можете и писать в другой файл тоже можете, то в чем проблема? Прочитал, записал во временный, а потом переименовал ) Во всяком случае должно работать.



"Perl+Excel"
Отправлено aas202 , 14-Авг-07 14:20 
>>WriteExcel только новый файл создает и в нем работает, а мне нужно
>>отредактировать файл.
>
>Ну раз читать можете и писать в другой файл тоже можете, то
>в чем проблема? Прочитал, записал во временный, а потом переименовал )
>Во всяком случае должно работать.

Это единственный выход? проблема в том что файл большой с различными форматами и тд. Не хочется ради одного изменения городить непонятно что.


"Perl+Excel"
Отправлено tx2 , 17-Авг-07 06:52 
если скрипт планируется выполнять под виндой, то можно через OLE...
описано здесь:
http://www.thescripts.com/forum/thread50152.html

если под никсами... незнаю, но есть предположение, что можно попробовать через какойнибудь automation интерфейс OpenOffice/StarOffice... они ж. Excelевские доки читают/пишут...


"сам столкнулся с подобной проблемой"
Отправлено amdk7 , 19-Фев-08 11:31 
Сам столкнулся с подобной проблемой. Странно что у других людей подобной проблемы не было.
Т.е. я тоже хочу поменять одну или несколько ячеек и для этого мне надо один файл читать, а в другой писать, а редактировать ничего найти не могу.
Возможно, это связано со сложность формата, т.е. может после редактирования получится что файл перестанет открываться, может поэтому и решили отказаться от этого.

#!/usr/local/bin/perl

use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;

print "Content-type:text/html; charset=windows-1251\n\n";
print "<html>\n<head>";

print "<TITLE>Конвертор</TITLE>\n<META NAME=\"content\" CONTENT=\"text/html; charset=windows-1251\">\n";
print "</HEAD><BODY>\n";

    my $excel = Spreadsheet::ParseExcel::Workbook->Parse('/home/.../file1.xls');

my $workbook  = Spreadsheet::WriteExcel->new('/home/.../file2.xls');
    my $worksheet = $workbook->add_worksheet();


    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) {
#                    $worksheet->write(0, 0,  "Hi Excel!");
                    $worksheet->write($row, $col,  $cell->{Val});
                     $cell->{Val}='333';
                    printf("( %s , %s ) => %s\n", $row, $col, $cell->{Val});
                }
            }
        }
    }

    
$excel->close();
    $workbook->close();


print "</body>\n</html>";

Оно работает. но без форматирования и без русских букв - вместо них фигня какая-то.            
если написать
$worksheet->write($row, $col, $cell->{Val}, $cell->{Format});
то ругается, не понимает.


"сам столкнулся с подобной проблемой"
Отправлено aas202 , 19-Фев-08 11:37 
За столько времени я так и не нашел более менее подходящего решения. Пришлось писать VB скрипт под Excel и его запускать из перла.

"сам столкнулся с подобной проблемой"
Отправлено amdk7 , 19-Фев-08 11:56 
Кажется я нашёл!
вам нужен Spreadsheet::ParseExcel::SaveParser - Expand of Spreadsheet::ParseExcel with Spreadsheet::WriteExcel

http://search.cpan.org/~szabgab/Spreadsheet-ParseExcel-0.32/...
А вот пример программы
use strict;
    use Spreadsheet::ParseExcel::SaveParser;
    $oBook =
        Spreadsheet::ParseExcel::SaveParser::Workbook->Parse('Excel/Test97.xls');
    my $oWs = $oBook->AddWorksheet('TEST1');
    $oWs->AddCell(10, 1, 'New Cell');
    $oBook->SaveAs('iftest.xls');


"сам столкнулся с подобной проблемой"
Отправлено aas202 , 19-Фев-08 11:57 
>[оверквотинг удален]
>
>http://search.cpan.org/~szabgab/Spreadsheet-ParseExcel-0.32/...
>А вот пример программы
> use strict;
>    use Spreadsheet::ParseExcel::SaveParser;
>    $oBook =
>        Spreadsheet::ParseExcel::SaveParser::Workbook->Parse('Excel/Test97.xls');
>    my $oWs = $oBook->AddWorksheet('TEST1');
>    $oWs->AddCell(10, 1, 'New Cell');
>    $oBook->SaveAs('iftest.xls');

попробуемс.. спасибо


"сам столкнулся с подобной проблемой"
Отправлено Anton , 19-Сен-08 19:58 
>[оверквотинг удален]
>>А вот пример программы
>> use strict;
>>    use Spreadsheet::ParseExcel::SaveParser;
>>    $oBook =
>>        Spreadsheet::ParseExcel::SaveParser::Workbook->Parse('Excel/Test97.xls');
>>    my $oWs = $oBook->AddWorksheet('TEST1');
>>    $oWs->AddCell(10, 1, 'New Cell');
>>    $oBook->SaveAs('iftest.xls');
>
>попробуемс.. спасибо

А русский текст победили? У меня ничего не выходит.. пробовал в разных кодировках - один фиг


"сам столкнулся с подобной проблемой"
Отправлено Lex , 27-Окт-08 11:54 
>>>А вот пример программы
>>> use strict;
>>>    use Spreadsheet::ParseExcel::SaveParser;
>>>    $oBook =
>>>        Spreadsheet::ParseExcel::SaveParser::Workbook->Parse('Excel/Test97.xls');
>>>    my $oWs = $oBook->AddWorksheet('TEST1');
>>>    $oWs->AddCell(10, 1, 'New Cell');
>>>    $oBook->SaveAs('iftest.xls');
>>

а вот код этот не работает у меня почему то, пришет что метода Parse нет в пакете Spreadsheet::ParseExcel::SaveParser::Workbook, хотя вроде все про ципанил... покажите рабочий код у кого заработало

А русский текст победили:
my $worksheet1   = $workbook->add_worksheet(Encode::decode('utf8','Русский текст'));
$worksheet1->write('C'.$i++,Encode::decode('utf8',"Русский текст"));