是否有一个Perl模块/程序/方法可以在Linux中读取具有字体格式的XLSX文件中的文本?
它不一定是Perl,但Perl是我最熟悉的,所以Perl会是最好的。
例如,单个单元格可能会说:
金刚是我最喜欢的书。我比 1984 更喜欢它。
我阅读了很多帖子并下载了一堆perl模块和示例,但它们都只是提取文本。我真的很想保留格式。
答案 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";
}