2013-10-01 98 views
8

我使用Spreadsheet::ParseExcel如下从细胞使用Perl从Excel电子表格

my $FileName = "../excel.xls"; 
my $parser = Spreadsheet::ParseExcel->new(); 
my $workbook = $parser->parse($FileName); 

和阅读价值这样

$product = $worksheeto->get_cell($row, 0)->value(); 

的问题是要分析Excel电子表格文件中读取法语字符如果有法文字符,例如à,则显示为ò

为了确保那里有我在解析没什么错误我用

print unpack('H*', $product) . "\n"; 

所以,当我使用任何网上十六进制字符串转换器我得到了à

我也试过

à代替
use utf8; 
binmode(STDOUT, ":utf8"); 

我得到

是否有一种方式来获得正确的字符?

回答

7

尝试解析文件有格式,例如Spreadsheet::ParseExcel::FmtUnicode

use Spreadsheet::ParseExcel; 
use Spreadsheet::ParseExcel::FmtUnicode; 
#use Spreadsheet::ParseExcel::FmtJapan; 

my $FileName = '../excel.xls'; 
my $parser = Spreadsheet::ParseExcel->new();    
my $formatter = Spreadsheet::ParseExcel::FmtUnicode->new(); 
my $workbook = $parser->parse($FileName,$formatter); 

也尝试FmtJapan,因为documentation says电子表格:: ParseExcel的:: FmtJapan格式也支持Unicode。如果遇到默认格式化程序的任何编码问题,请尝试使用。

*更新: 我自己在希腊字符的xls文件中尝试过它,但它没有与FmtUnicode或FmtJapan都无法使用。然后我发现perlmonks post,使用提供的My::Excel::FmtUTF8模块,并在使用$cell->value()打印单元格的值时成功工作。

+1

我试过'FmtJapan',但没有工作,我没有使用'FmtUnicode',认为它是默认的,我现在就试一试并告诉你结果。 – Mugiwara

+1

默认情况下是'FmtDefault' – psxls

+1

是的你是对的,但即使使用'FmtUnicode'我也会得到与'binmode(STDOUT,“:utf8”)相同的输出;'这意味着'├'',问题是我我将它传递给另一个函数需要'à':/ – Mugiwara

2

我试过你所描述的,并且这个工作正常,一旦启用了utf-8输出。我猜你可能有一个奇怪的excel文件(你应该在某个地方发布一个例子),或者你的终端配置不好。

处理字符集问题很难,因为你的终端可以让我困惑你。因此,将输出传输到'od -c'来查看你所得到的结果总是一个好主意。在我的剧本我从一个电子表格这段文字我已经躺在附近:

Value  = Descripción 

当我把它管道外径:

0000000 V a l u e        =  D e 
0000020 s c r i p c i 303 263 n \n 

我可以看到o是两个字节长,这表明是UTF-8。为了确保,你可以问的iconv从预期输出的字符集转换,无论你使用的是在你的终端:

iconv -f utf-8 

如果输入的是不正确的UTF-8将在你和/或输出树皮甚至怪物垃圾。