问题描述:

        在做自动化测试时,通过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()

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