Python使用xlwings读写含VBA的Excel文件详解
本文介绍如何使用Python的xlwings模块读写包含VBA代码的Excel文件。通过示例演示了读取单元格数据时的类型处理,以及动态写入数据到工作表的具体代码实现,解决openpyxl对VBA支持不佳的问题。
一、简介
在实际开发中,经常遇到需要向包含VBA宏的Excel文件写入数据,同时确保不影响原有VBA代码执行的情况。起初尝试使用openpyxl模块将数据写入xlsm格式文件,但发现写入后触发VBA的按钮会消失。经排查,原因是openpyxl对VBA的支持并不完善,而xlwings模块则对VBA提供了良好的兼容性。
二、简单介绍下xlwings模块

1、读取Excel中数据
读取数据时需注意类型转换问题:默认情况下,包含数字的单元格会被读取为float类型,包含日期的单元格会被读取为datetime.datetime类型,而空单元格则转化为None。如果需要指定读取格式,可以通过option操作进行设置。
import xlwings as xw
import os
#创建APP应用
app=xw.App(visible=True,add_book=False) #visible表示程序运行时是否可见Excel,True表示可见,False表示不可见;add_book表示是否要新建工作簿
file = "数据写入V1.xlsm"
wb=app.books.open(file) #打开指定文件
ws = wb.sheets["Sheet1"] #工作表引用
#ws.activate()
temp_value = ws["B2"].value #默认读取B2的值,为浮点型
print(type(temp_value))
print(temp_value)
temp_n = ws["B3"].value #默认读取B3的值,这里未空值默认应显示None
print(type(temp_n))
print(temp_n)
temp_value1 = ws["B2"].options(numbers=int).value #将B2的设置为整数
print(type(temp_value1))
print(temp_value1)
#运行结果
<class 'float'>
100.0
<class 'NoneType'>
None
<class 'int'>
100
>>>
2、另一种取值单元格值得方式
import xlwings as xw
import os
app=xw.App(visible=True,add_book=False)
file = "数据写入V1.xlsm"
wb=app.books.open(file) #打开指定文件
ws = wb.sheets["Sheet1"]
print(ws.range('B2').value) #另一种方式读取B2的值
#运行结果
100.0
三、将数据写入Excel

import xlwings as xw
import os
#创建APP应用
app=xw.App(visible=True,add_book=False)
file = "数据写入V1.xlsm"
wb=app.books.open(file) #打开指定文件
#工作表引用
ws = wb.sheets["Sheet1"]
a = 6799
b = 2345
c = 1000
info = ws.used_range
#print(info)
nrows = info.last_cell.row #获取sheet表中最大行
print(nrows)
if ws['B'+str(nrows)]==None:
ws['B'+str(int(nrows)-1)].value=a
ws['C'+str(int(nrows)-1)].value=b
ws['D'+str(int(nrows)-1)].value=c
else:
ws['B'+str(int(nrows)+1)].value=a
ws['C'+str(int(nrows)+1)].value=b
ws['D'+str(int(nrows)+1)].value=c
wb.save() #保存数据
wb.close() #关闭工作簿
app.quit()
写入后
到此这篇关于python兼容VBA的用法详解的文章就介绍到这了,更多相关python兼容VBA的内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









