亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
123下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 35273 | 回復(fù): 25
打印 上一主題 下一主題

中文 Excel 讀寫終級(jí)解決方案 [復(fù)制鏈接]

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-12-10 11:10 |只看該作者 |倒序?yàn)g覽
本帖最后由 flw 于 2011-11-06 16:34 編輯

老有人問(wèn)我 excel 中文亂碼的問(wèn)題,
我平時(shí)很少接觸這一塊,
每次都得從頭研究,
現(xiàn)在把結(jié)論記錄在這里,以做備忘。


讀:
  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. }
復(fù)制代碼
基本上上面這段代碼就是從 Spreadsheet:arseExcel 的文檔里抄來(lái)的。
除了 my $fmt = new MyExcelFormatter(); 這一行之外。
這一行生成了一個(gè)文檔內(nèi)容的轉(zhuǎn)換器(格式化工具),
轉(zhuǎn)換器代碼如下:
  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;
復(fù)制代碼
如法炮制以此類推,可以處理所有本地語(yǔ)言編碼。

==================== 華麗的分割線 ====================================

寫 excel,這個(gè)就更簡(jiǎn)單了:
  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('干啥呢') );
復(fù)制代碼
大家可以看到,完全就是抄 perldoc 文檔里的例子的。
只不過(guò),T( '世界你好' ) 看上去有點(diǎn)乖乖地罷了。
其實(shí)這是一個(gè)自定義函數(shù):
  1. use Encode qw(decode);

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

  4.     return decode( 'gb2312', $text );
  5. }
復(fù)制代碼
名字當(dāng)然也可以不叫 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. }
復(fù)制代碼
================= 倒霉的分割線 =============================
最后再來(lái)個(gè)總結(jié):
要點(diǎn)只有一個(gè):excel 里保存的是且只能是 utf8 編碼,而簡(jiǎn)體中文版的 windows 控制臺(tái)和其它一些軟件缺省顯示的是 gb2312 編碼
有些朋友在 tk 應(yīng)用或者 mysql 應(yīng)用中用了上面的代碼,仍然看到亂碼,
那是因?yàn)槟銢](méi)有搞明白 tk 和 mysql 的編碼,所以上面的辦法也不是萬(wàn)能的。
萬(wàn)能的辦法就是搞清楚每個(gè)信息流的編碼方案,徹底把思路搞明白了。

2011.11.06 增補(bǔ):
Spreadsheet::WriteExcel 已死,Excel::Writer::XLSX 當(dāng)立
http://perlbuzz.com/2011/10/spre ... xcelwriterxlsx.html

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-12-10 11:20 |只看該作者
good

論壇徽章:
78
雙子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06獅子座
日期:2013-10-18 13:40:31雙子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56處女座
日期:2013-10-24 17:15:30雙子座
日期:2013-10-25 13:49:39午馬
日期:2013-10-28 15:02:15
3 [報(bào)告]
發(fā)表于 2009-12-10 11:20 |只看該作者
哇  老大出馬啊  中文確實(shí)很煩人

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-12-10 11:22 |只看該作者
老大的示例都是精品~贊一個(gè)

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
5 [報(bào)告]
發(fā)表于 2009-12-10 11:24 |只看該作者
原帖由 yybmsrs 于 2009-12-10 11:20 發(fā)表
哇  老大出馬啊  中文確實(shí)很煩人

我一點(diǎn)都不覺(jué)得煩人,
我覺(jué)得這是檢驗(yàn)自己知識(shí)的一個(gè)機(jī)會(huì)。

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-12-10 11:28 |只看該作者
頂一個(gè)。

論壇徽章:
1
獅子座
日期:2013-12-16 16:09:24
7 [報(bào)告]
發(fā)表于 2009-12-10 12:13 |只看該作者
見(jiàn)老大mark

中文確實(shí)"煩人"啊,上個(gè)世紀(jì)gb2312和big5車不清楚,現(xiàn)在還有utf-8和gbk各占半邊天,這段恩怨已經(jīng)跨過(guò)10個(gè)年頭了

[ 本帖最后由 ttcn_cu 于 2009-12-10 12:14 編輯 ]

論壇徽章:
1
2015亞冠之塔什干火車頭
日期:2015-07-13 12:36:28
8 [報(bào)告]
發(fā)表于 2009-12-10 12:25 |只看該作者
very Good,收藏啦~

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2009-12-10 14:00 |只看該作者
收藏,學(xué)習(xí)!

論壇徽章:
1
丑牛
日期:2015-01-07 15:25:00
10 [報(bào)告]
發(fā)表于 2009-12-10 14:31 |只看該作者
好,好好學(xué)習(xí)一下~
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP