网上搜的方法,大多都是在一个excel中对每个表来新建另一个工作表保存来实现合并,而不是在一个工作表中合并所有表
1、准备工作
首先我们需要准备3样东西
(1)需要用到的库,缺少的手动pip下载下
(2)需要合并的表
表1 的数据
表2 的数据
(3)最后生成的总表
2、大致思路
1、需要先获取到目标文件夹下的所有xlsx文件
2、打开/新建一个xlsx总表用于写入(合并)所有表数据
3、打开每个目标xlsx表,开始写入数据
4、对写入的数据作判断
--如果是超链接,需要保留其格式并写入
--如果不是超链接,正常写入
5、当前表写完数据后记住最后的行数,便于下个表续写追加内容
6、需要对后续表的首行作判断,用于删除多余的表头
3、代码实现
#!/usr/bin/python3
# --*-- coding: utf-8 --*--
import os
from openpyxl import load_workbook
from openpyxl.styles import Font
"""
1、需要先获取到目标文件夹下的所有xlsx文件
2、打开/新建一个xlsx总表用于写入(合并)所有表数据
3、打开每个目标xlsx表,开始写入数据
4、对数据判断,
--如果是超链接,需要保留其格式并写入
--如果不是超链接,正常写入
5、当前表写完数据后记住最后的行数,便于下个表续写追加内容
6、需要对后续表的首行作判断,用于删除多余的表头
7、保存表
"""
def form_merge():
"""文件合并"""
result_path = os.getcwd().split('common')[0] + '\excel_file\' # 获取目标文件夹
file_list, start_row = [], 0
for i, j, k in os.walk(result_path): # 1、遍历获取目标文件夹下的所有xlsx文件
file_list = k
file_list = filter(lambda x: 'xlsx' in x, file_list) # 过滤掉不是xlsx格式的文件
lb = load_workbook('./test.xlsx')
sheet = lb['Sheet1'] # 2、打开/新建一个xlsx总表用于写入(合并)所有表数据
for file in file_list:
lb1 = load_workbook(result_path + file)
sheet1 = lb1['Sheet1'] # 3、打开每个目标xlsx表,开始写入数据
for row in range(1, sheet1.max_row + 1):
for column in range(1, sheet1.max_column + 1):
value = sheet1.cell(row, column).value # 数据的文本
link = sheet1.cell(row, column).hyperlink # 数据的hyperlink对象
if row == 1 and start_row != 0: # 6、需要对后续表的首行作判断,用于删除多余的表头
row += 1
start_row -= 1
if link is not None: # 4、对数据判断
sheet.cell(row + start_row, column, value).hyperlink = sheet1.cell(row, column).hyperlink # --如果是超链接,需要保留其格式并写入
font_blue = Font(color='0072E3', underline="single")
sheet.cell(row + start_row, column, value).font = font_blue
else: # --如果不是超链接,正常写入
sheet.cell(row + start_row, column, value)
start_row += sheet1.max_row # 5、当前表写完数据后记住最后的行数,便于下个表续写追加内容
lb.save('result_file.xlsx') # 7、保存表
if __name__ == '__main__':
form_merge()
4、注意事项
1、需要先获取到目标文件夹下的所有xlsx文件
2、打开/新建一个xlsx总表用于写入(合并)所有表数据
3、打开每个目标xlsx表,开始写入数据
4、对写入的数据作判断
--如果是超链接,需要保留其格式并写入
--如果不是超链接,正常写入
5、当前表写完数据后记住最后的行数,便于下个表续写追加内容
6、需要对后续表的首行作判断,用于删除多余的表头
#!/usr/bin/python3
# --*-- coding: utf-8 --*--
import os
from openpyxl import load_workbook
from openpyxl.styles import Font
"""
1、需要先获取到目标文件夹下的所有xlsx文件
2、打开/新建一个xlsx总表用于写入(合并)所有表数据
3、打开每个目标xlsx表,开始写入数据
4、对数据判断,
--如果是超链接,需要保留其格式并写入
--如果不是超链接,正常写入
5、当前表写完数据后记住最后的行数,便于下个表续写追加内容
6、需要对后续表的首行作判断,用于删除多余的表头
7、保存表
"""
def form_merge():
"""文件合并"""
result_path = os.getcwd().split('common')[0] + '\excel_file\' # 获取目标文件夹
file_list, start_row = [], 0
for i, j, k in os.walk(result_path): # 1、遍历获取目标文件夹下的所有xlsx文件
file_list = k
file_list = filter(lambda x: 'xlsx' in x, file_list) # 过滤掉不是xlsx格式的文件
lb = load_workbook('./test.xlsx')
sheet = lb['Sheet1'] # 2、打开/新建一个xlsx总表用于写入(合并)所有表数据
for file in file_list:
lb1 = load_workbook(result_path + file)
sheet1 = lb1['Sheet1'] # 3、打开每个目标xlsx表,开始写入数据
for row in range(1, sheet1.max_row + 1):
for column in range(1, sheet1.max_column + 1):
value = sheet1.cell(row, column).value # 数据的文本
link = sheet1.cell(row, column).hyperlink # 数据的hyperlink对象
if row == 1 and start_row != 0: # 6、需要对后续表的首行作判断,用于删除多余的表头
row += 1
start_row -= 1
if link is not None: # 4、对数据判断
sheet.cell(row + start_row, column, value).hyperlink = sheet1.cell(row, column).hyperlink # --如果是超链接,需要保留其格式并写入
font_blue = Font(color='0072E3', underline="single")
sheet.cell(row + start_row, column, value).font = font_blue
else: # --如果不是超链接,正常写入
sheet.cell(row + start_row, column, value)
start_row += sheet1.max_row # 5、当前表写完数据后记住最后的行数,便于下个表续写追加内容
lb.save('result_file.xlsx') # 7、保存表
if __name__ == '__main__':
form_merge()
4、注意事项
在执行代码之前一定要将excel关闭,否则会报错
确认工作表名是否为Sheet1,不是就改
5、拓展延伸
(1)使用爬虫(scrapy、selenium、request...),下载目标报表,实现自动生成excel表。就不用自己手动生成/导出报表
(2)通过邮件发送、企业群机器人(smtp、request)消息推送来发送合并后的excel文件。就不用自己发送合并后的报表给领导
(3)走通CI/CD(云效、jenkins),定时执行代码。就不用每次自己去执行代码来生成报表
(4)....
当所有技术成熟后,让定时任务去帮我们完成所有事情,领导就不用每次都找我们要报表了,我们到时候就可以干其他事了
当然了,具体需要实现成什么效果,使用什么手段,那就看个人需求了



