python操作excel表格(xlrdxlwt)以及表格的修改
(OpenPyXL)
python操作excel主要⽤到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。
需要安装这2个库,安装的⽅式有多重可以直接使⽤pip安装(根据⾃⼰的需求安装):
如pip安装
pip3 install xlrd
pip3 install xlwt
读excel-->xlrdpython怎么读入excel
⾃⼰先建⼀个excel表格内容如下:
有上⾯的Excel表格知道⾥⾯有2个sheet,其中第⼀个sheet1有内容,sheet2没有内容
下⾯是关于python对Excel读的基本操作:
import xlwt, xlrd
from datetime import date, datetime
# 打开excel⽂件,创建⼀个workbook对象,book对象也就是fruits.xlsx⽂件,表含有sheet名
workbook = xlrd.open_workbook(r'C:\Users\PC\Desktop\sss.xlsx')
print(workbook.sheet_names()) # 得到⼀个列表⾥⾯的元素就是sheet的名字
# 上⾯执⾏的结果为['Sheet1', 'Sheet2']
print(workbook.sheets()) # 得到的是⼀个列表⾥⾯的元素就是每⼀个sheet对象
# 上⾯执⾏的结果为[<xlrd.sheet.Sheet object at 0x0000019BB9D915C0>, <xlrd.sheet.Sheet object at 0x0000019BB9D91128>] sheet_name = workbook.sheet_names()[0] # 从零开始,取第⼀个sheet的名字
sheet_obj = workbook.sheets()[0] # 从零开始取第⼀个sheet对象
print(sheet_name, sheet_obj)
# 上⾯执⾏的结果为:Sheet1 <xlrd.sheet.Sheet object at 0x000001E620A7CBE0>
# 根据sheet索引或者名称获取sheet内容
rsheet = workbook.sheet_by_index(0) # 取第⼀个⼯作簿根据索引
rsheet_name = workbook.sheet_by_name(sheet_name) # 根据sheet的名字取第⼀个⼯作簿
print('rsheet_index', rsheet)
print('rsheet_name', rsheet_name)
# 获取总⾏数,列数和名字根据sheet的内容也就是上⾯的rsheet或者rsheet_name
ws, ls, rsheet.name)
rows = ws
# 获取总列数
cols = ls
# sheet名称
sheet_name = rsheet.name
# 获取整⾏和整列的值
rows2_values = w_values(1) # 获取第⼆⾏内容,得到的是⼀个列表
cols3_values = l_values(2) # 获取第三列内容,得到的是⼀个列表
print(rows2_values, cols3_values)
# ['⼩杰', 23.0, 33919.0, '键盘', '朋友'] ['出⽣⽇期', 33919.0, 33920.0, 33921.0, 33922.0, 33923.0, '暂⽆']
# 通过cell的位置坐标取得cell值的⼏种⽅式
print('获取第⼆⾏第⼀列的值', ll(1, 0).value)
print('获取第⼆⾏第⼀列的值', ll_value(1, 0))
print('获取第⼆⾏第⼀列的值', w(1)[0].value)
# 获取单元格内容的数据类型
ll(1, 0).ctype)
View Code
运⾏结果如下
可以看到上⾯的⽇期这⾥列在表格中明明写的是⽇期在这⾥是浮点数。那让我们来解决这⼀个问题:
1、python读取excel中单元格内容为⽇期的⽅式
python读取excel中单元格的内容返回的有5种类型,即上⾯例⼦中的ctype:
ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
即date的ctype=3,这时需要使⽤xlrd的xldate_as_tuple来处理为date格式,
先判断表格的ctype=3时xldate才能开始操作。继续上⾯的代码:
# 关于单元格⾥⾯时间格式的转换
ll(2, 0).ctype) # 结果为1(字符)
ll(2, 1).ctype) # 结果为2(数字)
ll(2, 2).ctype) # 结果为3(⽇期)
ll(2, 3).ctype) # 结果为1(字符)
ll(2, 4).ctype) # 结果为0(空值) 这个是因为合并单元格的原因
ll(2, 2).value) # 打印的是⼀个浮点数
# 结果为 33920.0
print(xlrd.xldate_as_ll(2, 2).value, workbook.datemode)) # 转化为⼀个我们能够看得懂的元组# 结果为 (1992, 11, 12, 0, 0, 0)
date_tuple = xlrd.xldate_as_ll(2, 2).value, workbook.datemode)
date_time = date(*date_tuple[:3]).strftime('%Y/%m/%d') # 转换为正常的⽇期格式
print(date_time)
# 1992/11/12
# 有上⾯我们可以简单地判断是不是时间如果是时间就做转换
row = 2 # 这个可以改成你想要的⾏数
col = 2 # 这个可以改成你想要的列数
if (ll(row, col).ctype == 3):
date_value = xlrd.xldate_as_ll_value(rows, col), workbook.datemode)
date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
那么问题⼜来了,上⾯ ll(2,4).ctype 返回的值是0,说明这个单元格的值是空值,明明是合并的单元格内容"好朋友",这个是我觉得这个包功能不完善的地⽅,如果是合并的单元格那么应该合并的单元格的内容⼀样,但是它只是合并的第⼀个单元格的有值,其它的为空。
2、读取合并单元格的内容:
这个是真没技巧,只能获取合并单元格的第⼀个cell的⾏列索引,才能读到值,读错了就是空值。
即合并⾏单元格读取⾏的第⼀个索引,合并列单元格读取列的第⼀个索引,如上述,读取⾏合并单元格"好朋友"和读取列合并单元格"暂⽆"只能如下⽅式:
# 关于合并单元格⾥⾯⾥⾯的空值
# 如:
ll(2, 4).ctype) # 结果为0(空值) 这个是因为合并单元格的原因
# 明明这⾥是合并单元格应该显⽰好朋友的
# 读取合并单元格的内容
l_values(4)[1]) # 结果为朋友
l_values(4)[2]) # 这个是合并的⾏如果读取就是空值
w_values(6)[2]) # 结果为暂⽆
w_values(6)[3]) # 这个是合并的列如果读取就是空值
d_cells)
# 结果为[(6, 7, 2, 5), (1, 3, 4, 5), (3, 6, 4, 5)]
# 上⾯的的(6, 7, 2, 5)这个元组⾥⾯的元素分别为(row,row_range,col,col_range)
# (row,row_range)表⽰为包含row但是不包含row_range。上⾯可以解读为
# 因为是从零开始计数的所以可以这样说第七⾏(数字为6)的第三列(数字为2)到第五列(数字为4)合并
# 有上⾯的规律我们可以使⽤以下⽅式获取合并单元格的内容
# 这样我们就可以使⽤以下的⽅式获取合并的单元格的信息,
merge = []
for (rlow, rhigh, clow, chigh) d_cells:
merge.append([rlow, clow])
for index in merge:
ll_value(index[0], index[1]))
# 有上⾯我们知道列合并我们可以看到该⾏的合并的第⼀列的内容就是合并列的内容其他的就不是这个内容。
# 为了准确的获得合并单元格的内容我们可以使⽤上⾯的⽅式获得
写excel-->xltw
#!/usr/bin/env python
# -*-coding:utf-8-*-
import xlwt, xlrd
f = xlwt.Workbook() # 创建⼀个⼯作簿
sheet1 = f.add_sheet('sheet1', cell_overwrite_ok=True) # 创建sheet
row0 = ["姓名", "年龄", "出⽣⽇期", "爱好"]
column0 = ["张三", "李四", "王五"]
# ⽣成第⼀⾏
for i in range(0, len(row0)):
sheet1.write(0, i, row0[i]) # 第⼀个参数表⽰的是⾏,第⼆个参数表⽰的列,第三个表⽰的是数据
for i in range(0, len(column0)):
sheet1.write(i + 1, 0, column0[i])
# 给第⼆⾏的⼈物加信息
sheet1.write(1, 1, 23)
sheet1.write(1, 2, '1993/04/22')
sheet1.write(1, 3, '⾜球')
f.save('test.xls')
上⾯这个只是写⼊⼀个新的不能够对已有的Excel表格进⾏修改
OpenPyXL
由于xlrd不能对已存在的xlsx⽂件,进⾏修改!所以必须使⽤OpenPyXL
OpenPyXL:较好的⽀持对xlsx⽂件的修改,功能⽐较强⼤,适⽤于需要处理XLSX⽂件,需要修改XLSX⽂件中的值,最后⽣成xlsx。openpyxl(可读写excel表)专门处理Excel2007及以上版本产⽣的xlsx⽂件,xls和xlsx之间转换容易
注意:如果⽂字编码是“gb2312” 读取后就会显⽰乱码,请先转成Unicode。
官⽹上最推荐的是openpyxl:
综上,所以选择使⽤OpenPyX来做⼀个修改excel的⼩程序。
1、OpenPyXL模块的安装
pip3 install OpenPyXL
2、快速实现xlsx⽂件的单元格修改
举例:增加⼀列地区,并增加相应的值,并且修改某⼀个⼈的出⽣⽇期
from openpyxl import load_workbook
# excel⽂件绝对路径
file_home = r'C:\Users\PC\Desktop\sss.xlsx'
wb = load_workbook(filename=file_home) # 打开excel⽂件
sheet_ranges = wb['Sheet1']
print(sheet_ranges['A1'].value) # 打印A1单元格的值
ws = wb['Sheet1'] # 根据Sheet1这个sheet名字来获取该sheet
# 添加⼀栏为地区,并且给上数据
ws["F1"] = '地区'# 修改C1的值为LJK5679842
ws['F2'] = '湖北'
ws['F3'] = '云南'
ws['F4'] = '湖南'
ws['F5'] = '北京'
ws['F6'] = '江苏'
# 修改⼩明的出⽣⽇期
ws['c3'] = '1991/11/12'
wb.save(file_home) # 保存修改后的excel
执⾏前的excel表格
执⾏后的Excel表格
可以看到上⾯增加和修改的数据。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论