【问题标题】:What is the Perl module to read XLSM file?什么是读取 XLSM 文件的 Perl 模块?
【发布时间】:2020-10-27 01:31:27
【问题描述】:

我的代码适用于 XLSX 文件,但它在 XLSM 输入文件处中断。

要求

  1. 读取 Excel 的整行而不是单元格值。
  2. 我不想使用我的 $parser = Spreadsheet::ParseXLSX->new(); 我的 $workbook = $parser->parse($prvs_excel_file); 因为它只解析单元格值。
#!/home/utils/perl
use strict;
use warnings;

sub usage { die "usage: $0 file.xlsx name [out.csv]\n"; }

my $xls = shift or usage;
my $sht = shift or usage;
my $out = shift // $xls;
   $out =~ s/\.xlsm$/.csv/i;

use Spreadsheet:: Read;
use Text::CSV_XS;

my $csv = Text::CSV_XS->new ({ binary => 1, eol => "\r\n", auto_diag => 1 });
open my $fh, ">", $out or die "$out: $!\n";

my $book  = ReadData ($xls) or die "$xls: $!\n";

my $sheet = $book->[$book->[0]{sheet}{$sht}];

foreach my $row (1 .. $sheet->{maxrow}) {
    $csv->print ($fh, [ Spreadsheet::Read::row ($sheet, $row) ]);
    }
close $fh;

【问题讨论】:

  • 是的,我做到了。它不符合我对行读取“读取 Excel 的整行而不是单元格值”的要求。
  • 我正在调查它。目前我什至无法安装模块 Spreadsheet::Reader::ExcelXML (由于测试失败)。

标签: excel csv perl xlsm


【解决方案1】:

我已经有一段时间没有查看可用的东西了,但 Spreadsheet::Reader::ExcelXML 解决的问题之一是访问 xlsm 文件。这部分是因为具有潜在危险的宏可以存储在带有 xlsm 扩展名的电子表格中。大多数其他软件包通过故意不允许该扩展来避免这种风险。 Spreadsheet::Reader::ExcelXML 通过简单地不通过接口提供对宏二进制子文件的访问来避免恶意宏的风险。包装虽然很旧,但在这一点上有些脆弱。但是,听起来 Håkon Hægland 表示有兴趣帮助解决脆性问题,真是个好消息!

要潜在地解决 OP 问题,请参阅以下代码:来自 Spreadsheet::Reader::ExcelXML::Worksheet
还要查看方法 'fetchrow_array' 和 'fetchrow_hashref'

use strict;
use warnings;
use Data::Dumper;
 
use Spreadsheet::Reader::ExcelXML;
my $workbook =  Spreadsheet::Reader::ExcelXML->new( #similar style to Spreadsheet::XLSX
                                        file => 't/test_files/TestBook.xlsx',# in the test folder of this package
                                        group_return_type => 'value',
                                );
 
if ( !$workbook->file_opened ) {
        die $workbook->error(), ".\n";
}
 
my      $worksheet = $workbook->worksheet( 'Sheet5' );
        $worksheet->set_custom_formats( {
                2 =>'yyyy-mm-dd',
        } );
my $value;
while( !$value or $value ne 'EOF' ){
        $value = $worksheet->fetchrow_arrayref;
        print Dumper( $value );
}
 
###########################
# SYNOPSIS Output
# $VAR1 = [ 'Superbowl Audibles', 'Column Labels' ];
# $VAR1 = [         'Row Labels',     2016-02-06', '2017-02-14', '2018-02-03', 'Grand Total' ];
# $VAR1 = [               'Blue',            '10',          '7',           '',          '17' ];
# $VAR1 = [              'Omaha',              '',           '',          '2',           '2' ];
# $VAR1 = [                'Red',            '30',          '5',          '3',          '38' ];
# $VAR1 = [        'Grand Total',            '40',         '12',          '5',          '57' ];
# $VAR1 = 'EOF';
###########################

【讨论】:

猜你喜欢
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 2011-07-02
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多