8

使用Spreadsheet::WriteExcel,我可以创建一个新的工作簿,但是如果我想打开现有的工作簿并修改某些列怎么办?我将如何做到这一点?

但是,我可以使用 解析工作表中的所有数据,Spreadsheet::ParseExcel然后使用某些行/列中的新值将其写回Spreadsheet::WriteExcel。有没有一个模块已经结合了两者?

主要是我只想打开一个.xls,覆盖某些行/列,然后保存它。

4

4 回答 4

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::ParseExcelSpreadsheet::WriteExcel的组合。文档底部附近有一个示例。

于 2009-09-02T17:09:53.153 回答
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 Script Host 枚举和安装网络驱动器的所有内容。它已成为 ActivePerl 最近几个版本的标准配置。

于 2009-09-03T09:50:02.613 回答
3

Spreadsheet::WriteExcel 文档中有一部分涵盖了修改和重写电子表格

Excel 文件是二进制文件中的二进制文件。它包含几个相互关联的校验和,即使更改一个字节也可能导致它损坏。

因此,您不能简单地附加或更新 Excel 文件。实现这一点的唯一方法是将整个文件读入内存,进行所需的更改或添加,然后再次将文件写出。

您可以使用 Spreadsheet::ParseExcel::SaveParser 模块读取和重写 Excel 文件,该模块是 Spreadsheet::ParseExcel 和 Spreadsheet::WriteExcel 的包装器。它是Spreadsheet::ParseExcel包的一部分。

还有一个例子。

于 2009-09-02T17:12:50.510 回答
1

Spreadsheet::ParseExcel::SaveParser模块是Spreadsheet::ParseExcel 和Spreadsheet::WriteExcel 的包装器。

我最近更新了文档,我希望这是一个更清晰的示例来说明如何执行此操作

于 2009-09-02T19:23:56.347 回答