2009-09-02 2 views
7

С помощью Spreadsheet::WriteExcel я могу создать новую книгу, но что, если я хочу открыть существующую книгу и изменить некоторые столбцы? Как я могу это сделать?Как изменить существующую книгу Excel с помощью Perl?

Я мог разобрать все данные из листа, используя Spreadsheet::ParseExcel, а затем записать его с новыми значениями в определенных строках/столбцах, используя Spreadsheet::WriteExcel. Есть ли модуль, который уже объединяет два?

В основном я просто хочу открыть .xls, перезаписать определенные строки/столбцы и сохранить его.

ответ

13

Spreadsheet::ParseExcel прочтет в существующих файлах Excel:

my $parser = Spreadsheet::ParseExcel->new(); 
# $workbook is a Spreadsheet::ParseExcel::Workbook object 
my $workbook = $parser->Parse('Book1.xls'); 

Но то, что вы на самом деле хочу Spreadsheet::ParseExcel::SaveParser, который представляет собой сочетание Spreadsheet::ParseExcel и Spreadsheet::WriteExcel. В нижней части документации находится example.

+0

Я не вижу никакого способа написать книгу Excel, используя ParseExcel – user105033

+0

Таблицы :: ParseExcel :: SaveParser сделает это. вы избили мое редактирование. :) – Ether

3

Существует раздел электронных таблиц: WriteExcel, который охватывает Modifying and Rewriting Spreadsheets.

Файл Excel является двоичным файлом в двоичном файле. Он содержит несколько взаимосвязанных контрольных сумм и изменение даже одного байта может привести к его повреждению.

Таким образом, вы не можете просто добавить или обновить файл Excel. Единственный способ добиться этого - прочитать весь файл в памяти, внести необходимые изменения или дополнения, а затем снова записать файл.

Вы можете прочитать и переписать файл Excel с помощью модуля Spreadsheet :: ParseExcel :: SaveParser, который является оберткой вокруг таблицы: ParseExcel и Spreadsheet :: WriteExcel. Это часть пакета Spreadsheet::ParseExcel.

Также есть пример.

1

Модуль Spreadsheet::ParseExcel::SaveParser является оберткой вокруг таблицы :: ParseExcel и таблицы :: WriteExcel.

Недавно я обновил документацию, надеюсь, is a clearer example of how to do this.

+0

Я до сих пор не совсем понимаю этот пример. Я не могу найти документацию о том, что принимает SaveAs. Можно ли передавать файлы или скалярные ссылки вместо имени файла? – Myforwik

+0

К сожалению, я понял, что Джон Макнамара включил файл write_to_scalar.pl в пакет.Используя его, я смог сделать память для изменения памяти файла XLS: -D – Myforwik

9

Если у вас установлен Excel, то это почти тривиально, чтобы сделать это с помощью Win32::OLE. Вот пример из собственной документации Win32::OLE «s:

use Win32::OLE; 

# use existing instance if Excel is already running 
eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')}; 
die "Excel not installed" if [email protected]; 
unless (defined $ex) { 
    $ex = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}) 
      or die "Oops, cannot start Excel"; 
} 

# get a new workbook 
$book = $ex->Workbooks->Add; 

# write to a particular cell 
$sheet = $book->Worksheets(1); 
$sheet->Cells(1,1)->{Value} = "foo"; 

# write a 2 rows by 3 columns range 
$sheet->Range("A8:C9")->{Value} = [[ undef, 'Xyzzy', 'Plugh' ], 
            [ 42, 'Perl', 3.1415 ]]; 

# print "XyzzyPerl" 
$array = $sheet->Range("A8:C9")->{Value}; 
for (@$array) { 
    for (@$_) { 
     print defined($_) ? "$_|" : "<undef>|"; 
    } 
    print "\n"; 
} 

# save and exit 
$book->SaveAs('test.xls'); 
undef $book; 
undef $ex; 

В принципе, Win32::OLE дает вам все, что доступно на VBA или Visual Basic приложение, которое включает в себя огромное разнообразие вещей - все, начиная от автоматизации Excel и Word, перечислить и установить сетевые диски через Windows Script Host. Он стал стандартным с последними версиями ActivePerl.

+1

Кроме того, вы можете записывать целые массивы в столбцы \ ряды сразу, и это влияет на скорость записи. Если этого недостаточно, вы также можете записать в excel, в котором есть макрос, и работать с этим модулем. –

+0

Спасибо. Я заметил, что Spreadsheet :: ParseXLSX :: SaveParser не существует, поэтому для меня это работает намного лучше. –

+0

@ usr-bin-drink: Рад, что это было полезно :) –