Python脚本 - 多表提取列合并到同一Excel

日常工作中想将几个Excel中包含同一列的字段整合到一起,以下Python脚本实现了,按要求取对应的列名,合并到同一个Excel中,参考如下:
最新版本代码:可以根据汇总表的文件名称去适配原表中的字段名称。
准备:需要一个Excel模板,包含预置的几个sheet页,具体的每个sheet页的名称需符合脚本SHEETLIST中的命名。

#!/usr/bin/python3.8
#coding:utf-8

import os
import sys
import logging
import openpyxl
from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter, column_index_from_string
from openpyxl.styles import Font, PatternFill, Color, colors
from openpyxl.styles import Side, Alignment, Border


SHEETLIST = [
    '源数据-L2.5',
    '源数据-SUPPORT',
    '源数据-线下非缺陷',
    '源数据-线下非需求',
    '源数据-专有云需求',
    '源数据-汇总表',
]

DEFECTS = [
    '源数据-L2.5',
    '源数据-SUPPORT',
    '源数据-线下非缺陷',
]

ALL = {
    "问题类型":"A",
    "ID":"B",
    "标题":"C",
    "状态":"D",
    "作者":"E",
    "作者工号":"F",
    "作者的主管":"G",
    "指派给":"H",
    "指派给工号":"I",
    "指派给的主管":"J",
    "创建时间":"K",
    "优先级":"L",
    "模块":"M",
    "归属项目":"N",
    "标签":"O",
    "版本":"P",
    "更新时间":"Q",
    "状态更新时间":"R",
    "验收版本":"S",
    "修复于时间":"T",
    "关闭于":"U",
    "版本号":"V",
    "缺陷来源":"W",
    "客户":"X",
    "工单号":"Y",
    "客户名称":"Z",
    "项目名称":"AA",
    "改善机会":"AB",
    "潜在影响":"AC",
    "是否国产化":"AD",
    "专有云形态":"AE",
    "评论":"AF",
    "响应时间(天)":"AG",
    "修复时间(天)":"AH",
    "关闭时间(天)":"AI",
    "周次":"AJ",
    "所属行业":"AK",
    "重点产品":"AL",
    "提交团队":"AM",
    "重要客户":"AN",
    "最终修复版本":"AO",
    "hotfix修复版本":"AP",
    "严重程度": "AQ",
    "问题分类": "AR",
}


def read_as_dict(workbook, sheetname):
    ws = workbook.get_sheet_by_name(sheetname)
    #ws = workbook["sheetname"]
    data = list(ws.values)
    keys = data[0]
    return [dict(zip(keys, values)) for values in data[1:]]


def save_to_excel(filename, data, sheetname):
    if os.path.exists(filename):
        wb = openpyxl.load_workbook(filename)
        if sheetname in wb.sheetnames:
            wb.remove(wb[sheetname])

        wb.save(filename)

    wb = openpyxl.load_workbook(filename)
    wb.create_sheet(sheetname, -1)
    ws = wb.get_sheet_by_name(sheetname)
    #ws = wb["sheetname"]
    titles = list(data[0].keys())

    for col in range(len(titles)):
        title = titles[col]
        wc = ws.cell(row=1, column=col + 1, value=title)
        wc.fill = PatternFill('solid', fgColor='008B8B')
        wc.font = Font(bold=True)
        wc.alignment = Alignment(horizontal='center',vertical='center')
        wc.border = Border(left=Side(style='thin', color=colors.BLACK), right=Side(style='thin', color=colors.BLACK),)
        for r in range(len(data)):
            wc = ws.cell(row=r + 2, column=col + 1, value=data[r][title])

    wb.save(filename)
    msg = 'save the quality inspection results to: filename: {}; sheetname:{}'.format(filename, sheetname)
    print(msg)


def main():
    if len(sys.argv) == 1:
        print("python3", sys.argv[0], "excel file path")
        sys.exit()
    else:
        filename = sys.argv[1]

    wb = openpyxl.load_workbook(filename)
    data = []
    for sn in SHEETLIST:
        if sn == '源数据-汇总表':
            continue
        rst = read_as_dict(wb, sn)
        if sn in DEFECTS:
            for d in rst:
                d['问题类型'] = '缺陷Aone'
                d['状态更新时间'] = d['更新时间']
                try:
                    d['工单号'] = d['工单ID']
                except Exception as e:
                    pass
        else:
            for d in rst:
                d['问题类型'] = '需求Aone'
        data += rst

    rst = []
    rst_title = list(ALL.keys())
    for d in data:
        nd = {}
        for k in rst_title:
            try:
                nd[k] = d[k]
            except Exception as e:
                nd[k] = ''
        rst.append(nd)

    save_to_excel(filename, rst, '源数据-汇总表')

if __name__ == '__main__':
    main()

上一版本代码:

#!/usr/bin/python3.8
#coding:utf-8

from openpyxl import Workbook
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter, column_index_from_string
import sys


if len(sys.argv) == 1:
    print("python3",sys.argv[0],"Execl_Path")
    sys.exit()
else:
    Execl = sys.argv[1]

wb = load_workbook(Execl)
ws1 = wb.create_sheet("源数据-汇总表")



