Perl의 Excel 읽기 및 쓰기 문제

자꾸 누군가가 나에게 excel 중국어 난자 문제를 묻는다. 나는 평소에 이 부분을 거의 접촉하지 않는다. 매번 처음부터 연구해야 한다. 지금은 결론을 여기에 기록하여 잊어버리려고 한다.읽다:

  
  
  
  
  1. use strict;  
  2. use warnings;  
  3.  
  4. use Spreadsheet::ParseExcel;  
  5. use MyExcelFormatter;  
  6.  
  7. my $file = 'foo.xls';  
  8.  
  9. my $fmt = new MyExcelFormatter();  
  10.  
  11. my $xls = Spreadsheet::ParseExcel::Workbook->Parse( $file, $fmt );  
  12. my @workSheet = @{ $xls->{Worksheet} };  
  13. foreach my $sheet ( @workSheet ){  
  14.     my $sheetName = $sheet->get_name();  
  15.     print " : $sheetName
    "
    ;  
  16.  
  17.     my ( $minRow, $maxRow ) = $sheet->row_range();  
  18.     my ( $minCol, $maxCol ) = $sheet->col_range();  
  19.  
  20.     foreach my $row ( $minRow .. $maxRow ){  
  21.         foreach my $col ( $minCol .. $maxCol ){  
  22.             my $cell = $sheet->get_cell( $row, $col );  
  23.             next unless $cell;  
  24.             print " ($row,$col) ", $cell->value;  
  25.         }  
  26.         print "
    "
    ;  
  27.     }  

기본적으로 위의 코드는 Spreadsheet::ParseExcel 문서에서 베낀 것입니다.my $fmt 제외 = new MyExcelFormatter();이 줄 밖.이 줄은 문서 내용의 변환기(포맷 도구)를 생성합니다. 변환기 코드는 다음과 같습니다.

  
  
  
  
  1. package MyExcelFormatter;  
  2.  
  3. use strict;  
  4. use warnings;  
  5.  
  6. use base qw(Spreadsheet::ParseExcel::FmtDefault);  
  7.  
  8. use Encode::CN;  
  9. use Encode qw(from_to);  
  10.  
  11. sub new() {  
  12.     return bless {};  
  13. }  
  14.  
  15. sub TextFmt( $;$ ) {  
  16.     my $this = shift;  
  17.     my ($value, $code) = @_;  
  18.  
  19.     if ( defined $code and $code eq 'ucs2' ){  
  20.         from_to( $value, 'ucs2''gb2312' );  
  21.     }  
  22.     return $value;  
  23. }  
  24.   

이렇게 유추하면 모든 로컬 언어 인코딩을 처리할 수 있다.excel을 쓰면 이게 더 간단해요.

  
  
  
  
  1. use strict;  
  2. use warnings;  
  3.  
  4. use Spreadsheet::WriteExcel;  
  5.  
  6. my $workbook = new Spreadsheet::WriteExcel( 'foo.xls' );  
  7. my $worksheet = $workbook->add_worksheet( T(' ') );  
  8.  
  9. $worksheet->write( 0, 0, T(' ') ); 

보시다시피 완전히perldoc 문서의 예를 베낀 것입니다.다만, T('세상 안녕하세요')는 좀 이상해 보일 뿐이다.사실 이것은 사용자 정의 함수입니다.

  
  
  
  
  1. use Encode qw(decode);  
  2.  
  3. sub T {  
  4.     my $text = shift;  
  5.  
  6.     return decode( 'gb2312', $text );  

이름은 당연히 T라고 부르지 않고 다른 이름으로 불러도 된다.전체 코드는 다음과 같습니다.

  
  
  
  
  1. use strict;  
  2. use warnings;  
  3.  
  4. use Spreadsheet::WriteExcel;  
  5. use Encode qw(decode);  
  6.  
  7. my $workbook = new Spreadsheet::WriteExcel( 'foo.xls' );  
  8. my $worksheet = $workbook->add_worksheet( T(' ') );  
  9.  
  10. $worksheet->write( 0, 0, T(' ') );  
  11.  
  12. sub T {  
  13.     my $text = shift;  
  14.  
  15.     return decode( 'gb2312', $text );  

마지막으로 한 가지 요약: 요점은 하나입니다. excel에 저장된 것은utf8 인코딩일 뿐입니다. 중국어 버전의 윈도우즈 컨트롤러와 다른 일부 소프트웨어는 gb2312 인코딩을 사용하지 않았습니다. 어떤 친구들은 tk 응용 프로그램이나 mysql 응용 프로그램에서 위의 코드를 사용했지만 여전히 혼란스러운 코드를 보았습니다. 그것은 tk와 mysql의 인코딩을 이해하지 못했기 때문에 위의 방법도 만능이 아닙니다.만능적인 방법은 모든 정보 흐름의 인코딩 방안을 분명히 하고 사고방식을 철저히 이해하는 것이다.

좋은 웹페이지 즐겨찾기