【问题标题】:making cells blank in and excel sheet using perl使用 perl 使单元格空白和 Excel 工作表
【发布时间】:2012-06-21 17:06:28
【问题描述】:

我有一张 Excel 表格,需要清空其中的一些单元格

到目前为止,它是这样的:

我打开工作表,检查 M 列中的单元格是否为空。 我将这些单元格添加到我的数组错误中 然后我想让所有这些单元格变黑并保存文件(这一步不起作用),因为该文件需要作为另一个程序的输入/ 谢谢!

$infile = $ARGV[0];

 $columns = ReadData($infile) or die "cannot open excel table\n\n";
 print "xls sheet contains $columns->[1]{maxrow} rows\n";

 my $xlsstartrow;
 if ( getExcel( A . 1 ) ne "text" ) {

$xlsstartrow = 2;   
 }
 else 
 {
$xlsstartrow = 4;
 }


 check_templates();
 print "done";
 sub check_templates {

for ( $row = $xlsstartrow ; $row < ( $columns->[1]{maxrow} + 1 ) ; $row++ ) {

    if (getExcel(M . $row) ne ""  ){ 

        $cell = "M" . $row ;

        push(@mistakes,$cell);

    }

}
 rewritesheet(@mistakes);


 }

 sub rewritesheet {


my $FileName = $infile;
 my $parser   = Spreadsheet::ParseExcel::SaveParser->new();
 my $template = $parser->Parse($FileName);
my $worksheet = $template->worksheet(0);


my $row      = 0;
my $col      = 0;
# Get the format from the cell

my $format   = $template->{Worksheet}[$sheet]
                       ->{Cells}[$row][$col]
                        ->{FormatNo};


    foreach (@mistakes){


$worksheet->AddCell( $_, "" ); 
}          

 $template->SaveAs($infile2);`

【问题讨论】:

  • 您使用哪些模块来处理 Excel 文件?
  • 这看起来像Spreadsheet::Read。请发布完整的脚本use strict;use warnings; 开头。然后 - 找出现在将出现的许多错误消息和警告。如果您无法弄清楚您的问题,请尝试将您的程序减少到几行(仅执行您要求的操作)。

标签: perl excel parsing


【解决方案1】:

清空 Excel 工作表中的列值并保存结果?

如果您的程序的全部目的是从 .xls 文件中删除所有列 M 值,那么以下程序(从您的程序中采用)将完全做到这一点:

  use strict;
  use warnings;
  use Spreadsheet::ParseExcel;
  use Spreadsheet::ParseExcel::SaveParser;

   my $infile  = $ARGV[0];
  (my $infile2 = $infile) =~ s/(\.xls)$/_2$1/;
   my $parser  = Spreadsheet::ParseExcel::SaveParser->new();
   my $workbook = $parser->Parse($infile);

   my $sheet = $workbook->worksheet(0);
   print "xls sheet contains rows \[0 .. $sheet->{MaxRow}\]\n";
   my $startrow = $sheet->get_cell(0, 0) eq 'text' ? 4-1 : 2-1;

   my $col_M = ord('M') - ord('A');
   for my $row ($startrow .. $sheet->{MaxRow}) {
      my $c = $sheet->get_cell($row, $col_M);
      if(defined $c && length($c->value) > 0) { # why check?
         $sheet->AddCell($row, $col_M, undef) # delete value
      }
   }
   $workbook->SaveAs($infile2);
   print "done";

但是,如果您真的只想清除列 M,您为什么要测试值?您可以直接覆盖它们而无需测试。也许这不是您的所有程序都需要执行的吗?我不知道。

问候

rbo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多