【Python】Excel表格汇总Excel
本文最后更新于 1119 天前,其中的信息可能已经有所发展或是发生改变
来源吾爱破解 

之前发了【Python】Word表格汇总Excel ,没想到挺受欢迎,由此看来需求还是有的。其实我自己工作倒是没有这个需求,都是帮朋友写的。
前两天看到了 请给位大神推荐个好用excel提取汇总工具,然后我试了下几个Excel插件,汇总的基本都是全部数据(可能是我潦草试了没有用对),对于只需要部分数据的人来说还是不够方便的。
之前也有人写过了 Excel提取汇总 ,不过楼主表示软件兼容性不太好,我就趁闲写了个python版的,使用了xlwings,功能比较简单,也没有费劲整图形界面,增加了进度条。用法也和我之前那个相似。

【功能】
1. 将多个Excel表格数据汇总到Excel表格;

【使用】【更新】
1. 数据备份;
2. [模板]: 在相应单元格填Excel列数并删除其他所有内容;
3. [数字前加单引号]: 可避免手机号等科学记数法; 
4. [对日期格式化]: 将各种格式的日期统一格式;
5. [来源工作簿及工作表名称]:在模板文件随意单元格填写b-m-n,其中m为工作簿名称要填入的列数,n为工作表名称要填入的列数,相同时以-连接;
6. 增加工作簿多工作表情况:
①所有工作表格式相同,全部汇总到同一目标表格,此时目标表格和模板文件都只有一个工作表;
②工作表格式不同(或相同),需要分别汇总到目标表格对应的目标工作表,此时目标表格和模板文件有和原表格相同数量的工作表。


【示例】
1. 现在需要汇总形如以下格式的Excel表格:
%title插图%num 

2. 需要汇总的Excel格式如下:
%title插图%num 

3. 根据需要提取的数据所处的Excel列数制作模板如下(单工作表或多工作表):
%title插图%num 

4. 然后运行选择目录和模板文件即可。

【源码】【更新】
[Python] 纯文本查看 复制代码# -*- coding: UTF-8 -*- import os, re, sys import xlwings as xw import tkinter as tk from tkinter import srcdialog class Xlsx2Xlsx(object): def __init__(self): super(Xlsx2Xlsx, self).__init__() self.pattern = re.compile(r”(\d{2,4})\D*(\d{0,2})\D*(\d{0,2})”) # srcs path def srcPath(self): root = tk.Tk() root.withdraw() path = srcdialog.askdirectory(title = “选择Xlsx文件所在目录”) model = srcdialog.askopensrcname(title=”选择Xlsx模板文件”,srctypes=[(‘XLSX’, ‘*.xlsx’)]) xls = [i for i in os.listdir(path) if (i.endswith(“.xlsx”) or i.endswith(“.xls”)) and not i.startswith(“~$”)] return path, xls, model # xlsx 2 xlsx def xlsx2xlsx(self, path, xls, model): app = xw.App(visible=False, add_book=False) wb_model = app.books.open(model) data = [] for i in range(len(wb_model.sheets)): ws_model = wb_model.sheets[i] info = ws_model.used_range nrows = info.last_cell.row ncols = info.last_cell.column data.append(ws_model.range((1, 1), (nrows, ncols)).value) #所有行数据 wb_model.close() wb_result=app.books.add() #新建表格 row = 1 nums = len(xls) size = 40 #符号数量即进度条长度 for r, x in enumerate(xls): wb_xl = app.books.open(path + r”/” + x) for s in range(len(wb_xl.sheets)): ws_xl = wb_xl.sheets flag = 0 if len(data) == 1 else s #模板是否只有一个工作表 line = row if len(data) == 1 else r + 1 d = data[flag] wsnames = [i.name for i in wb_result.sheets] shtname = “Sheet%d” %(flag + 1) ws_result = wb_result.sheets[shtname] if shtname in wsnames else wb_result.sheets.add(shtname, after = wsnames[-1]) for i, m in enumerate(d): if any(m): for j, n in enumerate(m): if n: #需要提取该单元格 val = ws_xl.range((i + 1, j + 1)).value if isinstance(n, float): #我这里如果模板为纯数字,读取后为1.0这样的浮点数,若报错回复我修改 ws_result.range((line, int(n))).value = val elif “‘” in n or “‘” in n or “’” in n or n.isdigit(): #存在单引号(这里半角单引号其实并无法读取,只显示为字符串的数字),防止错输入为全角 ser = int(n) if n.isdigit() else int(n[1:]) ws_result.range((line, ser)).value = r”‘” + str(val) elif “d” in n or “D” in n: #日期 sym = n[-1] if n[-1] != “d” and n[-1] != “D” else “” ser = int(n.split(“d”)[0]) if “d” in n else int(n.split(“D”)[0]) date = self.pattern.findall(str(val))[0] if date[2]: date = “{}{}{:0>2s}{}{:0>2s}”.format(date[0], sym, date[1], sym, date[2]) elif date[1]: date = “{}{}{:0>2s}”.format(date[0], sym, date[1]) else: date = date[0] ws_result.range((line, ser)).value = date elif “b” in n or “B” in n: ser1 = int(n.split(“-“)[1]) ser2 = int(n.split(“-“)[2]) if ser1 != ser2: ws_result.range((line, ser1)).value = x ws_result.range((line, ser2)).value = ws_xl.name else: ws_result.range((line, ser1)).value = x + “-” + ws_xl.name row += 1 wb_xl.close() bar = “\r{:>3.0f}%| “.format((r+1)/nums*100) + “{{:\u0020<{}s}}”.format(size).format(“\u2588″*int((r+1)/nums*size)) + ” {{:0>{}d}}|{}”.format(len(str(nums)), nums).format(r+1) # sys.stdout.write(bar) #不换行打印,需环境支持 # sys.stdout.flush() print(bar) wb_result.save(os.path.dirname(model) + “/” + “result.xlsx”) #保存到与模板文件相同位置 wb_result.close() app.quit() if __name__ == ‘__main__’: x2x = Xlsx2Xlsx() path, xls, model = x2x.srcPath() x2x.xlsx2xlsx(path, xls, model)
【链接】【更新】
打包exe及源码:
https://lykisun.lanzous.com/b00ubl0ib
密码:52pj

【问题】
1、出错注意仔细查看有没有按照说明制作模板,或者翻一下评论看看有没有自己的问题;
2、来源表有隐藏工作表;
3、Excel为精简版等非正式版或未装Excel;
4、代码77行有问题,如果工作簿或工作表名称为数字的话会出错,先不改了;
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