python之excel数据处理入门学习(1)
本次使用excel案例为2020年数学建模大赛C题部分示例
一、读取excel
要进行excel处理,首先需要将excel数据读入python中。这里推荐使用openpyxl读取excel文件。具体下载步骤不作讲述,直接上代码:
import openpyxl
wb = openpyxl.load_workbook("1.xlsx")
首先将自己的excel文件放置于工程中,这样可以方便引用。在此博主将文件名改为“1.xlsx”,方便导入
通过该步骤,定义一个wb(workbook)将xlsx文件读入进来了。
二、读取sheet
众所周知,excel结构为 工作簿,sheet,行列单元格
此前已读入wb为workbook,该变量中包含了原xlsx表中的多个sheet,在知道表名的情况下,可以这样引用:
sheet1=wb['mysheet']
在此我们print一下:
print(sheet1)
得到:
由此可见,这是一个Worksheet类型的变量。
从引用方式可以很清楚地看出workbook与sheet之间的从属关系,那么反过来由从属关系来记忆这样的存储方案是不是也是很容易呢?
既然是从属关系,我们便经常会去遍历整个工作簿中呢sheet,那么遍历应当用到什么?
当然是for循环了!
for sheet in wb:
a=sheet
print(a)
通过Worksheet a遍历了整个工作簿。
三、引用单元格
同工作簿和工作表的关系一样,工作表与单元格也是从属关系,单元格有如下属性:
1)单元行
2)单元列
3)单元格内容
可采用如下方式引用单元格。
A1=sheet1['A1']
我们打印一下:
print(sheet1['A1'])
可得到:
可见A1为Cell类型变量。
要引用单元格中的内容,可采用如下方案:
sheet1['A1'].value,sheet1['A1'].row,sheet1['A1'].column
value为内容,row为行,column为列
有时需要规定单元格的范围,可采用如下定义方案:
rowrange = a['2:6']
columnrange = a['B:C']
这样便定义了行与列的范围,在实际遍历时进行引用。
三、实例
下面通过实例进行进一步的学习:
根据题意统计进项发票信息中各个企业的金额总数,发票数量,有效发票数量
表格信息如下:
1.确定数据结构:
我们要完成题设的统计各个企业金额,发票数量,有效发票数量,首先应当理清这当中的数据结构。
可以得知,若以每个企业为单位的话,每个企业中应当包含金额,发票数量,有效发票数量三个量。
那么我们将企业定义为一个字典,字典下辖金额,发票数量,有效发票数量。
2.文件读取与定义:
确定完数据结构后,便进行xlsx文件的读取,代码如下:
wb = openpyxl.load_workbook("1.xlsx")
sheet1=wb['进项发票信息']
codeData={}
3.遍历单元格并进行累加计算
for row in range(2,sheet1.max_row+1):
code=sheet1['A'+str(row)].value
jine=sheet1['E'+str(row)].value
fapiao=sheet1['H'+str(row)].value
codeData.setdefault(code,{'jine':0,'num':0,'youxiao':0})
codeData[code]['num'] +=1
codeData[code]['jine'] += float(jine)
if fapiao=="有效发票":
codeData[code]['youxiao'] += 1
上述首先遍历所有行,得到公司代码,金额,发票单元格信息。
使用codeData.setdefault进行初始定义。这样的好处是,遍历过程中会自动对为存在的企业进行建项,已存在的企业便跳过初始化步骤。
初始化完毕后,对num项进行数量累加,对金额项进行数值累加,对发票项进行条件累加。
最终,查看codeData:
codeData为一个字典,字典中包括公司代码"E1".“E2”…… 公司代码下又下辖金额jine,数量num,有效发票数量youxiao。
得到字典的保存与写入等更多操作,敬请期待……
|