免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7075 | 回复: 10

求助,处理excel表格处理中文字符 [复制链接]

论坛徽章:
0
发表于 2014-03-18 16:43 |显示全部楼层
30可用积分
excel.rar (5.01 MB, 下载次数: 8)

最佳答案

查看完整内容

回复 3# dahe_1984 我在那个帖子回复你了…… 其实用EXCEL2007很爽,因为EXCEL2007采用UTF-8保存特殊字符,兼容ASCII不用考虑编码产生交集导致的辨别问题。以下代码只适用EXCEL2007生成b.xlsx的结果 另外read模块和write的模块在行和列的引用值上略有不同read模块从1开始算write模块的函数从0开始算。

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-03-18 16:43 |显示全部楼层
本帖最后由 523066680 于 2014-03-18 21:58 编辑

回复 3# dahe_1984


     我在那个帖子回复你了……  
其实用EXCEL2007很爽,因为EXCEL2007采用UTF-8保存特殊字符,兼容ASCII
不用考虑编码产生交集导致的辨别问题。

以下代码只适用EXCEL2007
  1. use Spreadsheet::Read;
  2. use Excel::Writer::XLSX;
  3. use Encode;

  4. my ($i,$j,$col,$row,$value);
  5. my @arr;

  6. # Read
  7. my $book  = ReadData ("a.xlsx");
  8. foreach $col (1..3) {                 #列
  9.     foreach $row (1..4) {             #行
  10.         $arr[$col-1][$row-1] = $book->[1]{cell}[$col][$row];
  11.     }
  12. }

  13. # Write
  14. my $workbook = Excel::Writer::XLSX->new('b.xlsx');
  15. my $worksheet = $workbook->add_worksheet();
  16. foreach $col (0..$#arr) {
  17.     foreach $row (0..$#{$arr[0]}) {
  18.         $worksheet->write(
  19.             $row,
  20.             $col,
  21.             decode('utf-8',$arr[$col][$row])
  22.         );
  23.         #这边写的时候$col 和 $row参数的使用位置和前面Read模块相反
  24.     }
  25. }
  26. $workbook->close();
复制代码
α-alpha

BcefeB2
中文test
C三

生成b.xlsx的结果
α-alpha

BcefeB2
中文test
C三



另外read模块和write的模块在行和列的引用值上略有不同
read模块从1开始算
write模块的函数从0开始算。

论坛徽章:
0
发表于 2014-03-18 16:49 |显示全部楼层
把包含相同catalog的数据在products中去掉。

就是products - amber (按照catalog判断)= 新表。

论坛徽章:
0
发表于 2014-03-18 18:44 |显示全部楼层
又没人了又没人了又没人了又没人了又没人了又没人了又没人了又没人了又没人了又没人了又没人了又没人了

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-03-18 22:08 |显示全部楼层
本帖最后由 523066680 于 2014-03-18 22:15 编辑

临时学一下VBA也许是个不错的方法。
我刚刚试着录制宏并删除一整行表格,录制的宏只用了下面两句话就实现了删除+后面表格上移的操作

    Rows("50:50").Select
    Selection.Delete Shift:=xlUp

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-03-18 23:16 |显示全部楼层
本帖最后由 523066680 于 2014-03-18 23:21 编辑

回复 2# dahe_1984


      我找到针对你这个表格的辨别方法了(如果一定要在EXCEL2003处理的话……),
几乎确定在这个表格中超出ASCII范围的字符都是和 ASCII 字符在一起的,也就是像
"α"这样的字符并不会单独存在。这个时候ASCII 字符一定会被转换为 00 ??的两个
节形式只要判断字节流中有0就必定是UTF-16BE。

完整的处理代码你自己写了,判断部分我写个例子吧
把Product Full_2014_03_02.xls表格第二列复制到新表单独做了测试
  1. use Spreadsheet::Read;
  2. use Spreadsheet::WriteExcel;
  3. use Encode;

  4. # for read
  5. my $book  = ReadData ("Product Full_2014_03_03.xls");

  6. my ($col,$row);
  7. my $value;

  8. # for write
  9. my $workbook=Spreadsheet::WriteExcel->new('b.xls');
  10. my $worksheet = $workbook->add_worksheet();

  11. foreach $col (1..1) {
  12.     foreach $row (1..65536) {
  13.         $value  = $book->[1]{cell}[$col][$row];
  14.         if (defined $value) {
  15.             if (isASCII($value)) {
  16.                 $worksheet->write($row-1,0,$value);
  17.             } else {
  18.                 $worksheet->write($row-1,0,decode('utf16-BE',$value));
  19.             }
  20.         } else {
  21.             print "Line of $row is empty\n";
  22.         }
  23.     }
  24. }
  25. $workbook->close();

  26. sub isASCII {
  27.     for my $v ( split(//,$_[0]) ) {
  28.         return 0 if (ord($v) == 0);
  29.     }
  30.     return 1;
  31. }
复制代码

论坛徽章:
0
发表于 2014-03-18 23:20 |显示全部楼层
牛啊,谢谢你啊

论坛徽章:
0
发表于 2014-03-18 23:37 |显示全部楼层
回复 4# 523066680


上个帖子你说的我明白,现在的问题是一个cell中可能有中英文混合的,比如dfadfds(432432)(432),里面既有中文的括号,又有英文的字符,装成中文英文字符也跟着变化了

   

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-03-18 23:46 |显示全部楼层
本帖最后由 523066680 于 2014-03-18 23:47 编辑

回复 8# dahe_1984


    六楼的代码可以解决混合的问题。不混合反而不好判断,比如只有两个字的时候,
比如“中文”可以被判断为4个ASCII字符。

    对比测试结果的时候发现你提供的范本中
product 工作表 824行 有一行 Benzenepropanoic acid, 是双字节的=_= 不过导出的结果还算正确。

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2014-03-18 23:57 |显示全部楼层
本帖最后由 523066680 于 2014-03-19 00:07 编辑

我筛选出了导出后不能完全匹配的结果,你参考一下吧,还真有个单元格是全中文的:

筛选对比.rar (1.43 MB, 下载次数: 8)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP