Xlwings 操作

Xlwings 操作

Xlwings 操作

创建工作簿,工作表

 1import xlwings as xw
 2
 3# 创建一个新的App,并在新App中新建一个Book
 4wb = xw.Book()
 5wb.save('1.xlsx')
 6wb.close()
 7
 8# 当前App下新建一个Book
 9# visible参数控制创建文件时可见的属性
10app=xw.App(visible=False,add_book=False)
11wb=app.books.add()
12
13ws = wb.sheets.avtive
14ws1 = wb.sheets.add('新建工作表', after=ws)
15
16wb.save('1.xlsx')
17wb.close()
18#结束进程
19app.quit()

打开已有工作簿

 1import xlwings as xw
 2app=xw.App(visible=True,add_book=False)
 3#不显示Excel消息框
 4app.display_alerts=False
 5#关闭屏幕更新,可加快宏的执行速度
 6app.screen_updating=False
 7
 8wb=app.books.open('1.xlsx')
 9# 输出打开的excle的绝对路径
10# print(wb.fullname)
11wb.save()
12wb.close()
13# 退出excel程序,
14app.quit()
15# 通过杀掉进程强制Excel app退出
16# app.kill()
17# 
18# 以第一种方式创建Book时,打开文件的操作可如下
19wb = xw.Book('1.xlsx')
20
21app = xw.App(visible=False, add_book=False)
22app.display_alerts = False    # 关闭一些提示信息,可以加快运行速度。 默认为 True。
23app.screen_updating = False    # 更新显示工作表的内容。默认为 True。关闭它也可以提升运行速度。
24
25wb = app.books.open("./111.xlsx")
26ws = wb.sheets['ExportOrderList11954161104']

单元格写入

 1# 在A1单元格写入值
 2# 实例化一个工作表对象
 3sheet1 = wb.sheets["sheet1"]
 4# 或者
 5# sheet1 =xw.books['1.xlsx'].sheets['sheet1']
 6输出工作簿名称
 7# print(sheet1.name)
 8# 写入值
 9sheet1.range('A1').value = 'python知识学堂'
10# 读值并打印
11print('value of A1:',sheet1.range('A1').value)
12# 清空单元格内容,如果A1中是图片,此方法没有效果
13sheet1.range('A1').clear()
14# 传入列表写入多行值
15sheet1.range('A1').value = [['a','b','c'],[1,2,3]]
16
17# 当然也可以将pandas的DataFrame数据写入
18import pandas as pd
19df = pd.DataFrame([[1,2], [3,4]], columns=['A', 'B'])
20sheet1.range('A1').value = df
21# 读取数据,输出类型为DataFrame
22sheet1.range('A1').options(pd.DataFrame, expand='table').value

单元格读取

 1# 读取全部行列
 2max_row, max_col = sht.used_range.last_cell.row, sht.used_range.last_cell.column
 3lst = sht.range((1,1), (max_row, max_col)).value
 4
 5rng = sht.range('A1:D3')
 6for cell in rng:
 7    print(cell.value)
 8
 9# 读取行, 列(0起始)
10rng = sht[2:5, :3]
11for cell in rng:
12    print(cell.value)

单元格设置

1"""设置单元格大小"""
2ws.autofit()                #在整个工作表上自动调整宽度,可传参数
3ws.autofit(axis='c')        # 在整个工作表上自动调整列的宽度
4ws.autofit(axis='r')        # 在整个工作表上自动调整行的宽度
5ws.autofit('c')        # 在整个工作表上自动调整列的宽度
6ws.autofit('r')        # 在整个工作表上自动调整行的宽度
7ws.range(1,4).column_width = 5    # 设置第4列 列宽。(1,4)为第1行第4列的单元格
8ws.range(1,4).row_height = 20     # 设置第1行 行高

边框线

 1b3 = ws.range('b3')
 2
 3# Borders(9) 底部边框,LineStyle = 1 直线。
 4b3.api.Borders(9).LineStyle = 1
 5b3.api.Borders(9).Weight = 3                # 设置边框粗细。
 6
 7# Borders(7) 左边框,LineStyle = 2 虚线。
 8b3.api.Borders(7).LineStyle = 2
 9b3.api.Borders(7).Weight = 3
