【发布时间】:2015-03-31 02:13:24
【问题描述】:
是否有一个 Perl 模块/程序/方法可以在 Linux 中读取具有字体格式的 XLSX 文件中的文本?
不一定非要 Perl,但 Perl 是我最熟悉的,所以 Perl 最好。
例如,一个单元格可能会说:
金刚是我最喜欢的书。我比1984更喜欢它。
我阅读了一堆帖子并下载了一堆 perl 模块和示例,但它们都只是简单地提取文本。我真的很想保留格式。
【问题讨论】:
是否有一个 Perl 模块/程序/方法可以在 Linux 中读取具有字体格式的 XLSX 文件中的文本?
不一定非要 Perl,但 Perl 是我最熟悉的,所以 Perl 最好。
例如,一个单元格可能会说:
金刚是我最喜欢的书。我比1984更喜欢它。
我阅读了一堆帖子并下载了一堆 perl 模块和示例,但它们都只是简单地提取文本。我真的很想保留格式。
【问题讨论】:
为了阅读 XLSX 文件,您需要掌握 Win32::OLE - 这是一个痛苦的过程,但并非不可能。
微软提供了一些示例代码:http://support.microsoft.com/kb/214797
但在从电子表格读取的基本级别上,您需要以下内容:
use strict;
use warnings;
use Data::Dumper;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';
my $excelfile = 'Book1.xlsx';
my $Excel = Win32::OLE->new('Excel.Application');
my $Book = $Excel->Workbooks->Open($excelfile);
my $Sheet = $Book->Worksheets("Sheet1");
print $Sheet->Range("a2")->{Value}, "\n";
my $cell = $Sheet->Range("a2");
foreach my $key ( keys %$cell ) {
print "$key, ", $cell->{$key} ? $cell->{$key} : 0, "\n";
}
我想你会需要:
Font, Win32::OLE=HASH(0x1b2720c)
例如:
foreach my $key ( keys %{$cell->{Font}} ) {
print "$key, ", $cell->{Font}->{$key} ? $cell->{Font}->{$key} : 0, "\n";
}
这将告诉您整个单元格是否为斜体。 (或粗体,或其他)。我还没有挖出可以告诉您子字符串是否已格式化的元素。
编辑:不,我看不到任何“子单元格”格式,但显然它可以完成。
还有更多细节 - 它是 Linux:
Win32::OLE 不是一个选项 - 这是简单的方法,因为它“自动化”Excel(与 VB 使用的机制相同)。
但是,XLSX 的优点之一是它实际上是一种基于 XML 的存档格式。
所以这样的事情可能会起作用:
#!/usr/bin/perl
use strict;
use warnings;
use Archive::Zip;
use XML::Twig;
my $archive = Archive::Zip -> new ();
$archive -> read ( 'Book1.xlsx' );
my $thing = $archive -> memberNamed('xl/sharedStrings.xml');
print $thing -> contents();
my $parser = XML::Twig -> new( pretty_print => 'indented' ) -> parse ( $thing -> contents() );
$parser -> print;
现在,这有点粗糙,因为它只会转储 XML。我认为格式将每个“单元格”作为<si> 元素。
所以你可以这样做:
foreach my $element ( $parser -> root -> children('si') ) {
print $element -> text,"\n";
}
【讨论】: