读取/解析XLSX文件,保留字体

时间:2015-01-31 19:26:31

标签: linux excel perl

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

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

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

  

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

我阅读了很多帖子并下载了一堆perl模块和示例,但它们都只是提取文本。我真的很想保留格式。

1 个答案:

答案 0 :(得分:0)

为了阅读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)

E.g:

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。我认为格式化每个&#39;单元格&#39;作为<si>元素。

所以你可以这样做:

foreach my $element ( $parser -> root -> children('si') ) {
    print $element -> text,"\n";
}