【V2.3】批量合并EXCEL工作表小工具

链接:
https://www.lanzouj.com/b00za3j6j

另外一个工具:拆分EXCEL文件工具
https://bbs.songma.com/forum.php … pid=28133349&page=1

PYTHON写的,打包为一个EXE文件,操作方法:
把所有需要汇总的EXCEL文件(XLS、XLSX都可以)放到同一文件夹下,把该文件夹拖到EXE文件上,输入标题所在行号,在汇总文件夹所在目录会生成一个汇总文件

【V2.3】批量合并EXCEL工作表小工具

PYTHON源码:

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

import xlrd, xlsxwriter
import os, sys, re, logging
from pprint import pprint

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

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

dir = sys.argv[1]
# dir = r'C:UsersEyesDesktop已统计(请勿上传)'
r = re.search('(.+)[\]', dir)
rr = re.search('[\]([^\]+)$', dir)
parentDir = r.group(1)
lastDir = rr.group(1)

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

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

# 错误的文件格式
validTypeFiles = []
# 统计标题一样的文件数,以判断文件结构是否被修改
sameTitleFiles = {}

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

# 开始文件循环
for filename in filenames:
    if not re.search(r'.xlsx?$', filename, re.I):
        validTypeFiles.append(filename)
        continue
    logger.info('开始处理:' + filename)
    file = dir + '/' + filename
    wb = xlrd.open_workbook(filename=file)
    # 统计第几个表
    if summarySheetIndex == None:
        print('
在工作薄中发现以下工作表:')
        __n__ = 0
        for sheetName in wb.sheet_names():
            print(__n__, sheetName)
            __n__ += 1
        _summarySheetIndex = input('
请输入统计第几个工作表[0]: ').strip()
        if _summarySheetIndex == '':
            _summarySheetIndex = 0
        else:
            _summarySheetIndex = int(_summarySheetIndex)
        summarySheetIndex = _summarySheetIndex

    # 确定标题所在行
    if titleRowNum==None:
        n = input('
请输入标题所在行号[2]:').strip()
        if n != '':
            titleRowNum = int(n)
        else:
            titleRowNum=2

    ws = wb.sheet_by_index(summarySheetIndex)

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

    # 第一行写入标题
    if isFirstFile:
        # 写入文件名
        new_ws.write(newWsRowNum, ws.ncols, '文件名')
        # 逐个写入标题
        for y in range(0, ws.ncols):
            new_ws.write(newWsRowNum, y, ws.cell(titleRowNum - 1, y).value)
        isFirstFile = False
        newWsRowNum += 1
    # 写入数据
    for x in range(titleRowNum, ws.nrows):
        for y in range(0, ws.ncols):
            new_ws.write(newWsRowNum, y, ws.cell(x, y).value)
        # 写入文件名
        new_ws.write(newWsRowNum, ws.ncols, filename)

        newWsRowNum += 1
    # 打印文件名
    print(filename)

new_wb.close()

print('
汇总完成,文件地址  ', resultFile)

if validTypeFiles:
    print('
错误格式的文件:', validTypeFiles)

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

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

if len(maybeErrors) > 0:
    print('

以下文件结构被改变,有可能造成统计错误,请仔细查看:
')
    for i in maybeErrors:
        print(i)

input('
完成 按任意键退出')
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 共41条

请登录后发表评论