目录



>>> from helper import info; info()
页面更新时间: 2020-03-21 22:40:29
操作系统/OS: Linux-4.19.0-8-amd64-x86_64-with-debian-10.3 ;Python: 3.7.3

调整行和列

在 Excel中,调整行和列的大小非常容易,只要点击并 拖动行的边缘,或列的头部。但如果你需要根据单元格 的内容来设置行或列的大小,或者希望设置大量电子表 格文件中的行列大小,编写Python程序来做就要快得多。

行和列也可以完全隐藏起来。或者它们可以“冻结”, 这样就总是显示在屏幕上,如果打印该电子表格, 它们就出现在每一页上(这很适合做表头)。

设置行高和列宽

Worksheet 对象有 row_dimensionscolumn_dimensions 属性,控制行高和列宽。 在交互式环境中输入以下&码:

>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> sheet = wb.active
>>> 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_dimensionscolumn_dimensions 是像字典一样的值,row_dimensions 包含RowDimension 对象,column_dimensions 包含 ColumnDimension 对象。 在 row_dimensions 中,可以用行的编号来访一个对象 (在这个例子中,是1或)。在 column_dimensions 中, 可以用列的字母来访问一个对象(在这个例子中,是A或B)。

一旦有了 RowDimension 对象,就可以设置它的高度。 一旦有了 ColumnDimension 对象,就可以设置它的宽度。 行的高度可以设置为0到409之间的整数或浮点值。这个值表示 高度的点数。一点等于1/72英寸。默认的行高是12.75。列宽 可以设置为0到255之间的整数或浮点数。这个值表示使用默认 字体大小时(11点),单元格可以显示的字符数。默认的列宽 是8.43个字符。列宽为零或行高为零,将使单元格隐藏。

合并和拆分单元格

利用 merge_cell() 工作表方法,可以将一个矩形区域 中的单元格合并为一个单元格。在交互式环境中输入以下代码:

>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> sheet = wb.active
>>> 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_cell() 的参数是一个字符串,表示要合并的 矩形区域左上角和右下角的单元格:'A1:D3'将12个 单元格合并为一个单元格。要设置这些合并后单元格的值, 只要设置这一组合并单元格左上角的单元格的值。

如果运行这段代码, merged.xlsx

要拆分单元格,就调用 unmerge_cells() 工作表方法。 在交互式环境中输入以下代码:

>>> import openpyxl
>>> wb = openpyxl.load_workbook('merged.xlsx')
>>> sheet = wb.active
>>> sheet.unmerge_cells('A1:D3')
>>> sheet.unmerge_cells('C5:D5')
>>> wb.save('merged.xlsx')

如果保存变更,然后查看这个电子表格,就会看到合并的 单元格恢复成一些独立的单元格。

冻结窗格

对于太大而不能一屏显示的电子表格,“冻结”顶部的几行 或最左边的几列,是很有帮助的。例如,冻结的列或行表头, 就算用户滚动电子表格,也是始终可见的。这称为“冻结窗格”。 在 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.active
>>> sheet.freeze_panes = 'A2'
>>> wb.save('freezeExample.xlsx')

如果将 freeze_panes 属性设置为 'A2' , 行1将永远可见,无论用户将电子表格滚动到何处。 将 reeze_panes 设置为 'A2',行1 将永远可见,无论用户如何向下滚动

图表

openpyxl 支持利用工作表中单元格的数据, 创建条形图、折线图、散点图和饼图。要创建 图表,需要做下列事情:

  1. 从一个矩形区域选择的单兀格,创建一个 Reference 对象。

  2. 通过传入 Reference 对象,创建一个 Series 对象。

  3. 创建一个 Chart 对象。

  4. Series 对象添加到 Chart 对象。

  5. 可选地设置 Chart 对象的 drawing.topdrawing.leftdrawing.widthdrawing.height 变量。

  6. Chart 对象添加到 Worksheet 对象。

Reference 对象需要一些解释。Reference 对象是通过调用 openpyxl.charts.Reference()函数并传入3个参数创建的:

  1. 包含图表数据的 Worksheet 对象。

  2. 两个整数的元组,代表矩形选择区域的左上角单元格,该区域包含图表数据:元组中第一个整数是行,第二个整数是列。请注意第一行是1,不是0。

  3. 两个整数的元组,代表矩形选择区域的右下角单元格,该区域包含图表数据:元组中第一个整数是行,第二个整数是列。

在交互式环境中输入以下代码,创建一个条形图, 将它添加到电子表格中:

>>> import openpyxl, os
>>>
>>> wb = openpyxl.Workbook()
>>> sheet = wb.active
>>> for i in range(1, 11):  # Create some data in column A
>>>     sheet['A' + str(i)] = i
>>>
>>> refObj = openpyxl.chart.Reference(sheet, min_row=1, min_col=1, max_row=10, max_col=1)
>>>
>>> seriesObj = openpyxl.chart.Series(refObj, title='First series')
>>>
>>> chartObj = openpyxl.chart.BarChart()
>>>
>>> chartObj.title = 'My Chart'
>>>
>>> chartObj.append(seriesObj)
>>>
>>> sheet.add_chart(chartObj, 'C5')
>>>
>>> wb.save('sampleChart.xlsx')

得到的电子表格

我们可以调用 openpyxl.charts.BarChart(), 创建一个条形图。也可以调用 openpyxl.charts.LineChart()openpyxl.charts.ScatterChart()openpyxl.charts.PieChart(), 创建折线图、散点图和饼图。

遗憾的是,在 OpenPyXL 的当前版本中(2.1.4), load_workbook() 不会加载Excel文件中的图表。 即使Excel文件包含图表,加载的 Workbook 对象也不会包含它们。如果加载一个 Workbook 对象, 然后马上保存到同样的 .xlsx 文件名中,实际上就会删除其中的图表。