【问题标题】:Read/parse XLSX file, keeping fonts读取/解析 XLSX 文件,保留字体
【发布时间】:2015-03-31 02:13:24
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: linux excel perl


    【解决方案1】:

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

    【讨论】:

    • 不幸的是,有人编辑了我的帖子以删除我在 Linux 上运行的事实,而且 Win32::OLE 模块似乎无法在 Linux 上运行。
    • 呃。那时更烦人。您可以可能解压缩 xlsx(它是一种 zip 文件格式)并解析内容。
    • 好的,我的快速测试表明你可以。可能需要多花点时间来解析,给定标签是一个子集(但不一定遵循相同的嵌套规则)
    猜你喜欢
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多