10
11# Borders(8) 顶部框,LineStyle = 5 双点划线。
12b3.api.Borders(8).LineStyle = 5
13b3.api.Borders(8).Weight = 3
14
15# Borders(10) 右边框,LineStyle = 4 点划线。
16b3.api.Borders(10).LineStyle = 4
17b3.api.Borders(10).Weight = 3
18
19# Borders(5) 单元格内从左上角 到 右下角。
20b3.api.Borders(5).LineStyle = 1
21b3.api.Borders(5).Weight = 3
22
23# Borders(6) 单元格内从左下角 到 右上角。
24b3.api.Borders(6).LineStyle = 1
25b3.api.Borders(6).Weight = 3
26
27"""如果是一个区域的单元格,内部边框设置如下"""
28# Borders(11) 内部垂直边线。
29b3.api.Borders(11).LineStyle = 1
30b3.api.Borders(11).Weight = 3
31
32# Borders(12) 内部水平边线。
33b3.api.Borders(12).LineStyle = 1
34b3.api.Borders(12).Weight = 3

使用公式

1# 使用公式
2ws.range('AB2').formula='=SUM(A1,A2)'

基础代码

 1# coding=utf-8
 2import xlwings as xw
 3# 设置程序不可见运行
 4app = xw.App(visible=False, add_book=False)
 5
 6# ===============  第一部分,创建并写入数据 =====================
 7# 创建一个test2.xlsx表,并写入数据
 8# wb = app.books.add()
 9# ws = wb.sheets.active
10# arr = []
11# for col in range(1,4):
12#     arr_temp = []
13#     for row in range(1,4):
14#         arr_temp.append(col*10+row)
15#     arr.append(arr_temp)
16# ws.range('A1:B3').value=arr
17# wb.save('data/test2.xlsx')
18# wb.close()
19# app.quit()
20# exit()
21
22# ============== 第二部分,插入、删除行和列 ========================
23
24# 导入已存的demo表格
25load_wb = app.books.open('data/test2.xlsx')
26# # 打开活动的工作薄的活动工作簿,或者指定的工作簿
27load_ws = load_wb.sheets.active
28# load_ws = load_wb.sheets['Sheet']
29
30# 获取总行数(存在数据)
31rows = load_ws.api.UsedRange.Rows.count
32cols = load_ws.api.UsedRange.Columns.count
33# print('该表格总共有:'+str(rows)+' 行')
34# print('该表格总共有:'+str(cols)+' 列')
35# exit()
36
37
38# 1-①在第二行前插入2行(可理解为: 在第2-4行插入空白行)
39# load_ws.api.rows('2:4').insert
40# 1-②删除第2-4行
41# load_ws.api.rows('2:4').delete
42# 2-①在第二列前插入2列(这里处理的不是很好,其实是增加了对应区域的单元格,并未直接增加列)
43# load_ws.range('B1:C'+str(cols)).api.insert
44# 2-②删除第2-4列
45# load_ws.range('B1:C'+str(cols)).api.delete
46
47# ============== 第三部分,修改指定单元格的值 ========================
48# load_ws.range('A1').value = 'x11'
49
50# ============== 第四部分,合并单元格 ========================
51# load_ws.range('A1:A2').api.merge
52
53# ============== 第五部分,获取单元格横纵坐标index ========================
54rng=xw.Range('B2')
55# 返回当前格子的行值
56# print(rng.row)
57# 返回当前格子的列值
58# print(rng.column)
59# 返回和设置当前格子的高度和宽度
60print(rng.width)
61print(rng.height)
62rng.row_height=40
63rng.column_width=50
64# 指定单元格的高度和宽度自适应
65# rng.columns.autofit()
66rng.rows.autofit()
67print(rng.width)
68print(rng.height)
69# load_ws.range('A1:A2').api.height = 20
70
71
72# ============== 第六部分,其它 ========================
73# lst=load_ws.range('A1:A'+str(load_ws['A1048576'].end('up').row)).value #把excel单列值读取到列表中
74# lst1=load_ws.range('A1:C'+str(load_ws['A1048576'].end('up').row)).value # 把excel连续两个列的值读取到列表中
75# lst=load_ws.range('A1:A'+str(load_ws['A1048576'].end('up').row)).value #A列的值
76# lst2=load_ws.range('C1:C'+str(load_ws['A1048576'].end('up').row)).value#C列的值
77# lst3=list(zip(lst,lst2))#合并起来然后转为列表
78# dicta=dict(lst3)#列表转为字典
79
80# ============== 第七部分,Office操作文档 ========================
81# https://docs.microsoft.com/en-us/office/vba/api/excel.range(object)
82
83
84
85load_wb.save()
86load_wb.close()
87app.quit()

待续……