以下文章来源于Python技术 ,作者派森酱
Python 技术由一群热爱 Python 的技术人组建,专业输出高质量原创的 Python 系列文章,Python程序员都在这里。
二条:用Python来做一个屏幕录制工具! 三条:爬虫必备工具,掌握它就解决了一半的问题
↑ 关注 + 星标 ,每天学Python新技能
后台回复【大礼包】送你Python自学大礼包
无论是日常办公还是编程,总是离不开 Excel,用来导入导出数据,记录数据,统计分析,画原型,甚至在日本有位老爷爷用 Excel 来创作绘画
虽然 Excel 功能强大,操作便利,但是有些场景下还是不太方便,例如 将大量数据导入到 Excel,将 Excel 中的数据读取到系统中,或者按照某种结构格式化下原有数据,批量处理大量 Excel 文档等,幸运的是,有很多 Python 库可以帮助我们用程序来控制 Excel,完成难以手工完成的任务,现在就来了解下吧
Python 中有大量的原生和第三方 Excel 操作包,各有所长,不过对于刚使用 Python 与 Excel 交互的同学来说,可能有点目不暇接,所以先简单梳理一下常见的一些 Excel 包
概括一下:
OpenPyXl 几乎可以实现所有的 Excel 功能,而且接口清晰,文档丰富,学习成本相对较低,今天就以 OpenPyXL 为例,了解下如何操作 Excel
用 pip 安装
pip install openpyxl安装成功后,可以跑通下面测试:
python -c "import openpyxl"先来看跑个测试
from openpyxl import Workbook# 创建一个 workbookwb = Workbook()# 获取被激活的 worksheetws = wb.active# 设置单元格内容ws['A1'] = 42# 设置一行内容ws.append([1, 2, 3])# python 数据类型可以被自动转换import datetimews['A2'] = datetime.datetime.now()# 保存 Excel 文件wb.save("sample.xlsx")
需要注意的是:
表单 激活,通过 wb.active 获取引用python-docx work 库一样,save 方法会立即保存,不会有任何提示,建议选择不同文件名来保存OpenPyXl 功能很多,从单元格处理到图表展示,涵盖了几乎全部的 Excel 功能,这里就一些常用的功能做展示,更多的用法可以参考 OpenPyXl 文档(文末参考里有链接)
小试牛刀部分看到了如何创建一个 Excel
如果要加载一个已存在的 Excel 文件,需要用 load_workbook 方法,给定文件路径,返回 workbook 对象:
from openpyxl import load_workbookwb = load_workbook('test.xlsx')# 显示文档中包含的 表单 名称print(wb.sheetnames)
load_workbook 除了参数 filename外为还有一些有用的参数:
read_only:是否为只读模式,对于超大型文件,要提升效率有帮助keep_vba :是否保留 vba 代码,即打开 Excel 文件时,开启并保留宏guess_types:是否做在读取单元格数据类型时,做类型判断data_only:是否将公式转换为结果,即包含公式的单元格,是否显示最近的计算结果keep_links:是否保留外部链接from openpyxl import Workbookwb = Workbook()ws = wb.activews1 = wb.create_sheet("sheet") #创建一个 sheet 名为 sheetws1.title = "新表单" # 设置 sheet 标题ws2 = wb.create_sheet("mysheet", 0) # 创建一个 sheet,插入到最前面 默认插在后面ws2.title = u"你好" # 设置 sheet 标题ws1.sheet_properties.tabColor = "1072BA" # 设置 sheet 标签背景色# 获取 sheetws3 = wb.get_sheet_by_name(u"你好")ws4 = wb['New Title']# 复制 sheetws1_copy = wb.copy_worksheet(ws1)# 删除 sheetwb.remove(ws1)
单元格(cell)是 Excel 中存放数据的最小单元,就是图形界面中的一个个小格子
OpenPyXl 可以操作单个单元格,也可以批量操作单元格
单独操作,即通过 Excel 单元格名称或者行列坐标获取单元格,进行操作
ws1 = wb.create_sheet("Mysheet") #创建一个sheet# 通过单元格名称设置ws1["A1"]=123.11ws1["B2"]="你好"# 通过行列坐标设置d = ws1.cell(row=4, column=2, value=10)
需要一下子操作多个单元格时,可以用批量操作来提高效率
# 操作单列for cell in ws["A"]:print(cell.value)# 操作单行for cell in ws["1"]:print(cell.value)# 操作多列for column in ws['A:C']:for cell in column:print(cell.value)# 操作多行for row in ws['1:3']:for cell in row:print(cell.value)# 指定范围for row in ws['A1:C3']:for cell in row:print(cell.value)
# 所有行for row in ws.iter_rows():for cell in row:print(cell.value)# 所有列for column in ws.iter_cols():for cell in column:print(cell.value)
ws.append((1,2,3))# 合并ws.merge_cells('A2:D2')# 解除合并ws.unmerge_cells('A2:D2')ws.merge_cells(start_row=2,start_column=1,end_row=2,end_column=4)ws.unmerge_cells(start_row=2,start_column=1,end_row=2,end_column=4)
OpenPyXl 用6种类来设置单元格的样式
NumberFormat 数字Alignment 对齐Font 字体Border 边框PatternFill 填充Protection 保护from openpyxl.styles import Font, PatternFill, Border, Side, Alignment, Protectionfrom openpyxl.styles import numberswb = Workbook()ws = wb.activews.cell(row=1, column=1, value='宋体').font = Font(name=u'宋体', size=12, bold=True, color='FF0000')ws.cell(row=2, column=2, value='右对齐').alignment = Alignment(horizontal='right')ws.cell(row=3, column=3, value='填充渐变色').fill = PatternFill(fill_type='solid', start_color='FF0000')ws.cell(row=4, column=4, value='设置边线').border = Border(left=Side(border_style='thin', color='FF0000'), right= Side(border_style='thin', color='FF0000'))ws.cell(row=5, column=5, value='受保护的').protection = Protection(locked=True, hidden=True)ws.cell(row=6, column=6, value=0.54).number_format =numbers.FORMAT_PERCENTAGE
ws.cell(1, 1).font.color = '00FF00' 会报错,如果真要换,需要重新创建一个样式实体,重新赋值上面展示的是单个单元格格式的设置,也可以批量设置,有两种方式,一种是循环范围内的所有单元格,逐个设置,另一种是对整列或者整行设置:
font = Font(bold=True)# 遍历范围内的单元格for row in ws['A1:C3']:for cell in row:cell.font = font# 设置整行row = ws.row_dimensions[1]row.font = font# 设置整列column = ws.column_dimensions["A"]column.font = font
更多样式类的定义和参数,可参 OpenPyXl 文档
图表是 Excel 中很重要的部分,作为数据可视化的高效工具,利用 OpenPyXl 可以用编程的方式,在 Excel 中制作图表,创建过程和直接在 Excel 中差不多,下面以柱状图和圆饼图为例做演示
from openpyxl import Workbookfrom openpyxl.chart import BarChart, Referencewb = Workbook()ws = wb.activerows = [('月份', '苹果', '香蕉'),(1, 43, 25),(2, 10, 30),(3, 40, 60),(4, 50, 70),(5, 20, 10),(6, 10, 40),(7, 50, 30),]for row in rows:ws.append(row)chart1 = BarChart()chart1.type = "col"chart1.style = 10chart1.title = "销量柱状图"chart1.y_axis.title = '销量'chart1.x_axis.title = '月份'data = Reference(ws, min_col=2, min_row=1, max_row=8, max_col=3)series = Reference(ws, min_col=1, min_row=2, max_row=8)chart1.add_data(data, titles_from_data=True)chart1.set_categories(series)ws.add_chart(chart1, "A10")
col 为列状图,bar 为水平图from openpyxl import Workbookfrom openpyxl.chart import PieChart, Referencedata = [['水果', '销量'],['苹果', 50],['樱桃', 30],['橘子', 10],['香蕉', 40],]wb = Workbook()ws = wb.activefor row in data:ws.append(row)pie = PieChart()pie.title = "水果销量占比"labels = Reference(ws, min_col=1, min_row=2, max_row=5)data = Reference(ws, min_col=2, min_row=1, max_row=5)pie.add_data(data, titles_from_data=True)pie.set_categories(labels)ws.add_chart(pie, "D1")
今天以 OpenPyXl 库为例,了解了 Python 操作 Excel 的基本方法,限于篇幅,无法全面的清晰的介绍更多功能,期望通过这篇短文,激发起您多程序化操作 Excel 的兴趣,让让工作、学习更高效,就如那句名言一样:“ 人生苦短,我用 Python”