PDK 打包后 读excel 的解决方案

在网上搜到一个帖子,很有价值:http://bbs.chinaunix.net/thread-1626493-1-2.html

在这里原贴复制过来,版权归FLW所有:

老有人问我 excel 中文乱码的问题,
我平时很少接触这一块,
每次都得从头研究,
现在把结论记录在这里,以做备忘。


读:

  1. use strict;
  2. use warnings;

  3. use Spreadsheet::ParseExcel;
  4. use MyExcelFormatter;

  5. my $file = 'foo.xls';

  6. my $fmt = new MyExcelFormatter();

  7. my $xls = Spreadsheet::ParseExcel::Workbook->Parse( $file, $fmt );
  8. my @workSheet = @{ $xls->{Worksheet} };
  9. foreach my $sheet ( @workSheet ){
  10.     my $sheetName = $sheet->get_name();
  11.     print "工作表: $sheetName\n";

  12.     my ( $minRow, $maxRow ) = $sheet->row_range();
  13.     my ( $minCol, $maxCol ) = $sheet->col_range();

  14.     foreach my $row ( $minRow .. $maxRow ){
  15.         foreach my $col ( $minCol .. $maxCol ){
  16.             my $cell = $sheet->get_cell( $row, $col );
  17.             next unless $cell;
  18.             print " ($row,$col) ", $cell->value;
  19.         }
  20.         print "\n";
  21.     }
  22. }
复制代码
基本上上面这段代码就是从 Spreadsheet: arseExcel 的文档里抄来的。
除了 my $fmt = new MyExcelFormatter(); 这一行之外。
这一行生成了一个文档内容的转换器(格式化工具),
转换器代码如下:
  1. package MyExcelFormatter;

  2. use strict;
  3. use warnings;

  4. use base qw(Spreadsheet::ParseExcel::FmtDefault);

  5. use Encode::CN;
  6. use Encode qw(from_to);

  7. sub new() {
  8.     return bless {};
  9. }

  10. sub TextFmt( $;$ ) {
  11.     my $this = shift;
  12.     my ($value, $code) = @_;

  13.     if ( defined $code and $code eq 'ucs2' ){
  14.         from_to( $value, 'ucs2', 'gb2312' );
  15.     }
  16.     return $value;
  17. }

  18. 1;
复制代码
如法炮制以此类推,可以处理所有本地语言编码。

==================== 华丽的分割线 ====================================

写 excel,这个就更简单了:
  1. use strict;
  2. use warnings;

  3. use Spreadsheet::WriteExcel;

  4. my $workbook = new Spreadsheet::WriteExcel( 'foo.xls' );
  5. my $worksheet = $workbook->add_worksheet( T('世界你好') );

  6. $worksheet->write( 0, 0, T('干啥呢') );
复制代码
大家可以看到,完全就是抄 perldoc 文档里的例子的。
只不过,T( '世界你好' ) 看上去有点乖乖地罢了。
其实这是一个自定义函数:
  1. use Encode qw(decode);

  2. sub T {
  3.     my $text = shift;

  4.     return decode( 'gb2312', $text );
  5. }
复制代码
名字当然也可以不叫 T,叫别的也行。
完整的代码如下:
  1. use strict;
  2. use warnings;

  3. use Spreadsheet::WriteExcel;
  4. use Encode qw(decode);

  5. my $workbook = new Spreadsheet::WriteExcel( 'foo.xls' );
  6. my $worksheet = $workbook->add_worksheet( T('世界你好') );

  7. $worksheet->write( 0, 0, T('干啥呢') );

  8. sub T {
  9.     my $text = shift;

  10.     return decode( 'gb2312', $text );
  11. }
复制代码
================= 倒霉的分割线 =============================
最后再来个总结:
要点只有一个:excel 里保存的是且只能是 utf8 编码,而简体中文版的 windows 控制台和其它一些软件缺省显示的是 gb2312 编码
有些朋友在 tk 应用或者 mysql 应用中用了上面的代码,仍然看到乱码,
那是因为你没有搞明白 tk 和 mysql 的编码,所以上面的办法也不是万能的。
万能的办法就是搞清楚每个信息流的编码方案,彻底把思路搞明白了。

2011.11.06 增补:
Spreadsheet::WriteExcel 已死,Excel::Writer::XLSX 当立
http://perlbuzz.com/2011/10/spre ... xcelwriterxlsx.html

----------------------------------------- 帖子--------------------------------------------------------------------结束------------------------------------------------------------------------

我把MyExcelFormatter.pm 文件 copy 到 perl/lib下,也可以copy到 perl/site/lib, 要保证 PDK 能找到,

然后 perlapp --add myexcelformatter xx.pl

这样就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值