人生苦短,我学python!


python处理excel的特点

说到操作excel,很多时候单一表格的数据处理直接使用公式即可解决问题,稍微复杂一点使用自带的VBA也是个不错的选择。

但是对于数据量大,操作步骤繁琐,还涉及第三方的数据接入或者对接的话,使用python绝对可以起飞。python的pandas库处理数据可以非常快速,而且python可以使用多线程运行程序(io密集型的数据处理效率更高)。

python操作excel的库常用的有几个,这边主要接触了xlrd、xlwt和openpyxl,前两个库分别是读取和写入xls文件的(也就是不支持xlsx文件);如果要操作xlsx文件的话建议使用openpyxl库(可支持读写),但是读写效率并不高。如果再不写入数据的情况下要提升数据处理效率的话,使用xlrd单独读取文件是最快的。


操作excel文件

操作excel之前一定要了解整个处理步骤,基本上表格操作都是针对单元格的,也就是需要定位到具体的单元格,我们就可以实现值的读取、修改和写入。

记住具体的excel用wb表示,具体的sheet表用ws表示,单元格用cell属性、也可以使用行列定位具体的单元格,详细的使用方法如下介绍,更多的使用方法可以参考官方文档,包括修改单元格颜色和字体、合并单元格、自动换行等:

#导入对应的库,下面两个库分别用来创建表格和载入已有表格

from openpyxl import Workbook

from openpyxl import load_workbook

#wb是代表一个excel表格,可以创建,也可以是load本地表格

wb = Workbook()

wb = load_workbook(filename ='empty.xlsx')

#ws是代表一个sheet表,'sheet name'是已有的表格名,也可使用create_sheet创建表格,0代表第一个表格,1代表第二个表格

ws_sheet = wb['sheet name'] ws_support = wb.create_sheet('support',0) ws_product = wb.create sheet('product',1)

#实际赋值都是针对单元格处理的,可使用cell(row= ,column= ).value= #也可使用ws['A1']

for i in range(9): ws_support.cell(row=i//3+2, column=i%3+2).value=list[i]

#迭代查看单元格,可用value属性查看具体的值,cell.value

for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):

for cell in row:

print(cell)

for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):

for cell in col:

print(cell)


创建图表

下面主要介绍两种excel图表的创建,分别是3D柱状图和饼图,其余图表可参考官方文档。

#导入图表的相关库

from openpyxl.chart import ( BarChart3D, LineChart, Series, PieChart, Reference )

#3D柱状图

rows = [ (None, 2013, 2014), ("Apples", 5, 4), ("Oranges", 6, 2), ("Pears", 8, 3) ]

for row in rows:

ws.append(row)

data = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=4) titles = Reference(ws, min_col=1, min_row=2, max_row=4)

chart = BarChart3D()

chart.title = "3D Bar Chart" chart.add_data(data=data, titles_from_data=True) chart.set_categories(titles)

ws.add_chart(chart, "E5")


#饼图

data = [ ['Page', 'Views'], ['Search', 95], ['Products', 4], ['Offers', 0.5], ['Sales', 0.5], ]

for row in data:

ws.append(row)

projected_pie = ProjectedPieChart() projected_pie.type = "pie" projected_pie.splitType = "val" # 根据值分割

labels = Reference(ws, min_col=1, min_row=2, max_row=5)

data = Reference(ws, min_col=2, min_row=1, max_row=5) projected_pie.add_data(data, titles_from_data=True) projected_pie.set_categories(labels)

ws.add_chart(projected_pie, "A10")