代码之家  ›  专栏  ›  技术社区  ›  nickradford

Excel::Writer::XLSX设置优化()仅写入数字数据

  •  1
  • nickradford  · 技术社区  · 12 年前

    我正在使用Excel::Writer::XLSX perl模块导出到Excel。除了大量出口需要很长时间外,它的效果很好。但是,当我添加$workbook时->设置优化();我只在.xlsx文件中获取数字数据。

    我已经尝试使用两个$worksheet->write()和$worksheet->write_string(),但当我使用$workbook时,任何具有字符串而不是数字的字段都将被排除在导出之外->设置优化();

    如果我使用旧的Spreadsheet::WriteExcel模块,它可以正常工作,但导出的文件大小要大得多,分别为24MB和7MB

    以下是用于创建标题行的代码:

    # Create a new workbook
    my $workbook = Excel::Writer::XLSX->new($file_path);
    
    $workbook->set_optimization();
    
    my $worksheet = $workbook->add_worksheet();
    # insert the header row
    my $header_cnt = 0;
    foreach my $header_cell (@header_values){#loop through each header column and add it to the sheet
        # print $header_cell." - ".$header_cnt."\n";
        # $worksheet->write_string("0", $header_cnt, "test");
        $worksheet->write_string("0", $header_cnt, $header_cell);
        $header_cnt++;
    }
    
    $workbook->close() or die "Error closing file: $!";
    
    2 回复  |  直到 12 年前
        1
  •  2
  •   jmcnamara    12 年前

    在中写入数字或字符串应该不会有问题 set_optimization() 模式事实上有 several test cases just like that .

    我用一些样本数据运行了您程序的一个变体,结果显示正确。

    #!/usr/bin/perl -w
    
    use strict;
    use Excel::Writer::XLSX;
    
    my $workbook = Excel::Writer::XLSX->new('test.xlsx');
    $workbook->set_optimization();
    
    my $worksheet = $workbook->add_worksheet();
    
    
    my @header_values = ( 1, 2, 3, 'foo', 'bar', 6, 7 );
    my $header_cnt    = 0;
    
    for my $header_cell (@header_values){
        $worksheet->write(0, $header_cnt, $header_cell);
        $header_cnt++;
    }
    
    $workbook->close();
    

    example output

    请注意,字符串向左对齐,数字向右对齐,这表明Excel将它们视为字符串和数字数据。

    此外,如果您使用 write_string() 方法,则在任何一种情况下都将获得一个字符串。

    您遇到的问题可能是,在优化模式下,您需要按行-列顺序写入数据,即该行中的每一行和每一列都必须按顺序写入。

    例如,如果在For循环之后添加这些行,则第二个数据将不会在优化模式中显示:

    $worksheet->write('A2', "This is fine");
    $worksheet->write('A1', "I'm too late.");
    
        2
  •  0
  •   user6175763    8 年前

    为了减少内存使用,使用了set_optization()方法,它不会将数据限制为数字。它既可以处理数字,也可以处理字符串。

    并在每一行中循环

    foreach my $record (@records){
      $row++;
      $col = 0;
    
      foreach my $data (@{$record}){
          $worksheet->write($row,$col,$data);       
          $col++;
      }
    }   
    

    请参阅此链接中的“Write_largeData_XLSX.pl” https://github.com/AarthiRT/Excel_Writer_XLSX 了解更多详细信息。