只要是和数据打交道的人,就避免不了接触 Excel。对于大量的重复性工作,靠人工往往会耗费大量的时间。借助 Python 编程,可以批量自动化完成这些操作,起到事半功倍的效果。我们知道 Pandas 模块它能够方便快捷地处理 Excel 数据,但是对于 Excel 格式的设置,借助 `openpyxl` 模块是一个很好的选择,这也是本文的重点内容。案例:插入图片与图形绘制
+批量读取本地图片,将它插入 Excel 单元格。批量读取 Excel 中的数据,并绘制相关图形。本小节将为大家讲述如何利用 openpyxl 模块将本地图片插入 Excel 单元格,以及如何读取 Excel 中的数据并绘制相关图形。1. 单元格插入图片
Excel 单元格中插入图片的本质,其实就是将图片悬浮在单元格之上,为了让图片感觉像是插入到了单元格中,需要将单元格的行高和列宽设置为和图片大小一致。
from openpyxl import Workbookfrom openpyxl.drawing.image import Imageim = Image("python.png")im.height, im.width # (413, 1821)wb = Workbook()ws = wb.activews.add_image(im, "A1")def ch_height(height): return height * 13.5 / 18def ch_width(width): return width * 8.38 / 68ws.row_dimensions[1].height = ch_height(im.height)ws.column_dimensions["A"].width = ch_width(im.width)wb.save("插入图片.xlsx")
首先,我们需要导入 openpyxl.drawing.image 模块中的 Image() 方法(见 1),用于读取本地图片(见 2),它会返回一个图片对象 im。这个对象还有两个常用属性 width 和 height,用于获取图片的像素宽和像素高(见 3)。接着,调用工作表对象 add_image() 方法,可以将上述图片插入 Excel 指定单元格(见 4)。由于图片的像素宽和像素高与 Excel 中单元格的宽和高的单位并不一致,因此我们定义了两个转换函数(见 5、6),用于统一单位。最后利用赋值操作,即可将单元格的行高和列宽调整为与图片大小一致(见 7、8),最终效果如图所示。小贴士
Excel 2013 中的行高和列宽分别是 13.5 和 8.38,它们的单位并不一致。但是行高 13.5 对应的像素值大约是 18px,列宽 8.38 对应的像素值大约是 68px。不同版本的 Excel 的默认行高可能不同,大家仍可以利用这个关系来进行单位转换。
2. 相关图形的绘制
openpyxl 模块支持绘制的图形有很多,我们很难记住它们每一个的用法,掌握绘图原理是重中之重。整个绘图流程一共包括 6 个步骤,分别介绍如下。
了解了绘图流程后,我们将以“折线图”为例,为大家讲述如何利用 openpyxl 绘图。如图所示的工作簿,请绘制出“某公众号不同月份关注人数”的折线图。from openpyxl import load_workbookfrom openpyxl.chart import LineChart, Referencewb = load_workbook("图形绘制.xlsx")ws = wb["折线图"]chart = LineChart()data = Reference(ws, min_row=1, max_row=13, min_col=2, max_col=2)chart.add_data(data, titles_from_data=True)chart.title = "公众号不同月份的关注人数"chart.y_axis.title = "关注人数"chart.x_axis.title = "月份"ws.add_chart(chart, "D1")wb.save("图形绘制_折线图.xlsx")
首先,我们打开了一个本地的工作簿,并获取了工作簿对象 wb 和工作表对象 ws(见 2、3)。接着,调用 LineChart() 方法,创建一个空坐标系对象 chart(见 4),图形将绘制在这个坐标系上。向坐标系中添加数据源之前,首先应该选择数据源。这里需要提前导入 Reference() 方法(见 1),直接调用该方法即可帮助我们选择数据源(见 5)。然后再调用坐标系对象的 add_data() 方法(见 6),即可将选择好的数据源添加到坐标系中。紧接着,我们还为图形设置了一些图表元素,像图表标题(见 7)、x 轴标题(见 9)、y 轴标题(见 8)。通过上述操作,我们已经绘制了一个完整的图形。此时,调用工作表对象的 add_chart() 方法(见 10),即可将图形在指定位置完整呈现。小贴士
利用 openpyxl 模块绘制的图形,是可以在 Excel 中修改图形参数的。
自动化excel的完整版文章pdf以及示例的excel源文件和jupyter源文件,我打包上传到网盘,可以私信回复“自动化excel”获取下载地址