拆分单元格的实现使用了第三方库openpyxl,但是这个库只支持xlsx类型的文件,所以如果我们有xls类型的文件的话要先转成xlsx类型 实现效果: 待拆分excel 拆分后的excel
具体实现步骤: 1.xls文件转xlsx文件: 也是借助一个库:pywin32
import win32com.client as win32
def changeXlsToXlsx(path, savePath):
if path.endswith(".xls"):
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False
wb = excel.Workbooks.Open(path)
if wb is None:
print("打开xls失败")
return
else:
xlsx_path = path + 'x'
wb.SaveAs(xlsx_path, FileFormat=51)
wb.Close()
excel.Application.Quit()
print('格式转换完成')
else:
print('格式无需转换')
打开xls失败的话,考虑以下原因:(1)后台存在一个excel进程占用了打开的文件 ,资源管理器中找到该进程结束就行。(2)考虑传入的xls文件路径问题导致wb为None,可以试着把左(右)斜换成右(左)斜。 以上两个原因是我在写代码时实际遇到的问题。
2.得到xlsx文件后,进行拆分操作即可:
import openpyxl
def handleXlsx(xlsx_path, savePath):
if savePath == xlsx_path:
print("拆分路径不可以跟xlsx文件路径一样哦\n")
return
workbook = openpyxl.load_workbook(xlsx_path)
name_list = workbook.sheetnames
worksheet = workbook[name_list[0]]
m_list = worksheet.merged_cells
if m_list:
cr = []
for m_area in m_list:
r1, r2, c1, c2 = m_area.min_row, m_area.max_row, m_area.min_col, m_area.max_col
if r2 - r1 > 0:
cr.append((r1, r2, c1, c2))
for r in cr:
worksheet.unmerge_cells(start_row=r[0], end_row=r[1],
start_column=r[2], end_column=r[3])
for i in range(r[1] - r[0] + 1):
for j in range(r[3] - r[2] + 1):
worksheet.cell(row=r[0] + i, column=r[2] + j, value=worksheet.cell(r[0], r[2]).value)
workbook.save(savePath)
以上两个函数其实最耗时的是第一个,本质是 打开excel另存为的 形式来实现。
最初也考虑过使用pandas来xls转换成xlsx,但是当写出xlsx文件后,失去了原有的一些合并单元格的形式,导致不能完成拆分。
此文章借鉴了 https://blog.csdn.net/weixin_44788825/article/details/104526131
若是觉得每次都要复制路径比较麻烦的话,可以考虑使用pyqt写一个可视化页面,直接选择文件就行。
|