读取/parsingXLSX文件,保留字体

有没有一个Perl模块/程序/方法,可以在Linux内部读取字体格式的XLSX文件中的文本?

它不一定是Perl,但Perl是我最熟悉的,所以Perl是最好的。

例如,一个单元格可能会说:

金刚是我最喜欢的书。 我比1984年更喜欢它。

我阅读了一堆post,下载了一堆perl模块和示例,但都是简单的提取文本。 我真的想保持格式。

为了读取XLSX文件,你需要掌握Win32::OLE – 这是一个痛苦的过程,但这不是不可能的。

Microsoft提供了一些示例代码: 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"; } 

这将告诉你,如果整个单元格是斜体。 (或大胆的,或其他)。 如果子string格式化,我还没有挖掘出会告诉你的元素。

编辑:不,我看不到任何“子单元格”格式,但显然可以完成。

随着更多的细节 – 这是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"; }