python操作Excel的模块,网上提到的模块大致有:xlwings、xlrd、xlwt、openpyxl、pyxll等,他们提供的功能归纳起来有两种:一、用python读写Excel文件,实际上就是读写有格式的文本文件,操作excel文件和操作text、csv文件没有区别,Excel文件只是用来储存数据。二、除了操作数据,还可以调整Excel文件的表格宽度、字体颜色等。另外需要提到的是用COM调用Excel的API操作Excel文档也是可行的,相当麻烦基本和VBA没有区别
https://www.kancloud.cn/gnefnuy/xlwings-docs/1127474
import xlwings as xw
# 打开Excel程序,默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False
# 其他操作:
# app.screen_updating = False
# :屏幕更新,就是说代码对于excel的操作你可以看见,关闭实时更新可以加快脚本运行。默认是True。
# app.pid #App进程pid
# app.books #返回一个打开的全部workbook的列表。Python打开的和手动打开的是不互通的
# 终止进程,强制退出。
# app.quit() #不保存的情况下,退出excel程序
注意工作簿应该首先被打开
wb = app.books.add() #创建新的book
wk = xw.Book()
wk = xw.books.add()
# 支持绝对路径和相对路径
wb = app.books.open('filepath')
wk = xw.Book('filepath')
wk = xw.books.open('filepath')
# 练习的时候建议直接用下面这条
# wb = xw.Book('example.xlsx')
# 这样的话就不会频繁打开新的Excel
wk = xw.Book('Book1')
wk = xw.books['Book1'] #也可以使用索引
如果在两个Excel实例中打开了相同的文件,则需要完全限定它并包含应用程序实例。 您将通过xw.apps.keys()找到您的应用实例密钥(PID):
xw.apps[10559].books['FileName.xlsx']
查看所有的实例进程:
xw.apps.keys() #输出list
kill所有的实例进程:
for i in xw.apps.keys():
i = 'taskkill/pid ' + str(i) + ' -t -f'
os.system(i)
wb = xw.books.active
wb.save(path=None)
# 保存工作簿,若为指定路径,保存在当前工作目录。
wk.close() #在没有保存的情况下关闭。
app.quit()
# 可以用名字也可以用索引
sheet = xw.books['工作簿的名字'].sheets['sheet的名字']
sheet = xw.books['工作簿的名字'].sheets[0]
sheet = xw.sheets.active
book_name = sheet.book
sheet_cells = sheet.cells
sheet.name
# 返回所有的工作表特定名称。
sheet_names_list = sheet.names
sheet.charts
sheet.clear()
sheet.clear_contents()
sheet.delete()
sheet.index
wb.sheets.add(name=None, before=None, after=None)
#参数:name(str,default None) - 新工作表的名称。 如果为None,则默认为Excel的name.before (Sheet, default None) - 一个对象,指定在新工作表添加之前的added.after (Sheet, default None) - 指定工作表之后的工作表的对象 表格已添加。
sheet.autofit(axis=None)
# 参数:axis (string, default None) –要自动调整行, 使用以下之一: rows 或 r,要自动调整列, 使用以下之一: columns h c,要自动调整行和列, 不提供参数
app = xw.App(visible=False, add_book=False)
xls = app.books.open(excel_file)
sheet = xls.sheets[0]
info = sheet.used_range
nrows = info.last_cell.row
ncols = info.last_cell.colum
rng = xw.books['工作簿的名字'].sheets['sheet的名字']
# 或者
sheet=xw.books['工作簿的名字'].sheets['sheet的名字']
rng=sheet.range('A1')
# 注意Range首字母大写
rng=xw.Range('A1')
其中需要注意的是单元格的完全引用路径是:
# 第一个Excel程序的第一个工作薄的第一张sheet的第一个单元格
xw.apps[0].books[0].sheets[0].range('A1')
迅速引用单元格的方式是
sht=xw.books['名字'].sheets['名字']
# A1单元格
rng=sht[’A1']
rng=sht['a1']
# A1:B5单元格
rng=sht['A1:B5']
# 第一行的第一列即a1
rng=sht[0,0]
# B1单元格
rng=sht[0,1]
# A1:J10
rng=sht[:10,:10]
rng=sht.range('a1:a5')
#rng = sht['a1:a5']
#rng = sht[:5,0]
PS: 对于单元格也可以用表示行列的tuple进行引用
# A1单元格的引用
xw.Range(1,1)
#A1:C3单元格的引用
xw.Range((1,1),(3,3))
# 注意".value“
sht.range('A1').value=1
默认按行插入
# 将列表[1,2,3]储存在A1:C1中
sht.range('A1').value=[1,2,3]
# 等同于
sht.range('A1:A3').value = [1,2,3]
按列插入
# 将列表[1,2,3]储存在A1:A3中
sht.range('A1').options(transpose=True).value=[1,2,3]
多行输入就要用二维列表了
# 将2x2表格,即二维数组,储存在A1:B2中,如第一行1,2,第二行3,4
sht.range('A1').options(expand='table').value=[[1,2],[3,4]]
# 将A1的值,读取到a变量中
a=sht.range('A1').value
返回的值是列表形式,多行多列为二维列表,但有一点要注意,返回的数值默认是浮点数
#将A1到A2的值,读取到a列表中
a=sht.range('A1:A2').value
# 将第一行和第二行的数据按二维数组的方式读取
a=sht.range('A1:B2').value
读取excel的第一列,先计算单元格的行数
rng = sht.range('a1').expand('table')
nrows = rng.rows.count
接着就可以按准确范围读取了
a = sht.range(f'a1:a{nrows}').value
同理选取一行的数据也一样
ncols = rng.columns.count
#用切片
fst_col = sht[0,:ncols].value
# 新建工作簿
xw.books.add()
# 引用当前活动工作簿
xw.books.active
wb=xw.books[‘工作簿名称']
wb.activate()激活为当前工作簿
wb.fullname 返回工作簿的绝对路径
wb.name 返回工作簿的名称
wb.save(path=None) 保存工作簿,默认路径为工作簿原路径,若未保存则为脚本所在的路径
-wb. close() 关闭工作簿
代码例子:
# 引用Excel程序中,当前的工作簿
wb=xw.books.acitve
# 返回工作簿的绝对路径
x=wb.fullname
# 返回工作簿的名称
x=wb.name
# 保存工作簿,默认路径为工作簿原路径,若未保存则为脚本所在的路径
x=wb.save(path=None)
# 关闭工作簿
x=wb.close()
# 新建工作表
xw.sheets.add(name=None,before=None,after=None)
# 引用当前活动sheet
xw.sheets.active
# 引用某指定sheet
sht=xw.books['工作簿名称'].sheets['sheet的名称']
# 激活sheet为活动工作表
sht.activate()
# 清除sheet的内容和格式
sht.clear()
# 清除sheet的内容
sht.contents()
# 获取sheet的名称
sht.name
# 删除sheet
sht.delete
# 引用当前活动工作表的单元格
rng=xw.Range('A1')
# 加入超链接
# rng.add_hyperlink(r'www.baidu.com','百度',‘提示:点击即链接到百度')
# 取得当前range的地址
rng.address
rng.get_address()
# 清除range的内容
rng.clear_contents()
# 清除格式和内容
rng.clear()
# 取得range的背景色,以元组形式返回RGB值
rng.color
# 设置range的颜色
rng.color=(255,255,255)
# 清除range的背景色
rng.color=None
# 获得range的第一列列标
rng.column
# 返回range中单元格的数据
rng.count
# 返回current_region
rng.current_region
# 返回ctrl + 方向
rng.end('down')
# 获取公式或者输入公式
rng.formula='=SUM(B1:B5)'
# 数组公式
rng.formula_array
# 获得单元格的绝对地址
rng.get_address(row_absolute=True, column_absolute=True,include_sheetname=False, external=False)
# 获得列宽
rng.column_width
# 返回range的总宽度
rng.width
# 获得range的超链接
rng.hyperlink
# 获得range中右下角最后一个单元格
rng.last_cell
# range平移
rng.offset(row_offset=0,column_offset=0)
#range进行resize改变range的大小
rng.resize(row_size=None,column_size=None)
# range的第一行行标
rng.row
# 行的高度,所有行一样高返回行高,不一样返回None
rng.row_height
# 返回range的总高度
rng.height
# 返回range的行数和列数
rng.shape
# 返回range所在的sheet
rng.sheet
#返回range的所有行
rng.rows
# range的第一行
rng.rows[0]
# range的总行数
rng.rows.count
# 返回range的所有列
rng.columns
# 返回range的第一列
rng.columns[0]
# 返回range的列数
rng.columns.count
# 所有range的大小自适应
rng.autofit()
# 所有列宽度自适应
rng.columns.autofit()
# 所有行宽度自适应
rng.rows.autofit()
作者:LuckyFrog
链接:https://www.jianshu.com/p/e21894fc5501
来源:简书
著作权归作者所有。
参考资料:
https://docs.xlwings.org/en/stable/index.html
https://www.kancloud.cn/gnefnuy/xlwings-docs/1127450