1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python读取合并单元格数据并取消合并单元格——将每一行读取为列表

Python读取合并单元格数据并取消合并单元格——将每一行读取为列表

时间:2023-10-05 07:18:33

相关推荐

Python读取合并单元格数据并取消合并单元格——将每一行读取为列表

今天在解决需求的时候,遇到一个问题就是有一个Excel表格A列是合并单元格,但是我想 读取的时候,希望读取到的内容是非合并单元格,也就是说想取消合并单元格,并自动补充数据,好啦,我们一起看一下,下面的表:

我想让合并单元格的表转成取消合并单元格的样子

先看视频演示,是不是你想要的效果:

安装的库

我直接上代码啦:

如果有其他列也是合并单元格,也会依次取消合并单元格,并填充数据!!如上视频所示!

import xlrddef get_excel():with xlrd.open_workbook('./测试表.xlsx') as workbook:name_sheets = workbook.sheet_names() # 获取Excel的sheet表列表,存储是sheet表名for index in name_sheets: # for 循环读取每一个sheet表的内容sheet_info = workbook.sheet_by_name(index) # 根据表名获取表中的所有内容,sheet_info也是列表,列表中的值是每个单元格里值# first_line = sheet_info.row_values(0) # 获取首行,我这里的首行是表头,我打算用表头作为字典的key,每一行数据对应表头的value,每一行组成一个字典values_merge_cell = merge_cell(sheet_info) # 这里是调用处理合并单元格的函数for i in range(1, sheet_info.nrows): # 开始为组成字典准备数据other_line = sheet_info.row_values(i)for key in values_merge_cell.keys():if key[0] == i:other_line[key[1]] = values_merge_cell[key]print(other_line)def merge_cell(sheet_info):'''#handle Merge transverse cells and handle Merge Vertical Cells, assign empty cells,:param rlow:row, include row exclusive of row_range:param rhigh:row_range:param clow:col, include col exclusive of col_range:param chigh:col_range:param sheet_info:object of sheet:return:dic contain all of empty cells value'''merge = {}merge_cells = sheet_info.merged_cellsfor (rlow, rhigh, clow, chigh) in merge_cells:value_mg_cell = sheet_info.cell_value(rlow, clow)if rhigh - rlow == 1:# Merge transverse cellsfor n in range(chigh - clow - 1):merge[(rlow, clow + n + 1)] = value_mg_cellelif chigh - clow == 1:# Merge Vertical Cellsfor n in range(rhigh - rlow - 1):merge[(rlow + n + 1, clow)] = value_mg_cellreturn mergeif __name__ == '__main__':apply_list = get_excel()

总结:

只要数据转为列表,那我们就可以做处理

1、如:将表头做键,表头以下信息作为值

2、如:将每一行信息作为字典嵌套,如:{A:{B:[C,D]}},这也是我今天遇到的问题,所以才产生了此文章

3、利用openpyxl将新数据写入新的Excel文件,正如上述代码

最后我将程序进行了GUI设计:

可直接使用!!

import tkinterimport openpyxlimport xlrdfrom tkinter import filedialog,messageboxroot = tkinter.Tk()root.title('路径选择')max_w, max_h = root.maxsize()root.geometry(f'500x300+{int((max_w - 500) / 2)}+{int((max_h - 300) / 2)}') # 居中显示root.resizable(width=False, height=False)def get_excel():wb = openpyxl.Workbook()ws = wb.activewith xlrd.open_workbook(get_file_list()[0]) as workbook:name_sheets = workbook.sheet_names() # 获取Excel的sheet表列表,存储是sheet表名# print(name_sheets)# for index in name_sheets: # for 循环读取每一个sheet表的内容sheet_info = workbook.sheet_by_name(name_sheets[0]) # 根据表名获取表中的所有内容,sheet_info也是列表,列表中的值是每个单元格里值first_line = sheet_info.row_values(0) # 获取首行,我这里的首行是表头,我打算用表头作为字典的key,每一行数据对应表头的value,每一行组成一个字典print(first_line)ws.append(first_line)values_merge_cell = merge_cell(sheet_info) # 这里是调用处理合并单元格的函数for i in range(1, sheet_info.nrows): # 开始为组成字典准备数据other_line = sheet_info.row_values(i)for key in values_merge_cell.keys():if key[0] == i:other_line[key[1]] = values_merge_cell[key]print(other_line)ws.append(other_line)wb.save("./取消合并单元格.xlsx")messagebox.showinfo(message="该Excel文件已取消合并单元格,新文件保存至当前文件夹!!")def merge_cell(sheet_info):merge = {}merge_cells = sheet_info.merged_cellsfor (rlow, rhigh, clow, chigh) in merge_cells:value_mg_cell = sheet_info.cell_value(rlow, clow)if rhigh - rlow == 1:# Merge transverse cellsfor n in range(chigh - clow - 1):merge[(rlow, clow + n + 1)] = value_mg_cellelif chigh - clow == 1:# Merge Vertical Cellsfor n in range(rhigh - rlow - 1):merge[(rlow + n + 1, clow)] = value_mg_cellreturn merge# 标签组件label = tkinter.Label(root, text='选择文件:', font=('华文彩云', 15))label.place(x=50, y=80)# 确定按钮label = tkinter.Button(root, text='确定(开始执行):', font=('华文彩云', 15),command=get_excel)label.place(x=155, y=150)# 输入框控件entry_text = tkinter.StringVar()entry = tkinter.Entry(root, textvariable=entry_text, font=('FangSong', 10), width=30, state='readonly')entry.place(x=150, y=85)# 按钮控件a = []def get_path():global a# 返回一个字符串,可以获取到任意文件的路径。path1 = filedialog.askopenfilename(title='请选择文件')a.append(path1)entry_text.set(path1)return path1def f1():button = tkinter.Button(root, text='选择路径', command=get_path)button.place(x=400, y=75)root.mainloop()# 就是这里TM的搞了好几天,才知道这么写就行了!!!def get_file_list():return aif __name__ == '__main__':f1()print(get_file_list())

以上代码可打包发送给您亲爱的朋友、同学、同事,共同享用!!喝水不忘挖井人,记得给个关注

纯净版打包保姆级教程:点我

打包现有python环境打包教程:点我(新手推荐)

希望对大家有帮助

致力于办公自动化的小小程序员一枚

都看到这了,关注+点赞+收藏=不迷路!!

如果你想知道更多关于Python办公自动化的知识各位大佬给个关注吧!

我改了原帖的代码,原帖是:取消合并单元格,将表头做键,表头以下的信息做值,创建字典

原帖:点我查看*

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。