首页 > 解决方案 > 使用“$csv->print”函数在 Perl 中将 XLSM 文件转换为 CSV 格式?

问题描述

函数 CSV->PRINT 是否只接受数组引用?我将 $cell2_value 推入一个数组,然后打印该数组(即行),如果我可以直接将 $cell2_value 写入一个打开的 CSV 文件,那就太好了。

需要注意的事项——

  1. 值中有逗号的 Excel 单元格将以双引号打印。
  2. 值中包含“关键字”的 Excel 单元格将以双引号打印整个单元格的值,而内引号将更改为“关键字”。

  我可以编写一个 CSV 文件,其中包含一些不需要的 excel 单元格输出。每当看到 / 或 * 等特殊字符时,它都会插入双引号。

CSV FILE from the below code:-
"CLASS_A,,x,Singapore,,0xABCF00C4,"/* x2-4Rw */",-,,,,,,,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"CHECK- ""CLASS_B""- WORKED",1,2,3"
"CLASS_A,,,malyaisa,," 3:0","/* ABCVF */",E,,,,,,,Yes,,,,,,,,,,,,,Yes,,,,,,Yes,Yes,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"

Desired output
CLASS_A,,x,malyaisa,,0xABCF00C4,/* x2-4Rw */,-,,,,,,,Yes,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"CHECK- ""CLASS_B""- WORKED",1,2,3
CLASS_A,,,malyaisa,, 3:0,/* ABCVF */,E,,,,,,,Yes,,,,,,,,,,,,,Yes,,,,,,Yes,Yes,Yes,,,,,,,,,,,,,,,,,,,

为什么它在每一行周围插入引号?有什么办法可以去掉吗?

sub Excel_to_CSV 
{
($student_excel_file) = @_;

if($student_excel_file ne "")
{
   $student_excel_out_csv_file = $student_excel_file;
   $student_excel_out_csv_file =~ s/.xlsm$/_new.csv/;
   my $parser_1   = Spreadsheet::ParseXLSX->new();
   my $workbook = $parser_1->parse($student_excel_file);
   my $csv_1 = Text::CSV->new ({ binary => 1, auto_diag => 1, sep_char  => ',' });
   open my $fh, ">:encoding(utf-8)", $student_excel_out_csv_file or die "failed to create $student_excel_out_csv_file: $!";
   if ( !defined $workbook ) 
   {
      die $parser_1->error(), ".\n";
   }
   my $worksheet=$workbook_->worksheet(0);
   my ( $row_min, $row_max ) = $worksheet->row_range();
   my ( $col_min, $col_max ) = $worksheet->col_range();
   printf("Copyig Sheet: %s from the provided student \n", $worksheet->{Name});
   my $concurentEmptyLineCount = 0;
   for my $row_1 ( $row_min .. $row_max ) 
   {
      my @row_elements_array;
      for my $col_1 ( $col_min .. $col_max ) 
         {
            my $cell_1 = $worksheet->get_cell( $row_1, 0 );
            next unless $cell_1;
            $concurentEmptyLineCount=0;
            my $cell_2 = $worksheet->get_cell( $row_1, $col_1);
            my $cell2_value =$cell_2 -> {Val};
            if(defined $cell2_value)
            {
               push(@row_elements_array, $cell2_value);
               
            }
            else
            { 
               my $blank="";    
               push(@row_elements_array, $blank);
               }
            }

            my $next_line="\n";
            push(@row_elements_array, $next_line);
                
            my @temp_row_elements_array= @row_elements_array;
            $csv_1->print($fh, \@temp_row_elements_array);
    
    
    }
close $fh;
}
return $student_excel_out_csv_file;
}

标签: excelcsvperlxlsm

解决方案


根据我对您的要求的理解,一种解决方案是从 $cell2_value 中删除多余的双引号,然后再将其推入@row_elements_array。例如:

$cell2_value =~ s/"(")*/$1/g; 
push(@row_elements_array, $cell2_value);

推荐阅读