xlwings 是一个 python 包用来和 Excel 进行交互,它包含四个层次:App \(\rightarrow\) Book \(\rightarrow\) Sheet \(\rightarrow\) Range。
- App:用来索引打开的 Excel 实例。因为我们可能同时打开很多 Excel 应用程序,类似于我们可以在电脑是同时登陆多个 QQ 应用一样
- Book:用来索引 Excel 实例中的工作簿,因为我们的 Excel 中可能用多个工作簿
- Sheet:用来索引 Excel 工作簿中的表单,因为我们的工作簿中可能有多个表单
- Range:用来所以表单中的单元格
1. 新建 xlsx 文件
新建 xlsx 文件经历如下几个步骤:
- 首先建立一个 App 对象
app = xw.App(),这会打开电脑上的 Excel 应用程序 - 然后建立一个 Book 对象
book = xw.Book()这会在第一步打开的 Excel 中建立一个工作簿 - 然后即可以保存 xlsx 文件,
book.save('filename.xlsx'),如果没有提供路径,则保存在程序当前目录 - 关闭 App 对象,
app.quit()
[In 1]: import xlwings as xw
[In 2]: app = xw.App()
[In 3]: book = xw.Book()
[In 4]: book.save('filename.xlsx')
[In 5]: app.quit()
2. 打开 xlsx 文件
执行 book = xw.Book('path//to//file') 会直接打开指定文件
[In 1]: import xlwing as xw
[In 2]: book = xw.Book('path//to//file')
3. 操作 xlsx 文件中的表单
3.1 获得 xlsx 文件中的表单数目
xlsx 文件中可能有多个表单,所以首先我们需要知道到底有多少个表单
[In 1]: import xlwing as xw
[In 2]: book = xw.Book('path//to//file')
[In 3]: book.sheets
[Out 3]: Sheets([<Sheet [test.xlsx]Sheet1>, <Sheet [test.xlsx]Sheet2>])
利用 book.sheets 我们得到了当前工作簿中所有的表单名称,当前工作簿有两个表单,名字分别为 Sheet1、Sheet2。
3.2 索引需要的表单
知道了表单的名称和个数以后,我们就可以索引到我们想要的表单了,有四种索引方法,例如我们需要索引 Sheet2:
sht2 = book.sheets[1],这种索引方法是 Python 的索引,表单的编号从 0 开始,故 Sheet2 的编号为 1sht2 = book.sheets(2),这种索引方法是 Excel 的索引,表单编号从 1 开始,故 Sheet2 的编号为 2sht2 = book.sheets['Sheet2'],这种索引方法是直接利用表单名字索引的sht2 = book.sheets('Sheet2'),这种索引方法也是直接利用表单名字索引的
4. 操作表单中的单元格
4.1 索引单元格
所以单元格有如下方法:
- 索引单个单元格
sht2.range('B3')或sht2.range((3,2))指明是第三行第二列单元格 - 索引区域
sht2.range('B3:F6')或sht2.range((3,2),(6,6))
4.2 操作单元格
4.2.1 超链接
sht2.range('B3:F6').add_hyperlink(address, text_to_display=None, screen_tip=None)为区域内单元格添加超链接sht2.range('B3').hyperlink获取单元格的超链接,只适用于单元格
4.2.2 列宽行高
sht2.range('B3:F6').autofit()自动调整区域内单元格的宽度和高度sht2.range('B3:F6').columns.autofit()自动调整区域内单元格的宽度sht2.range('B3:F6').rows.autofit()自动调整区域内单元格的高度sht2.range('B3:F6').column_width将返回区域内单元格的列宽(浮点数),单位是 point,如果列宽不一致,返回Nonesht2.range('B3:F6').row_height将返回区域内单元格的行高(浮点数),单位是 point,如果列宽不一致,返回Nonesht2.range('B3:F6').column_width = 23设置区域内单元格的列宽,范围必须为 [0, 255]sht2.range('B3:F6').row_height = 23设置区域内单元格的行高(浮点数),范围必须是 [0, 409.5]sht2.range('B3:F6').height返回区域单元格的总高度(浮点数),单位是 pointsht2.range('B3:F6').width返回区域单元格的总宽度(浮点数),单位是 point
4.2.3 格式和内容
sht2.range('B3:F6').value获得区域内单元格的内容sht2.range('B3:F6').value = ‘x'’设置区域内单元格的内容sht2.range('B3:F6').clear()清除区域内单元格的内容和格式sht2.range('B3:F6').clear_contents()清除区域内单元格的内容,保留格式
4.2.4 获得区域字符串
sht2.range('B3:F6').address将返回字符串$B$3:$F$6'sht2.range('B3:F6').get_address(row_absolute=True, column_absolute=True, include_sheetname=False, external=False)返回字符串,代表区域单元的地址,根据参数的不同可以用不同返回形式,具体参考这里
4.2.5 单元格颜色
sht2.range('B3:F6').color将返回区域内单元格的颜色,若区域内单元格颜色不一致,返回 (0,0,0),若无颜色,返回空sht2.range('B3:F6').color = (255, 0, 0)设置区域内单元格的颜色
4.2.6 单元格数量
sht2.range('B3:F6').count返回单元格的数量,也可用sht2.range('B3:F6').size
4.2.7 区域单元格特殊位置
sht2.range('B3:F6').column将返回区域内单元格第一列的索引(整数),本例返回 2sht2.range('B3:F6').row将返回区域内单元格第一行的索引(整数),本例返回 3-
sht2.range('B3:F6').last_cell返回一个Range对象,表示区域内最右下单元格的位置 -
sht2.range('B3:F6').top返回一个浮点数,表示从 行 1 的上边界到此区域上边界的距离,单位是 point -
sht2.range('B3:F6').left返回一个浮点数,表示从 A 栏的左边界到此区域左边界的距离,单位是 point -
sht2.range('B3:F6').columns将返回一个RangeColumns对象,代表区域里的列,本例返回RangeColumns(<Range [test.xlsx]Sheet2!$B$3:$F$6>) sht2.range('B3:F6').rows将返回一个RangeRows对象,代表区域里的行,本例返回RangeRows(<Range [test.xlsx]Sheet2!$B$3:$F$6>)
上面这两个对象都有一个 count 数据成员,可以很方便的得到总行数和列数。
sht2.range('B3:F6').current_region返回一个Range对象,代表去除区域空白边界的范围,本类返回<Range [test.xlsx]Sheet2!$A$1:$C$3>sht2.range('B3:F6').end(args)参数args可为 left、right、up、down,该函数返回Range对象,表示指定区域近邻的边界单元格,如近邻的单元格无内容,则继续查找下一个近邻sht2.range('B3:F6').expand(args)args可为 table、down、right,该函数根据参数扩展当前区域范围,并范围Range对象,table 为向右向下扩展,若扩展方向下一个单元格内容为空,则停止扩展;若扩展后的区域仍为空,则返回None(例如,从空的单元格往右扩展,但是右边一个单元格也是空的情况)
4.2.8 区域大小
sht2.range('B3:F6').resize(row_size=None, column_size=None)重设区域大小sht2.range('B3:F6').shape返回元组,表示区域大小
4.2.9 区域名称和数字格式
sht2.range('B3:F6').name返回区域的名字sht2.range('B3:F6').name = 'test'设置区域的名字为 testsht2.range('B3:F6').number_format获得区域内数字的格式sht2.range('B3:F6').number_format = '0.00%'设置区域内数字的格式sht2.range('B3:F6').offset(row_offset=0, column_offset=0)返回Range对象,代表偏移后的范围sht2.range('B3:F6').options(convert=None, **options)可设置数值转换规则等,具体见这里
4.2.10 其他
sht2.range('B3:F6').raw_value直接加载数据,不经过 xlwings 转换,对速度要求高的应用可以考虑这个选项sht2.range('B3:F6').sheet返回区域属于的表单
5. 操作表单中的形状
5.1 获取形状数量
[In 1]: sht2.shapes
[Out 1]: Shapes([<Shape 'Isosceles Triangle 1' in <Sheet [test.xlsx]Sheet2>>])
[In 2]: sht2.shapes.count
[Out 2]: 1
5.2 索引形状
有四种索引方法,例如我们需要索引 Isosceles Triangle 1:
shp = sht2.shapes[0],这种索引方法是 Python 的索引,形状的编号从 0 开始shp = sht2.shapes(1),这种索引方法是 Excel 的索引,形状编号从 1 开始shp = sht2.shapes['Isosceles Triangle 1'],这种索引方法是直接利用形状名字索引的shp = sht2.shapes['Isosceles Triangle 1'),这种索引方法也是直接利用形状名字索引的
5.3 操作形状
shp.activate()激活形状shp.delete()删除形状shp.height返回或设置形状的高度,单位是 pointshp.width返回或设置形状的宽度,单位是 pointshp.top返回或设置形状的水平位置,单位是 pointshp.left返回或设置形状的竖直位置,单位是 pointshp.name返回或设置形状的名字shp.parent返回形状的前驱shp.type返回形状的类型
6. 操作表单中的表格
6.1 获取表格数量
[In 1]: sht2.charts
[Out 1]: Charts([<Chart 'Chart 2' in <Sheet [test.xlsx]Sheet2>>])
[In 2]: sht2.charts.count
[Out 2]: 1
6.2 添加表格
利用 add(left=0, top=0, width=355, height=211) 函数:
[In 1]: import xlwings as xw
[In 2]: sht = xw.Book().sheets[0]
[In 3]: sht.range('A1').value = [['Foo1', 'Foo2'], [1, 2]]
[In 4]: chart = sht2.charts.add()
[In 5]: chart.set_source_data(sht.range('A1').expand())
[In 6]: chart.chart_type = 'line'
[In 7]: chart.name
[Out 7]: 'Chart1'
6.3 索引表格
有四种索引方法,例如我们需要索引 Chart 2:
cha = sht2.charts[0],这种索引方法是 Python 的索引,表格的编号从 0 开始cha = sht2.charts(1),这种索引方法是 Excel 的索引,表格编号从 1 开始cha = sht2.charts['Chart 2'],这种索引方法是直接利用表格名字索引的cha = sht2.charts['Chart 2'),这种索引方法也是直接利用表格名字索引的
6.4 操作表格
cha.delete()删除表格cha.height返回或设置表格的高度,单位是 pointcha.width返回或设置表格的宽度,单位是 pointcha.top返回或设置表格的水平位置,单位是 pointcha.left返回或设置表格的竖直位置,单位是 pointcha.name返回或设置表格的名字cha.parent返回表格的前驱cha.chart_type返回表格的类型cha.set_source_data(args)设置表格的数据来源,args为Range对象
7. 操作表单中的图像
7.1 获取图像数量
[In 1]: sht2.pictures
[Out 1]: Charts([<Chart 'Chart 2' in <Sheet [test.xlsx]Sheet2>>])
[In 2]: sht2.pictures.count
[Out 2]: 1
7.2 添加图像
利用 add(image, link_to_file=False, save_with_document=True, left=0, top=0, width=None, height=None, name=None, update=False) 函数,第一参数可以是计算机中图像的路径(字符串)或者是 Matplotlib 对象:
[In 1]: import xlwings as xw
[In 2]: sht = xw.Book().sheets[0]
[In 3]: sht.pictures.add('path//to//file')
或者
[In 1]: import matplotlib.pyplot as plt
[In 2]: fig = plt.figure()
[In 3]: plt.plot([1, 2, 3, 4, 5])
[In 4]: sht.pictures.add(fig, name='MyPlot', update=True)
7.3 索引图像
有四种索引方法,例如我们需要索引 Picture 1:
pic = sht2.pictures[0],这种索引方法是 Python 的索引,图像的编号从 0 开始pic = sht2.pictures(1),这种索引方法是 Excel 的索引,图像编号从 1 开始pic = sht2.pictures['Picture 1'],这种索引方法是直接利用图像名字索引的pic = sht2.pictures['Picture 1'),这种索引方法也是直接利用图像名字索引的
7.4 操作图像
pic.delete()删除图像pic.height返回或设置图像的高度,单位是 pointpic.width返回或设置图像的宽度,单位是 pointpic.top返回或设置图像的水平位置,单位是 pointpic.left返回或设置图像的竖直位置,单位是 pointpic.name返回或设置图像的名字pic.parent返回图像的前驱pic.update(image)用新的图像替换当前图像,图像属性不变