Python 处理带中文 Excel 文件

[TOC](Python 处理带中文 Excel 文件)

Python-Excel常规操作

安装库

$ pip3 install xlrd xlwt xlutils

安装比较简单,直接用 pip 工具安装三个库即可,安装命令如下:

安装完成提示 Successfully installed xlrd-1.2.0 xlutils-2.0.0 xlwt-1.3.0 即表示安装成功。

写入 Excel

接下来我们就从写入 Excel 开始,话不多说直接看代码如下:

# excel_w.py

# 导入 xlwt 库
import xlwt

# 创建 xls 文件对象
wb = xlwt.Workbook()

# 新增两个表单页
sh1 = wb.add_sheet('成绩')
sh2 = wb.add_sheet('汇总')

# 然后按照位置来添加数据,第一个参数是行,第二个参数是列
# 写入第一个sheet
sh1.write(0, 0, '姓名')
sh1.write(0, 1, '成绩')
sh1.write(1, 0, '张三')
sh1.write(1, 1, 88)
sh1.write(2, 0, '李四')
sh1.write(2, 1, 99.5)

# 写入第二个sheet
sh2.write(0, 0, '总分')
sh2.write(1, 0, 187.5)

# 最后保存文件即可
wb.save('test_w.xls')

读取 Excel

测试文件

Python 处理带中文 Excel 文件_第1张图片
Python 处理带中文 Excel 文件_第2张图片

# excel_r.py

# 导入 xlrd 库
import xlrd

# 打开刚才我们写入的 test_w.xls 文件
wb = xlrd.open_workbook("test_w.xlsx")

# 获取并打印 sheet 数量
print("sheet 数量:" + str(wb.nsheets))

# 获取并打印 sheet 名称
# Python 编码问题,需要单独输出
print( "sheet 名称如下:")
for i in wb.sheet_names():
    print i
lis = (1)

# 根据 sheet 索引获取内容
sh1 = wb.sheet_by_index(0)
# 或者也可根据 sheet 名称获取内容
# sh = wb.sheet_by_name('成绩')

# 获取并打印该 sheet 行数和列数
# print( u"sheet" + str(sh1.name) + "共" + str(sh1.nrows) + "行" +str(sh1.ncols)+ "列")
print ("sheetName:") 
print (sh1.name)
print ("行数:")
print (sh1.nrows)
print ("列数:")
print (sh1.ncols)

# 获取并打印某个单元格的值
print ("第一行第二列的值为:")
print (sh1.cell_value(0, 1))

# 获取整行或整列的值
rows = sh1.row_values(0) # 获取第一行内容
cols = sh1.col_values(1) # 获取第二列内容

# 打印获取的行列值
print ("第一行的值为:")
for i in rows:
    print (i)
print ("第二列的值为:")
for j in cols:
    print (j)

# 获取单元格内容的数据类型
print ("第二行第一列的值类型为:")
print (sh1.cell(1, 0).ctype)

# 遍历所有表单内容
# 遍历所有表单
for sh in wb.sheets():
    # 遍历所有行数
    for r in range(sh.nrows):
        # 遍历所有列数
        for l in range(sh.ncols):
            # 打印指定单元格内容
            print (sh.cell_value(r, l))

细心的朋友可能注意到,这里我们可以获取到单元格的类型,上面我们读取类型时获取的是数字1,那1表示什么类型,又都有什么类型呢?别急下面我们通过一个表格展示下:

数值 类型 说明
0 empty
1 string 字符串
2 number 数字
3 date 日期
4 boolean 布尔值
5 error 错误

通过上面表格,我们可以知道刚获取单元格类型返回的数字1对应的就是字符串类型。

处理中文

import xlrd
#import chardet
data = xlrd.open_workbook("emotion.xlsx")
table = data.sheets()[0]
nrows = table.nrows
for i in range(nrows):
#print chardet.detect(str(table.row_values(i)))
        print table.row_values(i)

可是这样在Linux Terminal 打印出来的是乱码,把打印语句改成:

 	print str(table.row_values(i)).decode("unicode_escape").encode("utf8")

为什么是这样? 可以从Ubuntu 的系统设置中看到,控制器显示的字符是UTF8的,所以最后需要encode成UTF8的,2.为什么要用decode? 因为要encode成UTF8,得是unicode格式的字符串才行,但是默认的字符串是str型的,所有需要把其他的字符编码转成UNICODE才行,然后,因为打印出来的乱码是. u’\XXX’ 这种形式, 所以根据经验应该是unicode_escape形式。

Ref

  1. Python 操作 Excel
  2. 官方文档
  3. Python 处理中文 Excel
  4. ‘ascii’ codec can’t decode byte 0xef in position 0: ordinal not in range(128)
  5. Python——str字符串和unicode字符串
  6. 用python操作excel的强大工具:openpyxl(附上实例脚本)
  7. Python读写Excel表格,就是这么简单粗暴又好用

所遇到问题

  1. 使用了 pip3 install xlrd xlutils xlwt 安装扩展包,也使用 pip listpip3 list 指令均可以查找到此扩展包已被安装,但只能在 python2 中执行 import xlrd 指令,在 python3 中无法导入。
    暂未解决。
  2. Python 编码指令问题。读取 Excel 文件后,执行 print 打印出来的是 \xe6\x95\xb0\xe9\x87\x8fu'\u6210\u7ee9'
  3. ‘ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)

你可能感兴趣的:(Python,python,excel)