读写perl中的excel文件

我是最近的Perl用户。 我需要一些关于在perl中读写文件的帮助。

让我来解释一下情况:例如,我有一个input.xls文件,其中包含string,数字,下拉列表。 表单中的某些单元格被locking。

我想从input.xls文件中读取数据,并想将其写入名为output.xls的新文件文件中。

我在这里面临的问题是我无法保留我正在阅读的文件的格式。

也就是说,生成的输出文件不会显示下拉菜单,以及在input.xls文件中locking的单元格不会显示在output.xls文件中。

其次即使在输出文件中input文件的格式化也会受到干扰。 例如,如果单元格被合并到input文件中,那么在输出文件中格式不会相同。 请指导。

这里是我的代码供您参考:

#!/usr/bin/perl -w use strict; use Spreadsheet::ParseExcel; use Spreadsheet::WriteExcel; use Spreadsheet::ParseExcel::SaveParser; use CGI; use CGI::Carp qw(fatalsToBrowser); print qq[Content-type:text/html \n\n]; my $cs='Book2.xls'; # Open the template with SaveParser my $parser = new Spreadsheet::ParseExcel::SaveParser; #my $formatter=Spreadsheet::ParseExcel::FmtJapan->new(); my $template = $parser->Parse('e.xls'); my $sheet = 0; my $row = 0; my $col = 2; # Get the format from the cell my $format = $template->{Worksheet}[$sheet] ->{Cells}[$row][$col] ->{FormatNo}; # Write data to some cells $template->AddCell(0, $row, $col, 1, $format); $template->AddCell(0, $row+1, $col, "This is a hello world eg", $format); #$format->{Lock}; # Add a new worksheet # $template->AddWorksheet('New Data'); # The SaveParser SaveAs() method returns a reference to a # Spreadsheet::WriteExcel object. If you wish you can then # use this to access any of the methods that aren't # available from the SaveParser object. If you don't need # to do this just use SaveAs(). # my $workbook; { # SaveAs generates a lot of harmless warnings about unset # Worksheet properties. You can ignore them if you wish. local $^W = 0; # Rewrite the file or save as a new file $workbook = $template->SaveAs('new.xls'); } # Use Spreadsheet::WriteExcel methods my $worksheet = $workbook->sheets(0); # $worksheet->protect(); #$worksheet->write('A1:B1','=1+2'); #my $locked = $workbook->add_format(); # $locked->set_locked(1); # A non-op #my $unlocked = $workbook->add_format(); #$locked->set_locked(0); # Enable worksheet protection #$worksheet->protect(); # This cell cannot be edited. #$worksheet->write('A1:B1', '=1+2', $locked); $worksheet->write($row+2, $col, "World2"); $workbook->close(); print qq[ <head> <script> </script> </head> <body> <p>The download should start shortly. If it doesn't, click <a id="downloadLink" href="http://128.9.45.168/~mint/MINT_Portal/macro /963/cgi/$cs" download="$cs" target="_blank">here</a>.</p> </body> </html> ]; 

保持单元格的格式是非常困难的(对于某些任意的电子表格)。 Spreadsheet :: ParseExcel并不能真正理解格式化(大部分忽略它)。

您可能会发现所有这些工作都适用于某个特定的电子表格,但是您会发现电子表格的格式更复杂,而且效果不佳。

您需要的是与Excel文档对象模型(DOM) 无损交互的东西。 (即加载一个现有的电子表格,克隆一些行,更改数据值,删除一些其他行,保存到不同的文件)。

我发现的唯一代码就是Apache POI 。

不幸的是,这是一个Java API。 最后,我使用Inline :: Java编写了一堆embedded在我的perl脚本中的pipe道代码(用Java编写)。 (也有.NET API可以做到这一点,但我在Linux上,我永远不能让MONO + Wine堆栈运行大部分的Office自动化工作。)

这种方法是有效的,但是把它closures的代码非常复杂。 我会劝阻尝试:-)

有什么办法可以避免在Perl中这样做? (或只是这个部分?)