gpt4 book ai didi

Perl 如何将两个或多个 Excel 文件合并为一个(多个工作表)?

转载 作者:行者123 更新时间:2023-12-02 11:27:21 27 4
gpt4 key购买 nike

我需要将几个 Excel 文件合并到一张或多张工作表中。我不太关心新文件上的工作表名称。

我计划运行此程序的计算机上没有 Excel。所以我不能使用Win32 OLE。我尝试运行此代码 https://sites.google.com/site/mergingxlsfiles/但它不起作用,我得到一个新的空 Excel 文件。

我尝试运行 http://www.perlmonks.org/?node_id=743574但我只获得了新的excel文件中的一个文件。

我的输入 Excel 文件有一些法语字符(例如 é)我相信这些是 cp1252。

使用的代码:

    #!/usr/bin/perl -w
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use File::Glob qw(bsd_glob);
use Getopt::Long;
use POSIX qw(strftime);

GetOptions(
'output|o=s' => \my $outfile,
'strftime|t' => \my $do_strftime,
) or die;

if ($do_strftime) {
$outfile = strftime $outfile, localtime;
};

my $output = Spreadsheet::WriteExcel->new($outfile)
or die "Couldn't create '$outfile': $!";

for (@ARGV) {
my ($filename,$sheetname,$targetname);
my @files;
if (m!^(.*\.xls):(.*?)(?::([\w ]+))$!) {
($filename,$sheetname,$targetname) = ($1,qr($2),$3);
warn $filename;
if ($do_strftime) {
$filename = strftime $filename, localtime;
};
@files = glob $filename;
} else {
($filename,$sheetname,$targetname) = ($_,qr(.*),undef);
if ($do_strftime) {
$filename = strftime $filename, localtime;
};
push @files, glob $filename;
};

for my $f (@files) {
my $excel = Spreadsheet::ParseExcel::Workbook->Parse($f);
foreach my $sheet (@{$excel->{Worksheet}}) {
if ($sheet->{Name} !~ /$sheetname/) {
warn "Skipping '" . $sheet->{Name} . "' (/$sheetname/)";
next;
};
$targetname ||= $sheet->{Name};
#warn sprintf "Copying %s to %s\n", $sheet->{Name}, $targetname;

my $s = $output->add_worksheet($targetname);
$sheet->{MaxRow} ||= $sheet->{MinRow};
foreach my $row ($sheet->{MinRow} .. $sheet->{MaxRow}) {
my @rowdata = map {
$sheet->{Cells}->[$row]->[$_]->{Val};
} $sheet->{MinCol} .. $sheet->{MaxCol};
$s->write($row,0,\@rowdata);
}
}
};
};

$output->close;

我有 2 个 Excel 文件,名为:2.xls(其中只有 1 个名为 2 的工作表)、3.xls(只有 1 个名为 3 的工作表)

我启动脚本如下:

xlsmerge.pl -s -o results-%Y%m%d.xls 2.xls:2 3.xls:3

结果:results-20121024.xls 中没有任何内容。

然后我尝试了

xlsmerge.pl -s -o results-%Y%m%d.xls 2.xls 3.xls 

而且它成功了。我不确定为什么在添加工作表名称时失败

最佳答案

这行脚本似乎有一个错误:

if (m!^(.*\.xls):(.*?)(?::([\w ]+))$!) {
($filename,$sheetname,$targetname) = ($1,qr($2),$3);
...

在我看来,该行的目标是允许以下形式的参数

spreadsheet.xls:source_worksheet

或以另一种形式允许指定目标工作表的名称:

spreadsheet.xls:source_worksheet:target_worksheet

最后一个分组似乎是为了捕获最后一个可选参数:(?::([\w ]+))。唯一的问题是,这个分组不是可选的。因此,当您仅指定源表而不指定目标时,正则表达式将无法匹配,并且会陷入备份行为,即将整个参数视为文件名。但这也会失败,因为您没有名为 2.xls:2 的文件。

解决方案是在正则表达式中的最后一组之后引入 ? 修饰符以使其可选:

if (m!^(.*\.xls):(.*?)(?::([\w ]+))?$!) {
($filename,$sheetname,$targetname) = ($1,qr($2),$3);
...

当然,这可能不是唯一的问题。如果发布的脚本有错误,那么也可能存在其他错误。我目前没有可用的 Perl 来测试它。

关于Perl 如何将两个或多个 Excel 文件合并为一个(多个工作表)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13050659/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com