请选择 进入手机版 | 继续访问电脑版

学WPS论坛

 找回密码
 立即注册
搜索
查看: 1025|回复: 0

[Windows] 批量合并EXCEL工作表小工具 V2.3

[复制链接]

105

主题

105

帖子

633

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
633
发表于 2019-10-20 00:54:28 | 显示全部楼层 |阅读模式
PYTHON写的,打包为一个 EXE 文件

操作方法:
  • 把所有需要汇总的EXCEL文件(XLS、XLSX都可以)放到同一文件夹下
  • 把该文件夹拖到EXE文件上
  • 输入标题所在行号

在汇总文件夹所在目录会生成一个汇总文件

使用教程:
批量合并EXCEL工作表小工具使用教程.gif



下载链接:https://pan.baidu.com/s/1t3IO52RUR6dD5eWrxX8qUg 提取码: 5yiy
本地下载:

来源链接:https://www.52pojie.cn/thread-1029677-1-2.html


其它Excel工具链接:
EXCEL文件拆分工具

Python源码:
  1. #  v2.1
  2. #  文件名放在最右侧列
  3. #  v2.2
  4. #  加入自动识别文件结构是否被改变功能
  5. #  v2.3
  6. #  加入选择统计哪个worksheet的功能

  7. import xlrd, xlsxwriter
  8. import os, sys, re, logging
  9. from pprint import pprint

  10. print('EXCEL汇总程序 V2.3   --by Eyes 2019.9')

  11. logging.basicConfig(filename=sys.argv[0] + '.log', level=logging.INFO,
  12.                     format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  13. logger = logging.getLogger(__name__)

  14. dir = sys.argv[1]
  15. # dir = r'C:\Users\Eyes\Desktop\已统计(请勿上传)'
  16. r = re.search('(.+)[\\\]', dir)
  17. rr = re.search('[\\\]([^\\\]+)

  18. , dir)
  19. parentDir = r.group(1)
  20. lastDir = rr.group(1)

  21. resultFile = parentDir + '\\汇总:' + lastDir + '.xlsx'
  22. new_wb = xlsxwriter.Workbook(resultFile)  # 创建excel文件
  23. new_ws = new_wb.add_worksheet('统计')  # 括号内为工作表表名

  24. filenames = os.listdir(dir)
  25. isFirstFile = True
  26. newWsRowNum = 0

  27. # 错误的文件格式
  28. validTypeFiles = []
  29. # 统计标题相同的文件数,以判断文件结构是否被修改
  30. sameTitleFiles = {}

  31. # 保存统计第几个表的索引
  32. summarySheetIndex = None
  33. # 标题所在行
  34. titleRowNum = None

  35. # 开始文件循环
  36. for filename in filenames:
  37.     if not re.search(r'\.xlsx?

  38. , filename, re.I):
  39.         validTypeFiles.append(filename)
  40.         continue
  41.     logger.info('开始处理:' + filename)
  42.     file = dir + '/' + filename
  43.     wb = xlrd.open_workbook(filename=file)
  44.     # 统计第几个表
  45.     if summarySheetIndex == None:
  46.         print('\n在工作薄中发现以下工作表:')
  47.         __n__ = 0
  48.         for sheetName in wb.sheet_names():
  49.             print(__n__, sheetName)
  50.             __n__ += 1
  51.         _summarySheetIndex = input('\n请输入统计第几个工作表[0]: ').strip()
  52.         if _summarySheetIndex == '':
  53.             _summarySheetIndex = 0
  54.         else:
  55.             _summarySheetIndex = int(_summarySheetIndex)
  56.         summarySheetIndex = _summarySheetIndex

  57.     # 确定标题所在行
  58.     if titleRowNum==None:
  59.         n = input('\n请输入标题所在行号[2]:').strip()
  60.         if n != '':
  61.             titleRowNum = int(n)
  62.         else:
  63.             titleRowNum=2

  64.     ws = wb.sheet_by_index(summarySheetIndex)

  65.     # 保存第一列标题名称至sameTitleFiles变量
  66.     firstTitle = ws.cell(titleRowNum - 1, 0).value
  67.     if firstTitle not in sameTitleFiles:
  68.         sameTitleFiles[firstTitle] = []
  69.     sameTitleFiles[firstTitle].append(filename)

  70.     # 第一行写入标题
  71.     if isFirstFile:
  72.         # 写入文件名
  73.         new_ws.write(newWsRowNum, ws.ncols, '文件名')
  74.         # 逐个写入标题
  75.         for y in range(0, ws.ncols):
  76.             new_ws.write(newWsRowNum, y, ws.cell(titleRowNum - 1, y).value)
  77.         isFirstFile = False
  78.         newWsRowNum += 1
  79.     # 写入数据
  80.     for x in range(titleRowNum, ws.nrows):
  81.         for y in range(0, ws.ncols):
  82.             new_ws.write(newWsRowNum, y, ws.cell(x, y).value)
  83.         # 写入文件名
  84.         new_ws.write(newWsRowNum, ws.ncols, filename)

  85.         newWsRowNum += 1
  86.     # 打印文件名
  87.     print(filename)

  88. new_wb.close()

  89. print('\n汇总完成,文件地址  ', resultFile)

  90. if validTypeFiles:
  91.     print('\n错误格式的文件:', validTypeFiles)

  92. # 计算出第一列标题内容相同的最大数量
  93. count = {}
  94. for k, v in sameTitleFiles.items():
  95.     count[k] = len(v)
  96. maxLen = max(count.values())

  97. # 保存可能有错误的文件名
  98. maybeErrors = []
  99. # 挑选出与字段最大相同数不同的文件
  100. for k, v in sameTitleFiles.items():
  101.     if len(v) < maxLen:
  102.         maybeErrors += v

  103. if len(maybeErrors) > 0:
  104.     print('\n\n以下文件结构被改变,有可能造成统计错误,请仔细查看:\n')
  105.     for i in maybeErrors:
  106.         print(i)

  107. input('\n完成 按任意键退出')
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|学WPS BBS. ( 豫ICP备13020861号-11 ) 网站运行了

GMT+8, 2022-12-5 02:49 , Processed in 0.055945 second(s), 24 queries .

Powered by Discuz! X3.4 Designed by BBs.xuewps.Com

© 2019- Comsenz Inc. www.xuewps.com

快速回复 返回顶部 返回列表