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

1 人关注

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

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

例如,一个单细胞可能会说。

King Kong 是我最喜欢的书。 我喜欢它多于 1984 .

我读了一堆帖子,下载了一堆perl模块和样本,但它们都是简单地提取文本。 我真的很想保留格式化。

linux
excel
perl
hymie
hymie
发布于 2015-02-01
1 个回答
Sobrique
Sobrique
发布于 2015-02-03
已采纳
0 人赞同

为了读取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";

I think you'll be needing:

Font, Win32::OLE=HASH(0x1b2720c)
foreach my $key ( keys %{$cell->{Font}} ) {
    print "$key, ", $cell->{Font}->{$key} ? $cell->{Font}->{$key} : 0, "\n";

这将告诉你整个单元格是否为斜体。(或粗体,或其他)。我还没有挖出那个可以告诉你子串是否被格式化的元素。

编辑:不对,我看不到任何 "子单元格 "的格式,但显然它可以 be done.

有了额外的细节--它是Linux。

替换代码0】不是一个选项--那是一个简单的方法,因为它使Excel "自动化"(与VB使用的机制相同)。

然而,XLSX的一个优点是,它实际上是一种基于XML的存档格式。

So something like this might work:

#!/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。Ithink格式化后的每个 "单元格 "都是<si>元素。

So you 可以 do: