2013-10-01 95 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將在你和/或輸出樹皮甚至怪物垃圾。