Python中使用openpyxl库 处理Excel表格,将结果保存到生成的新的Excel表格

在工作中,需要处理一张很大的数据表格,如果使用人工来查验,就很伤。所以,想到用工具来处理。

原来这个表格是在一个PDF中,我先是把它从PDF中转为 Excel,然后再用openpyxl处理表格

一、需求和功能

目标是 统计有父子关系的两个控件, 如下图所示:

第一行是 父控件 , 第一列是 子控件。   表中的X代表,有父子关系。

Python中使用openpyxl库 处理Excel表格,将结果保存到生成的新的Excel表格_第1张图片

 需要统计出:

        每一个父控件,有哪些子控件。比如 统计出 上图中 BasicContainer的所有子控件有哪些。

        处理结果: 第一行是 父控件的名字 ,每一列从第二行开始,是每个父控件的子控件。

Python中使用openpyxl库 处理Excel表格,将结果保存到生成的新的Excel表格_第2张图片

二、程序设计 和 实现

首先,需要加载原 excel表格中的数据,遍历所有的数据。 通过 是否存在 X,来判断,是否做 父子关系处理。

再者,处理父子关系,然后保存到一个新的excel表格中。

程序实现如下:

############################################
##功能介绍:将WidgetContainer.xlsx中的
##二维矩阵型父子关系的widget,整理成
##第一行是父控件,下面所属列是 子控件
############################################

import openpyxl

class Fileobj(object):
    wb = None
    _instance = None
    sheet = None
    clom = None
    def __init__(self):
        Fileobj.wb = openpyxl.Workbook()
        ws = Fileobj.wb.active
        ws.title = 'parent-child'
        Fileobj.sheet = Fileobj.wb['parent-child']

    # 单实例, 可以用于多个 处理程序 把结果,写入到 同一个生成文件中
    def get_instance(self):
        if Fileobj._instance is None:
            Fileobj._instance = Fileobj()
        return Fileobj._instance

    # 写一行 parent 的 名字
    def writeline(self,clo,name):
        Fileobj.sheet.cell(1,clo).value = name

    def getclonum(self):
        Fileobj.clom = Fileobj.sheet.max_column

    #写 每列 子widget的名字
    def writedata(self,numer,parentname,childname):
        #print("numer:%s parentname:%s childname:%s"%(numer,parentname,childname))

        for i in range(1,Fileobj.clom+1):
            if Fileobj.sheet.cell(1,i).value == parentname:
                Fileobj.sheet.cell(numer+1, i).value = childname

    def close(self):
        Fileobj.wb.save('result.xlsx')




wb = openpyxl.load_workbook('WidgetContainer.xlsx')
sheet = wb['Sheet1']

rows = sheet.max_row
columns = sheet.max_column

fp = Fileobj.get_instance(Fileobj())

#把母widget初始化,第一行
for col in range(2,columns+1):
    parent = sheet.cell(1,col).value
    fp.writeline(col-1,parent)

fp.getclonum()

for col in range(2,columns+1):
    numer = 0
    for row in range(2,rows+1):
        if sheet.cell(row,col).value=='X':
            numer = numer+1
            parent = sheet.cell(1,col).value
            child = sheet.cell(row,1).value
            fp.writedata(numer,parent,child)
fp.close()


 三、总结

python中的 for m in range(1,n)   对m赋值是不包含n的,遍历范围是 1 ~ n-1

python 中使用 openpyxl 创建新的Excel表格 步骤:

        wb = openpyxl.Workbook()
        ws = wb.active   
        ws.title = 'parent-child'   
        sheet = wb.get_sheet_by_name('parent-child')   # 获取sheet

        sheet.cell(row,colum).value = input   # 给sheet中的单元格赋值

        wb.save('result.xlsx')     # 保存新的Excel名

你可能感兴趣的:(python,python)