【问题标题】:Merged cells are unmerging on Save, using Spreadsheet::ParseExcel合并的单元格在保存时取消合并,使用 Spreadsheet::ParseExcel
【发布时间】:2015-10-09 05:18:13
【问题描述】:

我正在编写一个程序来解析一个 .xls 文件。为此,我有一个包含五个合并单元格(B1、C1、D1、E1、F1)的模板,并在其中写了“用户相关错误”。在 B2、C2、D2、E2、F2 中,我写了错误名称并希望每天保存它们的计数。代码工作正常,但在解析和保存合并的单元格(B1、C1、D1、E1、F1)后被取消合并,文本显示在 B1 中。即使在解析之后,我也需要按原样(合并)合并单元格。

我该怎么办?

#!/usr/bin/perl
use strict;
use warnings;

use DBI;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::SaveParser;

my $date=$ARGV[1]; #yymmdd
my $hour=$ARGV[0]; #06

$date or $date=`date --date='1 day ago' +%Y%m%d`;
chomp $date;
chomp $hour;

my $db_name   = "ravi";
my $table     = "CDR";
my $sub_table = "Submission_Failures";
my $del_table = "Delivery_Failures";
my $host      = "xxx.xx.x.xxx";

my $command = "cp /root/prac/CDR/CDR.xls /root/prac/CDR/CDR_Report_20$date$hour.xls";
print $command;
`$command`;

sub NULL_count
{
    my $type = $_[0];
    my @temp_array;
    my $error_db = DBI->connect("DBI:mysql:database=$db_name;host=$host;mysql_socket=/opt/lampstack-5.5.27-0/mysql/tmp/mysql.sock","root","", {'RaiseError' => 1});
    my $error_sth = $error_db->prepare("SELECT Error_list from error_potrait WHERE Date='$date' and Type='$type'");
    $error_sth->execute() or die $DBI::errstr;
    while (my $temp = $error_sth->fetchrow_array())
    {
            push(@temp_array, $temp);
    }
    my $temp = @temp_array;
    foreach my $i ($temp .. 4)
    {
            $temp_array[$i] = "NULL";
    }
    $error_sth->finish();
    return @temp_array;
}

my @db_system_errors   = NULL_count ("Submission_user_error");
my @db_network_errors  = NULL_count ("Submission_ESME_error");
my @db_ESME_errors     = NULL_count ("Submission_system_error");
my @db_user_errors     = NULL_count ("Submission_network_error");
my @del_user_errors    = NULL_count ("Delivery_user_error");
my @del_network_errors = NULL_count ("Delivery_network_error");
my @del_system_errors  = NULL_count ("Delivery_system_error");
my @submission_errors  = (@db_network_errors,@db_system_errors,@db_ESME_errors,@db_user_errors);
my @delivery_errors    = (@del_user_errors,@del_network_errors,@del_system_errors);

sub error_headers
{
    my $sheet_no = shift;
    my @array    = @_;
    my $row      = 1;
    my $col      = 1;

    # Open an existing file with SaveParser
    my $parser   = Spreadsheet::ParseExcel::SaveParser->new();
    my $template = $parser->Parse("CDR_Report_20$date$hour.xls") or die "Cant open xls";

    # Get the first worksheet.
    my $sheet = $template->worksheet($sheet_no);
    $sheet->AddCell( 1, 0, $date );

    foreach my $value (@array)
    {
            $sheet->AddCell( $row, $col, $value );
            ++$col;
    }
    $template->SaveAs("CDR_Report_20$date$hour.xls");
}

error_headers (3,@submission_errors);
error_headers (4,@delivery_errors);

sub parser_excel
{
    my $sql_comm = $_[0];
    my $sheet_no = $_[1];
    my $row      = $_[2];
    my $col      = $_[3];

    my $dbh = DBI->connect("DBI:mysql:database=$db_name;host=$host;mysql_socket=/opt/lampstack-5.5.27-0/mysql/tmp/mysql.sock","root","",      {'RaiseError' => 1});
    #Selecting the data to fetch
    my $sth = $dbh->prepare("$sql_comm");
    $sth->execute() or die $DBI::errstr;
    # Open an existing file with SaveParser
    my $parser   = Spreadsheet::ParseExcel::SaveParser->new();
    my $template = $parser->Parse("CDR_Report_20$date$hour.xls") or die "Cant open xls";
   # Get the first worksheet.
    my $sheet = $template->worksheet($sheet_no);
    $sheet->AddCell( $_[4], 0, $date );

    while (my @row = $sth->fetchrow_array())
    {
            my $Date_db = shift @row;
            foreach my $value (@row)
            {
                    $sheet->AddCell( $row, $col, $value );
                    ++$col;
            }
            $row++;
            $col=0;
    }
    $template->SaveAs("CDR_Report_20$date$hour.xls");
    $sth->finish();
}

parser_excel("Select * from $table where Date = $date and Hour = $hour",2,1,0,0);
parser_excel("Select * from $sub_table where Date = $date and Hour = $hour",3,2,0,1);
parser_excel("Select * from $del_table where Date = $date and Hour = $hour",4,2,0,1);`

【问题讨论】:

  • perl 模块是否支持合并单元格?如果它基于早期的 XLS 文件格式(大约在 perl 流行的时候),那么它可能不会。
  • @Jeeped Perl 仍然很受欢迎。 :) 实际上Spreadsheet::ParseExcel 甚至有最近的提交。
  • 问题还在讨论中" "perl 模块是否支持合并单元格?"
  • 报告了一个错误,因为没有正确保存合并的单元格,显然在 0.32 版中已修复。我建议您使用当前版本重现并提交错误报告。
  • 我通过 shebang 和 cp 命令假设这是在 Unix 上,这意味着你不能使用 Win32::OLE?理论上可以迁移脚本以在 Windows 上运行吗?

标签: excel perl merge spreadsheet perl-module


【解决方案1】:

Spreadsheet::ParseExcel::SaveParser 的文档指出该模块“通过使用 Spreadsheet::ParseExcel 读取并使用 Spreadsheet::WriteExcel 重写”来工作。因此,任何合并的单元格在重写时都会丢失。您将需要使用 WriteExcel 模块重新创建合并的单元格,这意味着您必须在自己的脚本中分离读取和写入。

要合并单元格,请使用带有格式的“merge_range”方法:

my $format = $workbook->add_format( align => 'left' );
$worksheet->merge_range('B1:F1', 'User-Dependent errors', $format);

请参阅Spreadsheet::WriteExcel 的文档

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    相关资源
    最近更新 更多