使用Spreadsheet::WriteExcel
,我可以创建一个新的工作簿,但是如果我想打开现有的书并修改某些列呢?我将如何实现这一目标?
我可以使用Spreadsheet::ParseExcel
从表格中解析出所有数据,然后使用Spreadsheet::WriteExcel
将其写回某些行/列中的新值。是否有一个已经将两者组合在一起的模块?
主要是我只想打开.xls
,覆盖某些行/列并保存。
答案 0 :(得分:14)
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。
答案 1 :(得分:9)
如果安装了Excel,那么使用Win32::OLE
执行此操作几乎是微不足道的。以下是Win32::OLE
自己的文档中的示例:
use Win32::OLE;
# use existing instance if Excel is already running
eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')};
die "Excel not installed" if $@;
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脚本宿主枚举和安装网络驱动器的所有内容。它已经成为ActivePerl最后几个版本的标准。
答案 2 :(得分:3)
Spreadsheet :: WriteExcel文档的一部分涵盖了Modifying and Rewriting Spreadsheets。
Excel文件是二进制文件中的二进制文件。它包含几个互连的校验和,甚至一个字节的更改都可能导致它被破坏。
因此,您不能简单地附加或更新Excel文件。实现此目的的唯一方法是将整个文件读入内存,进行必要的更改或添加,然后再次写入文件。
您可以使用Spreadsheet :: ParseExcel :: SaveParser模块读取和重写Excel文件,该模块是Spreadsheet :: ParseExcel和Spreadsheet :: WriteExcel的包装器。它是Spreadsheet::ParseExcel包的一部分。
还有一个例子。
答案 3 :(得分:1)
Spreadsheet::ParseExcel::SaveParser模块是Spreadsheet :: ParseExcel和Spreadsheet :: WriteExcel的包装。
我最近更新了文档,我希望is a clearer example of how to do this。