python读写excel之修改已有excel文件后部分原有数据丢失
问题描述:
在做自动化测试时,通过openpyxl库打开excel文件,只填写测试结果并保存后,文件里部分原有测试数据丢失。
问题分析:
经过定位,排除了代码错误、excel文件格式不正确等原因,推测应该是openpyxl库的bug,具体原因不详。
解决方案:
1、验证失败的方案:
(1)尝试使用xlsxwriter库替换openpyxl库,但发现xlsxwriter不支持修改已有的excel文件,
(2)尝试使用xlrd+xlutils库替换openpyxl,但也行不通,因为xlutils库不支持.xlsxl类型的文件(提醒:xlrd2.0以上的版本也不支持.xlsx类型文件的读取)
2、成功的方案:
经过查阅资料,让我发现了一个操作excel的利器-xlings,它支持读写、修改。xlwings和目前流行的其它xlsxwriter, openpyxl等的区别:

从上图就可以看出xlings功能的强大,毫无疑问,最终也是它解决了困扰我很久的问题。
具体代码如下:
import xlings as xw
app = xw.App(visible=True, add_book=False) # 属性visible表示工作簿是否可见,属性 add_book表示是否新增工作簿
app.display_alerts = Flase # 关闭一些提示信息,可以加快运行速度,默认为True
app.screen_updating = Flase # 更新显示工作表的内容,默认为 True,关闭它可以提升运行速度。
wb = app.books.open('./test.xlsx') # 打开已有excel文件
ws = wb.sheets["sheet1"] # 获取sheet表
rows = ws.api.UsedRange.Rows.Formula # 获取所有行数据内容
row_count = ws.used_range.last_cell.row # 获取最大行数
row_count = ws.used_range.last_cell.col # 获取最大列数
用例编号 = str(int(ws.range((row_index, 用例编号_index)).value))
for row_index in range(2, row_count+1):
if 用例编号 in fail_seqs:
ws.range((row_index, 用例编号_index)).value = 'fail'
else:
ws.range((row_index, 用例编号_index)).value = 'pass'
wb.save(./text.xlsx)
wb.close()
app.quit()
如果要新建文件并读写,方法如下 :
import xlwings as xw
方法一:
app = xw.App(visible=True, add_book=False)
app.display_alerts = False
app.screen_updating = True
wb = app.books.add()
wb.sheets.add(sheet_name)
sheet = wb.sheets[sheet_name]
sheet.range('A1').value = 'hello, word!'
wb.save('text.xlsx')
wb.close()
app.quit()
方法二:
wb = xw.Book()
wb.sheets.add(sheet_name)
sheet = wb.sheets[sheet_name]
sheet.range('A1').value = 'hello, word!'
wb.save('text.xlsx')
wb.close()
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)