关于python:Python快速导入源excel表格内容到目标excel表格

5次阅读

共计 4257 个字符,预计需要花费 11 分钟才能阅读完成。

1. excel 表格格局

1.1. 源 excel 表格内容

Sheet1

ID Module Owner Result Comment
C000001 LTE 郭靖 Support 默认反对
C000002 TD-SCDMA 郭靖 Not Support 硬件不反对
C000004 WCMDA 郭靖 Support
C000005 CDMA2000 郭靖 Not Support
C000006 HSDPA 郭靖 Support
C000007 EDGE 郭靖 Support
C000008 GPRS 郭靖 Support
C000009 GSM 郭靖 Support
C000010 WIFI 黄蓉 Support
C000011 FM 黄蓉 Support
C000012 GPS 黄蓉 Support
C000013 RFID 杨过 Not Support
C000014 NFC 杨过 Support

Sheet2

ID Module Owner Result Comment
C000001 Call 令狐冲 Support
C000003 Message 令狐冲 Support
C000004 Music 萧峰 Not Support 价格太高未预置

1.2. 指标 excel 表格内容

Sheet1

ID Module Owner Result Comment
C000001
C000002
C000003
C000004
C000005
C000006
C000007
C000008
C000009
C000010
C000011
C000012
C000013
C000014

Sheet2

ID Module Owner Result Comment
C000001
C000002
C000003
C000004

2. 如何导入源 excel 表格的内容到指标 excel 表格

2.1. 设计要导入的配置文件

config.ini

[Sheet1]
srcKeyColumn = A
dstKeyColumn = A
srcValueColumnStart = B
dstValueColumnStart = B
cycle = 4

[Sheet2]
srcKeyColumn = A
dstKeyColumn = A
srcValueColumnStart = B
dstValueColumnStart = B
cycle = 4

2.2. Python 程序

excel_fill.py

import configparser
import openpyxl

class ReadConfig(object):
    
    def get_excel_column_number(self, column):
        '''
        Parameters
        ----------
        column : string
            示意 excel 表格中列的字符串,该字符串如果为字母则转为数字,如果为数字字符串则间接转型

        Returns
        -------
        TYPE
            数字.
        '''
        if column.isalpha():
            return openpyxl.utils.column_index_from_string(column)
        else:
            return int(column)

    def get_config(self, configfile):
        '''
        Parameters
        ----------
        configfile : string
            配置文件名称. 如下例子
            [Sheet0]                    --- 示意 excel 表格 (两个,一个是源文件,一个指标文件) 的 Sheet0 页面
            srcKeyColumn = 1            --- 示意源 excel 表格的 key 所在的列
            dstKeyColumn = 1            --- 示意指标 excel 表格的 key 所在的列
            srcValueColumnStart = 27    --- 示意源 excel 表格的 value 开始列
            dstValueColumnStart = 27    --- 示意指标 excel 表格的 value 开始列
            cycle = 4                   --- 示意总共有几列 value 须要拷贝

        Returns
        -------
        dict_index : list
            把上述配置文件生成为一个 list,list 里的每个项是 dict 类型,不便程序应用.
        '''
        config = configparser.ConfigParser()
        config.read(configfile, encoding='utf-8')
        dict_index = []
        for sheet in config.sections():
            dict_pair = {}
            dict_pair['sheet'] = sheet
            srckeylist = []
            for srckey in config.get(sheet,'srcKeyColumn').split(','):
                key = srckey.strip()
                srckeylist.append(self.get_excel_column_number(key))
            dict_pair['srcKeyColumn'] = srckeylist
            dstkeylist = []
            for dstkey in config.get(sheet,'dstKeyColumn').split(','):
                key = dstkey.strip()
                dstkeylist.append(self.get_excel_column_number(key))
            dict_pair['dstKeyColumn'] = dstkeylist
            dict_pair['srcValueColumnStart'] = self.get_excel_column_number(config.get(sheet,'srcValueColumnStart'))
            dict_pair['dstValueColumnStart'] = self.get_excel_column_number(config.get(sheet,'dstValueColumnStart'))
            dict_pair['cycle'] = int(config.get(sheet,'cycle'))
            dict_index.append(dict_pair)
        return dict_index


class CopyExcel(object):

    def read_key_and_value_from_src(self, sheet, key_list, content_column):
        '''
        Parameters
        ----------
        sheet : string
            源 excel 表格的 sheet 页面名称.
        key_list : list
            在 excel 表格中,以几列的组合作为 key,这里 list 蕴含了几列的列数.
        content_column : number
            要读取的 excel 表格的列.

        Returns
        -------
        src_key_and_value : dict
            获取的键值对.
        '''
        src_key_and_value = {}
        for row_count in range(1, sheet.max_row + 1, 1):
            key = ""
            for key_item in key_list:
                key = key + str(sheet.cell(row = row_count, column = key_item).value)
            value = sheet.cell(row = row_count, column = content_column).value
            
            if (key not in ["", None]) and (value not in ["", None]):
                src_key_and_value[key] = value
        return src_key_and_value

    def write_value_to_dst_by_key(self, sheet, key_list, content_column, src_key_and_value):
        '''
        Parameters
        ----------
        sheet : string
            指标 excel 表格的 sheet 页面名称.
        key_list : list
            在 excel 表格中,以几列的组合作为 key,这里 list 蕴含了几列的列数.
        content_column : number
            要写入的 excel 表格的列.
        src_key_and_value : dict
            键值对,依据匹配的键在对应 column 写入值.

        Returns
        -------
        None.

        '''
        for row_count in range(1, sheet.max_row + 1, 1):
            key = ""
            for key_item in key_list:
                key = key + str(sheet.cell(row = row_count, column = key_item).value)
                if key in src_key_and_value.keys():
                    #print(key)
                    sheet.cell(row = row_count, column = content_column, value=src_key_and_value[key])


if __name__ == '__main__':
    excel_config = ReadConfig()
    dict_index = excel_config.get_config('config.ini')

    src_excel_file = r"Src.xlsx"
    src_wb = openpyxl.load_workbook(src_excel_file)

    dst_excel_file = r"Dst.xlsx"
    dst_wb = openpyxl.load_workbook(dst_excel_file)

    copy_excel = CopyExcel()
    for item in dict_index:
        src_sheet = src_wb[item['sheet']]
        dst_sheet = dst_wb[item['sheet']]
        for i in range(item['cycle']):
            src_key_and_value = copy_excel.read_key_and_value_from_src(src_sheet, item['srcKeyColumn'], item['srcValueColumnStart'] + i)
            copy_excel.write_value_to_dst_by_key(dst_sheet, item['dstKeyColumn'], item['dstValueColumnStart'] + i, src_key_and_value)

    dst_wb.save(dst_excel_file)

3. 参考文档

1. 表格中的模块选用了如下 link 的模块
手机的电话流量 wifi 等性能都离不开 RF 模块,它是怎么工作的?
https://www.jianshu.com/p/9bf…
2.Markdown 教程
https://www.runoob.com/markdo…

正文完
 0