0

我有一张 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);`
4

1 回答 1

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

于 2012-06-19T18:28:38.257 回答