用 Spreadsheet::ParseExcel处理中文excel文件
Spreadsheet::ParseExcel
Unicode::Map
IO-stringy
OLE-Storage_Lite
其中IO-stringy,OLE-Storage_Lite为运行的必要包
Spreadsheet::ParseExcel是解析Excel的必要程序
Unicode::Map为完全支持中文的字符集转换包
中文 excel 处理需要稍微多做一步
用 Spreadsheet::ParseExcel::FmtUnicode 指定 Unicode_Map 为 CP936
然后直接调用 Parse 方法就行了
返回值是一个关键数组 内容就是 excel 文件的内容
如
$oBook->{File} 是文件名
$oBook->{SheetCount} 是sheet个数
$oBook->{Worksheet}[0]->{Name} 是第一个 sheet 的名字
$oBook->{Worksheet}[1]->{MaxRow} 是第二个 sheet 的最大行
$oBook->{Worksheet}[2]->{Cells}[1][0]->{Val} 是第三个 sheet 的第二行第一列的值
$oBook->{Worksheet}[2]->{Cells}[1][0]->Value 是第三个 sheet 的第二行第一列的转化后的中文值
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtUnicode;
my $oExcel = new Spreadsheet::ParseExcel;
my $oCode = "CP936";
my $oFmtJ = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map => $oCode);
my $oBook = $oExcel->Parse($excelFile, $oFmtJ);
然后根据情况 循环sheet 行/row 列/column 处理就行了.
#==================================================
Demo
#!/usr/bin/perl -w
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtUnicode;
use Encode qw /from_to/;
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];
my $val = $oWkC->Value;
$val =~ s/\s+//ig;
from_to( $val, "CP936", "utf8" );
#print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC);
print "( $iR , $iC ) =>", $val, "\n" if ($oWkC);
}
}
}