博客首页 注册 建议与交流 排行榜 加入友情链接         宝宝相册的专门空间
推荐 投诉 搜索: 帮助

沉默是金

Love exists,Hope is alive.Just waiting...
   xiaoquqi.cublog.cn
关于作者  
姓名:小曲奇
职业:软件工程师
年龄:25
位置:北京
Just waiting your comming...

我的分类  




用Perl读取Excel&&中文显示乱码的解决
由于客户提出的变态要求,要求用perl解析Excel,经过一天半的努力,完全解决了perl解析Excel单元格中的含中文显示为乱码的问题。
【特别注释】
1、测试在windows环境下测试成功,测试的excel版本为2000,2003。
unix下测试不成功,显示中文仍然为乱码。数字正常。
2、分别用以下方法分别解析3M和7M的Excel文件。
Windows环境下3M文件(1个Sheet4000行左右数据 20列左右)解析的时间为2分47秒,10M文件由于解析时间过长,中途停止。
Unix工作站上解析7M Excel文件。CPU符合高达98.5%,内存达到500M,运行了7分钟没有完成。
由此观察,这个模块在使用上还是要相当谨慎的。
 
 
需要用的模块:
Spreadsheet::ParseExcel
Unicode::Map
IO-stringy
OLE-Storage_Lite
 
其中IO-stringy,OLE-Storage_Lite为运行的必要包
Spreadsheet::ParseExcel是解析Excel的必要程序
Unicode::Map为完全支持中文的字符集转换包
 
完整源代码如下:
#!/usr/bin/perl -w
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtUnicode;
my $oExcel = new Spreadsheet::ParseExcel;
die "You must provide a filename to $0 to be parsed as an Excel file" unless @ARGV;
 
#set for charactor
my $oFmtC = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>"CP936");
my $oBook = $oExcel->Parse($ARGV[0],$oFmtC);
my($iR, $iC, $oWkS, $oWkC);
print "FILE  :", $oBook->{File} , "\n";
print "COUNT :", $oBook->{SheetCount} , "\n";
print "AUTHOR:", $oBook->{Author} , "\n"
 if defined $oBook->{Author};
for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++)
{
 $oWkS = $oBook->{Worksheet}[$iSheet];
 print "--------- SHEET:", $oWkS->{Name}, "\n";
 for(my $iR = $oWkS->{MinRow} ;
     defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ;
     $iR++)
 {
  for(my $iC = $oWkS->{MinCol} ;
      defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ;
      $iC++)
  {
   $oWkC = $oWkS->{Cells}[$iR][$iC];
   print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC);
  }
 }
}

 发表于: 2006-03-03,修改于: 2006-03-09 13:58 已浏览1356次,有评论0条 推荐 投诉

  网友评论

  发表评论



Copyright © 2001-2006 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
页面生成时间:0.05871

京ICP证041476号