在工作中,需要处理一张很大的数据表格,如果使用人工来查验,就很伤。所以,想到用工具来处理。
原来这个表格是在一个PDF中,我先是把它从PDF中转为 Excel,然后再用openpyxl处理表格
一、需求和功能
目标是 统计有父子关系的两个控件, 如下图所示:
第一行是 父控件 , 第一列是 子控件。 表中的X代表,有父子关系。
需要统计出:
每一个父控件,有哪些子控件。比如 统计出 上图中 BasicContainer的所有子控件有哪些。
处理结果: 第一行是 父控件的名字 ,每一列从第二行开始,是每个父控件的子控件。
二、程序设计 和 实现
首先,需要加载原 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') # 获取sheetsheet.cell(row,colum).value = input # 给sheet中的单元格赋值
wb.save('result.xlsx') # 保存新的Excel名