2021-12-21:更新
合并单元格:原本的函数是 .api.merge(),现在换成Merge了。我的版本:
# sht 是wb.sheets的某个object
sht.range('A1:A2').api.Merge()
我的使用感受
xlwings可以处理xls和xlsx格式,在写excel时非常方便,格式控制比较灵活,但是我遇到以下几个问题:
- xlwings需要有excel安装。服务器就算了。
- xlwings结束后需要杀死excel进程,避免卡死。(因为它会开很多子进程)那么什么时间kill呢?需要考虑会不会影响在用的人。
- 如果文件有密码,需要用只读模式打开,而xlwings会打开excel进程,询问是否输入密码。
所以对我来说,如果是需要读excel文件,那么用xlrd或者pandas都很方便;如果是写文件,可以用xlwings,因为格式控制比较方便。
安装
pip install xlwings
实例
import xlwings as xw
def test_xw():
# visible:是否可见excel add_book:是否新建工作簿
app = xw.App(visible=False, add_book=False)
#wb = app.books.add()
#wb = app.books.open("test.xlsx")
wb = xw.Book("test.xlsx")
# 保存
#wb.save("after.xlsx")
# 退出工作簿,可省略
#wb.close()
# 退出excel
#app.quit()
# 引用工作表
sht = wb.sheets[0]
#sht = wb.sheets["第一个sheet名"]
# 引用单元格a1
#rng = sht.range('a1')
#rng = sht['a1']
#rng = sht[0,0]
# 打印值,默认float
#print(rng.value)
# 引用区域,闭区间。
#rng = sht.range("a1:a3")
#rng = sht["a1:a3"]
#rng = sht[:3,0]
# 这样返回的是list,默认float
#print(rng.value)
# 单个值插入
#sht.range('c1').value = "Hello"
# 默认按行插入,d1-g1依次变成1,2,3,4
#sht.range("d1").value = [1,2,3,4]
# 要按列插入需要transpose。这样是从c2开始,按列插数值
#sht.range('c2').options(transpose=True).value = [5, 6, 7, 8]
# 如果插入二维数据,指明左上角的位置即可
#sht.range('c1').expand('table').value = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]
# 另存为
#wb.save("after.xlsx")
# 获取行数?
rng = sht.range('a1').expand('table')
nrows = rng.rows.count
# 这样可以在范围内准确读取
a = sht.range(f'a1:a{nrows}').value
print(a)
# 获取列数,方便读取某一行
ncols = rng.columns.count
# 这里获取第一行
fst_col = sht[0,:ncols].value
print(fst_col)
wb.close()
app.quit()
实用技巧
表格根据数据调节大小
开始写数据之前
sht.autofit()
写入excel时保证数字格式不变
ans = "'" + temp.replace(" ", "") # 在字符串前加单引号
杀死后台excel进程
os.system("taskkill /F /IM EXCEL.EXE")