All = {
    "问题类型":"A",
    "ID":"B",
    "标题":"C",
    "状态":"D",
    "作者":"E",
    "作者的主管":"F",
    "指派给":"G",
    "指派给的主管":"H",
    "创建时间":"I",
    "优先级":"J",
    "模块":"K",
    "归属项目":"L",
    "标签":"M",
    "版本":"N",
    "更新时间":"O",
    "状态更新时间":"P",
    "验收版本":"Q",
    "修复于时间":"R",
    "关闭于":"S",
    "版本号":"T",
    "缺陷来源":"U",
    "客户":"V",
    "工单号":"W",
    "客户名称":"X",
    "项目名称":"Y",
    "改善机会":"Z",
    "潜在影响":"AA",
    "是否国产化":"AB",
    "专有云形态":"AC",
    "评论":"AD",
    "响应时间(天)":"AE",
    "修复时间(天)":"AF",
    "关闭时间(天)":"AG",
    "周次":"AH",
    "所属行业":"AI",
    "重点产品":"AJ",
    "提交团队":"AK",
    "重要客户":"AL",
}


sheet_name = {
    'Aone25_dict':[{'源数据-L2.5':
		["ID",
		"标题",
		"状态",
		"作者",
		"作者的主管",
		"指派给",
		"指派给的主管",
		"创建时间",
		"优先级",
		"模块",
		"归属项目",
		"标签",
		"版本",
		"更新时间",
		"修复于时间",
		"关闭于",
             "工单号",
		"评论",
		"响应时间(天)",
		"修复时间(天)",
		"关闭时间(天)"],
		'Aone25':{}},'缺陷Aone'],
    'Support_dict':[{'源数据-SUPPORT':
		["ID",
    	"标题",
    	"状态",
    	"作者",
    	"作者的主管",
    	"指派给",
    	"指派给的主管",
    	"创建时间",
    	"优先级",
    	"模块",
    	"归属项目",
    	"标签",
    	"版本",
    	"更新时间",
    	"修复于时间",
    	"关闭于",
    	"版本号",
    	"缺陷来源",
    	"客户",
    	"工单号",
    	"客户名称",
    	"是否国产化",
    	"专有云形态",
    	"评论",
    	"响应时间(天)",
    	"修复时间(天)",
    	"关闭时间(天)"
      "所属行业",
      "重点产品",
      "提交团队",
      "重要客户"],
    	'Support':{}},"缺陷Aone"],
    'XQ_demand_dict':[{'源数据-专有云需求':
		["ID",
    	"标题",
    	"状态",
    	"作者",
    	"指派给",
    	"创建时间",
    	"更新时间",
    	"状态更新时间",
    	"优先级",
    	"模块",
    	"归属项目",
    	"标签",
    	"版本",
    	"验收版本",
    	"项目名称",
    	"改善机会",
    	"潜在影响",
    	"是否国产化",
    	"专有云形态",
    	"评论",
      "重要客户",
      "所属行业",
      "重点产品",
      "提交团队",
      "重要客户"],
    	'XQ_demand':{}},'需求Aone'],
    'No_demand_dict':[{'源数据-线下非需求':
    	["ID",
    	"标题",
    	"状态",
    	"作者",
    	"指派给",
    	"创建时间",
    	"优先级",
    	"模块",
    	"归属项目",
    	"标签",
    	"版本",
    	"更新时间",
    	"状态更新时间",
    	"验收版本",
    	"项目名称",
    	"改善机会",
    	"潜在影响",
    	"评论",
      "重要客户",
      "所属行业",
      "重点产品",
      "提交团队"],
    	'No_demand':{}},'需求Aone'],
    'Off_defect_dict':[{'源数据-线下非缺陷':
    	["ID",
    	"标题",
    	"状态",
    	"作者",
    	"作者的主管",
    	"指派给",
    	"指派给的主管",
    	"创建时间",
    	"优先级",
    	"模块",
    	"归属项目",
    	"标签",
    	"版本",
    	"更新时间",
    	"修复于时间",
    	"关闭于",
    	"工单号",
    	"客户名称",
    	"评论",
    	"响应时间(天)",
    	"修复时间(天)",
    	"关闭时间(天)"
      "重要客户",
      "所属行业",
      "重点产品",
      "提交团队"],
    	'Off_defect':{}},'缺陷Aone']
}


# 写入Title
for Id,title in enumerate(All.keys(),1):
    ws1.cell(row=1, column=Id, value=title)


def acquire_sheel(sheet_name,*sheet_var):
    # 获取所有sheet列表
    var = sheet_var[0].keys()
    if list(var)[0] in wb.sheetnames:
        cur_sheel = list(var)[0]
    else:
        return False,False,False
    ws = wb[cur_sheel]
    Max_col = ws.max_column
    return ws,Max_col,sheet_var

def generate_Dict(*sheet_var):
    # 自动生成字段与单元的对应关系
    for i in range(1,Max_col):
        Cell = sheet_var[0]
        if ws.cell(1,int(i)).value in list(Cell.values())[0]:
            new_dict = list(Cell.keys())[1]
            Cell[new_dict][get_column_letter(i)] = ws.cell(1,int(i)).value
    return Cell[new_dict]


def writeData(Id,ws,sheet_var,**sheet):
    for key,value in sheet.items():
        # 取值
        for line,data in enumerate(ws[key],1):
            line += Id
            # 只要是开头行信息就跳过
            if data.value in sheet.values():
                continue
            # 设置写入方式
            ws1[All.get("问题类型") + str(line)] = sheet_var[1]
            ws1[All.get("周次") + str(line)] = '=WEEKNUM(' + All.get("创建时间") + str(line) + ')'
            ws1.cell(row=line,column=column_index_from_string(All.get(value)),value=data.value)
    Id = line - 1
    return Id


if __name__ == '__main__':
    # 写入
    Id = 0
    for sheet_key,sheet_var in sheet_name.items():
        ws,Max_col,sheet_var = acquire_sheel(sheet_name,*sheet_var)
        if not sheet_var:continue
        sheet = generate_Dict(*sheet_var)
        Id = writeData(Id,ws,sheet_var,**sheet)
        wb.save(Execl)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值