- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
12.10 调整行和列
在Excel中,调整行和列的大小非常容易,只要点击并拖动行的边缘,或列的头部。但如果你需要根据单元格的内容来设置行或列的大小,或者希望设置大量电子表格文件中的行列大小,编写Python程序来做就要快得多。
行和列也可以完全隐藏起来。或者它们可以“冻结”,这样就总是显示在屏幕上,如果打印该电子表格,它们就出现在每一页上(这很适合做表头)。
12.10.1 设置行高和列宽
Worksheet对象有row_dimensions和column_dimensions属性,控制行高和列宽。在交互式环境中输入以下代码:
>>> import openpyxl >>> wb = openpyxl.Workbook() >>> sheet = wb.get_active_sheet() >>> sheet['A1'] = 'Tall row' >>> sheet['B2'] = 'Wide column' >>> sheet.row_dimensions[1].height = 70 >>> sheet.column_dimensions['B'].width = 20 >>> wb.save('dimensions.xlsx')
工作表的row dimensions和column dimensions是像字典一样的值,row dimensions包含RowDimension对象,column dimensions包含ColumnDimension对象。在row_dimensions中,可以用行的编号来访问一个对象(在这个例子中,是1或)。在column dimensions中,可以用列的字母来访问一个对象(在这个例子中,是A或B)。
dimensions.xlsx电子表格如图12-6所示。
图12-6 行1和列B设置了更大的高度和宽度
一旦有了RowDimension对象,就可以设置它的高度。一旦有了ColumnDimension对象,就可以设置它的宽度。行的高度可以设置为0到409之间的整数或浮点值。这个值表示高度的点数。一点等于1/72英寸。默认的行高是12.75。列宽可以设置为0到255之间的整数或浮点数。这个值表示使用默认字体大小时(11点),单元格可以显示的字符数。默认的列宽是8.43个字符。列宽为零或行高为零,将使单元格隐藏。
12.10.2 合并和拆分单元格
利用merge_cells()工作表方法,可以将一个矩形区域中的单元格合并为一个单元格。在交互式环境中输入以下代码:
>>> import openpyxl >>> wb = openpyxl.Workbook() >>> sheet = wb.get_active_sheet() >>> sheet.merge_cells('A1:D3') >>> sheet['A1'] = 'Twelve cells merged together.' >>> sheet.merge_cells('C5:D5') >>> sheet['C5'] = 'Two merged cells.' >>> wb.save('merged.xlsx')
merge_cells()的参数是一个字符串,表示要合并的矩形区域左上角和右下角的单元格:'A1:D3'将12个单元格合并为一个单元格。要设置这些合并后单元格的值,只要设置这一组合并单元格左上角的单元格的值。
如果运行这段代码,merged.xlsx看起来如图12-7所示。
图12-7 在电子表格中合并单元格
要拆分单元格,就调用 unmerge_cells()工作表方法。在交互式环境中输入以下代码:
>>> import openpyxl >>> wb = openpyxl.load_workbook('merged.xlsx') >>> sheet = wb.get_active_sheet() >>> sheet.unmerge_cells('A1:D3') >>> sheet.unmerge_cells('C5:D5') >>> wb.save('merged.xlsx')
如果保存变更,然后查看这个电子表格,就会看到合并的单元格恢复成一些独立的单元格。
12.10.3 冻结窗格
对于太大而不能一屏显示的电子表格,“冻结”顶部的几行或最左边的几列,是很有帮助的。例如,冻结的列或行表头,就算用户滚动电子表格,也是始终可见的。这称为“冻结窗格”。在OpenPyXL中,每个Worksheet对象都有一个freeze_panes属性,可以设置为一个Cell对象或一个单元格坐标的字符串。请注意,单元格上边的所有行和左边的所有列都会冻结,但单元格所在的行和列不会冻结。
要解冻所有的单元格,就将freeze_panes设置为None或'A1'。表12-3展示了freeze_panes设定的一些例子,以及哪些行或列会冻结。
表12-3 冻结窗格的例子
freeze_panes的设置
冻结的行和列
sheet.freeze_panes = 'A2'
行1
sheet.freeze_panes = 'B1'
列A
sheet.freeze_panes = 'C1'
列A和列B
sheet.freeze_panes = 'C2'
行1和列A和列B
sheet.freeze_panes = 'A1'或 sheet.freeze_panes = None
没有冻结窗格
确保你有来自http://nostarch.com/automatestuff/的产品销售电子表格。然后在交互式环境中输入以下代码:
>>> import openpyxl >>> wb = openpyxl.load_workbook('produceSales.xlsx') >>> sheet = wb.get_active_sheet() >>> sheet.freeze_panes = 'A2' >>> wb.save('freezeExample.xlsx')
如果将freeze_panes属性设置为'A2',行1将永远可见,无论用户将电子表格滚动到何处,如图12-8所示。
图12-8 将reeze_panes设置为'A2',行1将永远可见,无论用户如何向下滚动
12.10.4 图表
openpyxl支持利用工作表中单元格的数据,创建条形图、折线图、散点图和饼图。要创建图表,需要做下列事情:
1.从一个矩形区域选择的单元格,创建一个Reference对象。
2.通过传入Reference对象,创建一个Series对象。
3.创建一个Chart对象。
4.将Series对象添加到Chart对象。
5.可选地设置Chart对象的drawing.top、drawing.left、drawing.width和drawing.height变量。
6.将Chart对象添加到Worksheet对象。
Reference对象需要一些解释。Reference对象是通过调用openpyxl.charts. Reference()函数并传入3个参数创建的:
1.包含图表数据的Worksheet对象。
2.两个整数的元组,代表矩形选择区域的左上角单元格,该区域包含图表数据:元组中第一个整数是行,第二个整数是列。请注意第一行是1,不是0。
3.两个整数的元组,代表矩形选择区域的右下角单元格,该区域包含图表数据:元组中第一个整数是行,第二个整数是列。
图12-9展示了坐标参数的一些例子。
图12-9 从左到右:(1, 1), (10, 1); (3, 2), (6, 4); (5, 3), (5, 3)
在交互式环境中输入以下代码,创建一个条形图,将它添加到电子表格中:
>>> import openpyxl >>> wb = openpyxl.Workbook() >>> sheet = wb.get_active_sheet() >>> for i in range(1, 11): # create some data in column A sheet['A' + str(i)] = i >>> refObj = openpyxl.charts.Reference(sheet, (1, 1), (10, 1)) >>> seriesObj = openpyxl.charts.Series(refObj, title='First series') >>> chartObj = openpyxl.charts.BarChart() >>> chartObj.append(seriesObj) >>> chartObj.drawing.top = 50 # set the position >>> chartObj.drawing.left = 100 >>> chartObj.drawing.width = 300 # set the size >>> chartObj.drawing.height = 200 >>> sheet.add_chart(chartObj) >>> wb.save('sampleChart.xlsx')
得到的电子表格,如图12-10所示。
图12-10 添加了一个图表的电子表格
我们可以调用 openpyxl.charts.BarChart(),创建一个条形图。也可以调用openpyxl.charts.LineChart()、openpyxl.charts.ScatterChart()和openpyxl.charts.PieChart(),创建折线图、散点图和饼图。
遗憾的是,在OpenPyXL的当前版本中(2.1.4),load_workbook()不会加载Excel文件中的图表。即使Excel文件包含图表,加载的Workbook对象也不会包含它们。如果加载一个Workbook对象,然后马上保存到同样的.xlsx文件名中,实际上就会删除其中的图表。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论