【问题标题】:Data inconsistency issue while writing data into different excel files simultaneously using Perl Excel OLE使用 Perl Excel OLE 同时将数据写入不同的 Excel 文件时出现数据不一致问题
【发布时间】:2014-01-31 22:54:08
【问题描述】:

使用以下 perl 脚本,我尝试同时打开数据并将数据写入不同的 Excel 工作表。

虽然它有效,但我发现这种方法存在一些数据不一致问题。

即file1 的一些数据在 file2 中可见,反之亦然。

我对 Perl OLE 句柄没有清楚的了解。由于它对不同文件使用相同的 perl OLE 句柄,perl 是否将所有不同的文件视为一个?

如果是这样,如何避免这种情况?

perl Parser.pl C:\report1.xlsx

perl Parser.pl C:\report2.xlsx

perl Parser.pl C:\report3.xlsx

解析器.pl

use Win32::OLE qw(in with);                 # OLE Automation extensions
use Win32::OLE::Const 'Microsoft Excel';    # Extract constant definitions from TypeLib

unless (defined $Excel1) {
    $Excel1 = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
    or die "Oops, cannot start Excel";
}

$ReportFile = $ARGV[0];

# Open workbook
my $Book1 = $Excel1->Workbooks->Open($ReportFile);
{
    #### WRTIE DATA INTO EXCEL ####
}

$Book1->Save;
$Book1->Close();

【问题讨论】:

    标签: perl excel ole vba


    【解决方案1】:

    问题肯定出在 OLE 界面上。一旦你打开了一个实例,你可以尝试 Win32::OLE->GetActiveObject 而不是 new。请注意,如果您这样做,那么您可能想要打开新的 excel 并在所有脚本调用完成后关闭它。

    您可能会考虑使用Excel::Writer::XLSX 或类似的接口作为构建电子表格的界面。这将不依赖于 Excel 或 Windows。如果您正在追加、更改电子表格文件,那么您需要使用 Spreadsheet::Read 烘焙一些内容以获取内容,然后将该数据传递给您的编写器。

    使用备用模块会更安全、更便携。

    【讨论】:

    • 使用 Win32::OLE->GetActiveObject,我无法同时处理多个 Excel 文件。请参考stackoverflow.com/questions/17115476/…
    • 不确定是否存在隔离问题,但似乎存在。我记得在某处读到过的核心 COM 线程模型存在问题。按照建议使用备用模块,您将摆脱这些问题。如果当前脚本不再在一台机器上运行并进入世界,它将使您的工作可重复使用。
    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    相关资源
    最近更新 更多