1. openpyxl是什么?

openpyxl是一个用于操作Excel文件的Python库,可以通过编写Python代码读取和写入Excel文件,实现对Excel文件的读取、操作和处理。它支持Excel 2007及其以后版本的.xlsx文件格式,并且具有较好的性能和灵活性,可以方便地进行Excel文件的处理和操作。openpyxl可以在Windows、Linux、macOS等多个平台上运行,同时也是一个开源的库

2. Openpyxl 使用步骤

1.安装openpyxl 要使用openpyxl,首先需要安装该库。在命令行中输入以下命令可以安装openpyxl:

1pip install openpyxl

2.导入openpyxl 安装openpyxl后,我们需要在Python脚本中导入它。以下是导入openpyxl的示例代码:

import openpyxl

创建新文件

在第一个示例中,我们使用openpyxl创建一个新的 xlsx 文件。

write_xlsx.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4import time
 5
 6book = Workbook()
 7sheet = book.active
 8
 9sheet['A1'] = 56
10sheet['A2'] = 43
11
12now = time.strftime("%Y-%m-%d")
13sheet['A3'] = now
14
15book.save("sample.xlsx")

在示例中,我们创建一个新的 xlsx 文件。 我们将数据写入三个单元格。

1from openpyxl import Workbook

从openpyxl模块,我们导入Workbook类。 工作簿是文档所有其他部分的容器。

1book = Workbook()

我们创建一个新的工作簿。 始终使用至少一个工作表创建一个工作簿。

1sheet = book.active

我们获得对活动工作表的引用。

1sheet['A1'] = 56
2sheet['A2'] = 43

我们将数值数据写入单元格 A1 和 A2。

1now = time.strftime("%Y-%m-%d")
2sheet['A3'] = now

我们将当前日期写入单元格 A3。

1book.save("sample.xlsx")

我们使用save()方法将内容写入sample.xlsx文件。

2.1. Openpyxl 写入单元格

写入单元格有两种基本方法:使用工作表的键(例如 A1 或 D3),或通过cell()方法使用行和列表示法。

write2cell.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4
 5book = Workbook()
 6sheet = book.active
 7
 8sheet['A1'] = 1
 9sheet.cell(row=2, column=2).value = 2
10
11book.save('write2cell.xlsx')

在示例中,我们将两个值写入两个单元格。

1sheet['A1'] = 1

在这里,我们将数值分配给 A1 单元。

1sheet.cell(row=2, column=2).value = 2

在这一行中,我们用行和列表示法写入单元格 B2。

2.2. Openpyxl 附加值

使用append()方法,我们可以在当前工作表的底部附加一组值。

appending_values.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4
 5book = Workbook()
 6sheet = book.active
 7
 8rows = (
 9    (88, 46, 57),
10    (89, 38, 12),
11    (23, 59, 78),
12    (56, 21, 98),
13    (24, 18, 43),
14    (34, 15, 67)
15)
16
17for row in rows:
18    sheet.append(row)
19
20book.save('appending.xlsx')

在示例中,我们将三列数据附加到当前工作表中。

1rows = (
2    (88, 46, 57),
3    (89, 38, 12),
4    (23, 59, 78),
5    (56, 21, 98),
6    (24, 18, 43),
7    (34, 15, 67)
8)

数据存储在元组的元组中。

1for row in rows:
2    sheet.append(row)

我们逐行浏览容器,并使用append()方法插入数据行。

2.3. OpenPyXL 读取单元格

在下面的示例中,我们从sample.xlsx文件中读取先前写入的数据。

read_cells.py

 1#!/usr/bin/env python
 2
 3import openpyxl
 4
 5book = openpyxl.load_workbook('sample.xlsx')
 6
 7sheet = book.active
 8
 9a1 = sheet['A1']
10a2 = sheet['A2']
11a3 = sheet.cell(row=3, column=1)
12
13print(a1.value)
14print(a2.value) 
15print(a3.value)

该示例加载一个现有的 xlsx 文件并读取三个单元格。

1book = openpyxl.load_workbook('sample.xlsx')

使用load_workbook()方法打开文件。

1a1 = sheet['A1']
2a2 = sheet['A2']
3a3 = sheet.cell(row=3, column=1)

我们读取 A1,A2 和 A3 单元的内容。 在第三行中,我们使用cell()方法获取 A3 单元格的值。

1$ ./read_cells.py 
256
343
410/26/16

2.4. OpenPyXL 读取多个单元格

我们有以下数据表:

我们使用范围运算符读取数据。

read_cells2.py

 1#!/usr/bin/env python
 2
 3import openpyxl
 4
 5book = openpyxl.load_workbook('items.xlsx')
 6
 7sheet = book.active
 8
 9cells = sheet['A1': 'B6']
10
11for c1, c2 in cells:
12    print("{0:8} {1:8}".format(c1.value, c2.value))

在示例中,我们使用范围运算从两列读取数据。

1cells = sheet['A1': 'B6']

在这一行中,我们从单元格 A1-B6 中读取数据。

1for c1, c2 in cells:
2    print("{0:8} {1:8}".format(c1.value, c2.value))

format()功能用于在控制台上整洁地输出数据。

1$ ./read_cells2.py 
2Items    Quantity
3coins          23
4chairs          3
5pencils         5
6bottles         8
7books          30

2.5. Openpyxl 按行迭代

iter_rows()方法将工作表中的单元格返回为行。

iterating_by_rows.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4
 5book = Workbook()
 6sheet = book.active
 7
 8rows = (
 9    (88, 46, 57),
10    (89, 38, 12),
11    (23, 59, 78),
12    (56, 21, 98),
13    (24, 18, 43),
14    (34, 15, 67)
15)
16
17for row in rows:
18    sheet.append(row)
19
20for row in sheet.iter_rows(min_row=1, min_col=1, max_row=6, max_col=3):
21    for cell in row:
22        print(cell.value, end=" ")
23    print()    
24
25book.save('iterbyrows.xlsx')

该示例逐行遍历数据。

1for row in sheet.iter_rows(min_row=1, min_col=1, max_row=6, max_col=3):

我们提供了迭代的边界。

1$ ./iterating_by_rows.py 
288 46 57 
389 38 12 
423 59 78 
556 21 98 
624 18 43 
734 15 67 

3. Openpyxl 按列迭代

iter_cols()方法将工作表中的单元格作为列返回。

iterating_by_columns.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4
 5book = Workbook()
 6sheet = book.active
 7
 8rows = (
 9    (88, 46, 57),
10    (89, 38, 12),
11    (23, 59, 78),
12    (56, 21, 98),
13    (24, 18, 43),
14    (34, 15, 67)
15)
16
17for row in rows:
18    sheet.append(row)
19
20for row in sheet.iter_cols(min_row=1, min_col=1, max_row=6, max_col=3):
21    for cell in row:
22        print(cell.value, end=" ")
23    print()    
24
25book.save('iterbycols.xlsx')

该示例逐列遍历数据。

1$ ./iterating_by_columns.py 
288 89 23 56 24 34 
346 38 59 21 18 15 
457 12 78 98 43 67 

4. Openpyxl 复制工作表

 1import openpyxl
 2
 3workbook = openpyxl.load_workbook('example.xlsx')
 4
 5# 复制工作表
 6copied_sheet = workbook.copy_worksheet(workbook['Sheet1'])
 7copied_sheet.title = 'Copy of Sheet1'
 8
 9# 保存工作簿
10workbook.save('example_with_copy.xlsx')

5. Openpyxl 统计

对于下一个示例,我们需要创建一个包含数字的 xlsx 文件。 例如,我们使用RANDBETWEEN()函数在 10 列中创建了 25 行数字。

mystats.py

  1#!/usr/bin/env python
  2
  3import random
  4import openpyxl
  5import statistics as stats
  6
  7# book = openpyxl.Workbook()
  8
  9# sheet = book.active
 10
 11# rows = (
 12
 13# (
 14
 15# random.randint(20, 100),
 16
 17# random.randint(20, 100),
 18
 19# random.randint(20, 100),
 20
 21# random.randint(20, 100),
 22
 23# random.randint(20, 100),
 24
 25# random.randint(20, 100),
 26
 27# ),
 28
 29# (
 30
 31# random.randint(20, 100),
 32
 33# random.randint(20, 100),
 34
 35# random.randint(20, 100),
 36
 37# random.randint(20, 100),
 38
 39# random.randint(20, 100),
 40
 41# random.randint(20, 100),
 42
 43# ),
 44
 45# (
 46
 47# random.randint(20, 100),
 48
 49# random.randint(20, 100),
 50
 51# random.randint(20, 100),
 52
 53# random.randint(20, 100),
 54
 55# random.randint(20, 100),
 56
 57# random.randint(20, 100),
 58
 59# ),
 60
 61# (
 62
 63# random.randint(20, 100),
 64
 65# random.randint(20, 100),
 66
 67# random.randint(20, 100),
 68
 69# random.randint(20, 100),
 70
 71# random.randint(20, 100),
 72
 73# random.randint(20, 100),
 74
 75# ),
 76
 77# (
 78
 79# random.randint(20, 100),
 80
 81# random.randint(20, 100),
 82
 83# random.randint(20, 100),
 84
 85# random.randint(20, 100),
 86
 87# random.randint(20, 100),
 88
 89# random.randint(20, 100),
 90
 91# ),
 92
 93# (
 94
 95# random.randint(20, 100),
 96
 97# random.randint(20, 100),
 98
 99# random.randint(20, 100),
100
101# random.randint(20, 100),
102
103# random.randint(20, 100),
104
105# random.randint(20, 100),
106
107# ),
108
109# (
110
111# random.randint(20, 100),
112
113# random.randint(20, 100),
114
115# random.randint(20, 100),
116
117# random.randint(20, 100),
118
119# random.randint(20, 100),
120
121# random.randint(20, 100),
122
123# ),
124
125# (
126
127# random.randint(20, 100),
128
129# random.randint(20, 100),
130
131# random.randint(20, 100),
132
133# random.randint(20, 100),
134
135# random.randint(20, 100),
136
137# random.randint(20, 100),
138
139# ),
140
141# (
142
143# random.randint(20, 100),
144
145# random.randint(20, 100),
146
147# random.randint(20, 100),
148
149# random.randint(20, 100),
150
151# random.randint(20, 100),
152
153# random.randint(20, 100),
154
155# ),
156
157# (
158
159# random.randint(20, 100),
160
161# random.randint(20, 100),
162
163# random.randint(20, 100),
164
165# random.randint(20, 100),
166
167# random.randint(20, 100),
168
169# random.randint(20, 100),
170
171# ),
172
173# (
174
175# random.randint(20, 100),
176
177# random.randint(20, 100),
178
179# random.randint(20, 100),
180
181# random.randint(20, 100),
182
183# random.randint(20, 100),
184
185# random.randint(20, 100),
186
187# ),
188
189# )
190
191  
192
193# for row in rows:
194
195# sheet.append(row)
196
197# book.save("numbers.xlsx")
198
199book = openpyxl.load_workbook("numbers.xlsx", data_only=True)
200sheet = book.active
201  
202rows = sheet.rows
203values = []
204
205for row in rows:
206for cell in row:
207values.append(cell.value)
208print("Number of values: {0}".format(len(values)))
209print("Sum of values: {0}".format(sum(values)))
210print("Minimum value: {0}".format(min(values)))
211print("Maximum value: {0}".format(max(values)))
212print("Mean: {0}".format(stats.mean(values)))
213print("Median: {0}".format(stats.median(values)))
214print("Standard deviation: {0}".format(stats.stdev(values)))
215print("Variance: {0}".format(stats.variance(values)))

在示例中,我们从工作表中读取所有值并计算一些基本统计信息。

1import statistics as stats

导入statistics模块以提供一些统计功能,例如中值和方差。

1book = openpyxl.load_workbook('numbers.xlsx', data_only=True)

使用data_only选项,我们从单元格而不是公式中获取值。

1rows = sheet.rows

我们得到所有不为空的单元格行。

1for row in rows:
2    for cell in row:
3        values.append(cell.value)

在两个 for 循环中,我们从单元格中形成一个整数值列表。

1print("Number of values: {0}".format(len(values)))
2print("Sum of values: {0}".format(sum(values)))
3print("Minimum value: {0}".format(min(values)))
4print("Maximum value: {0}".format(max(values)))
5print("Mean: {0}".format(stats.mean(values)))
6print("Median: {0}".format(stats.median(values)))
7print("Standard deviation: {0}".format(stats.stdev(values)))
8print("Variance: {0}".format(stats.variance(values)))

我们计算并打印有关值的数学统计信息。 一些功能是内置的,其他功能是通过statistics模块导入的。

1$ ./mystats.py 
2Number of values: 312
3Sum of values: 15877
4Minimum value: 0
5Maximum value: 100
6Mean: 50.88782051282051
7Median: 54.0
8Standard deviation: 28.459203819700967
9Variance: 809.9262820512821

5.1. Openpyxl 过滤器&排序数据

工作表具有auto_filter属性,该属性允许设置过滤条件和排序条件。

请注意,Openpyxl 设置了条件,但是我们必须在电子表格应用中应用它们。

filter_sort.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4
 5wb = Workbook()
 6sheet = wb.active
 7
 8data = [
 9    ['Item', 'Colour'],
10    ['pen', 'brown'],
11    ['book', 'black'],
12    ['plate', 'white'],
13    ['chair', 'brown'],
14    ['coin', 'gold'],
15    ['bed', 'brown'],
16    ['notebook', 'white'],
17]
18
19for r in data:
20    sheet.append(r)
21
22sheet.w.ref = 'A1:B8'
23sheet.auto_filter.add_filter_column(1, ['brown', 'white'])
24sheet.auto_filter.add_sort_condition('B2:B8')
25
26wb.save('filtered.xlsx')

在示例中,我们创建一个包含项目及其颜色的工作表。 我们设置一个过滤器和一个排序条件。

6. Openpyxl 维度

为了获得那些实际包含数据的单元格,我们可以使用维度。

dimensions.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4
 5book = Workbook()
 6sheet = book.active
 7sheet["A3"] = 39
 8sheet["B3"] = 19
 9sheet["C3"] = 19
10sheet["D3"] = 19
11
12print(sheet.dimensions)
13print("Minimum row: {0}".format(sheet.min_row))
14print("Maximum row: {0}".format(sheet.max_row))
15print("Minimum column: {0}".format(sheet.min_column))
16print("Maximum column: {0}".format(sheet.max_column))
17
18rows = [
19
20(88, 46, 46, 46),
21(89, 38, 38, 38),
22(23, 59, 59, 59),
23(56, 21, 21, 21),
24(24, 18, 18, 18),
25(34, 15, 15, 15),
26]
27
28  
29
30for row in rows:
31
32sheet.append(row)
33
34print(sheet.dimensions)
35print("Minimum row: {0}".format(sheet.min_row))
36print("Maximum row: {0}".format(sheet.max_row))
37print("Minimum column: {0}".format(sheet.min_column))
38print("Maximum column: {0}".format(sheet.max_column))
39
40for c1, c2, c3, c4 in sheet[sheet.dimensions]:
41print(c1.value, c2.value, c3.value, c4.value)
42
43book.save("dimensions.xlsx")
A3:D3
Minimum row: 3
Maximum row: 3
Minimum column: 1
Maximum column: 4

A3:D9
Minimum row: 3
Maximum row: 9
Minimum column: 1
Maximum column: 4
39 19 19 19
88 46 46 46
89 38 38 38
23 59 59 59
56 21 21 21
24 18 18 18
34 15 15 15

该示例计算两列数据的维数。

 1sheet['A3'] = 39
 2sheet['B3'] = 19
 3
 4rows = [
 5    (88, 46),
 6    (89, 38),
 7    (23, 59),
 8    (56, 21),
 9    (24, 18),
10    (34, 15)
11]
12
13for row in rows:
14    sheet.append(row)

我们将数据添加到工作表。 请注意,我们从第三行开始添加。

1sheet['A3'] = 39
2sheet['B3'] = 19

1print(sheet.dimensions)

dimensions属性返回非空单元格区域的左上角和右下角单元格。

1print("Minimum row: {0}".format(sheet.min_row))
2print("Maximum row: {0}".format(sheet.max_row))

使用min_row和max_row属性,我们可以获得包含数据的最小和最大行。

1print("Minimum column: {0}".format(sheet.min_column))
2print("Maximum column: {0}".format(sheet.max_column))

1sheet["A3"] = 39
2sheet["B3"] = 19
3sheet["C3"] = 19
4sheet["D3"] = 19
5
6print(sheet.dimensions)
7print("Minimum column: {0}".format(sheet.min_column))
8print("Maximum column: {0}".format(sheet.max_column))s

通过min_column和max_column属性,我们获得了包含数据的最小和最大列。

1for c1, c2 in sheet[sheet.dimensions]:
2    print(c1.value, c2.value)

我们遍历数据并将其打印到控制台。

 1$ ./dimensions.py 
 2A3:B9
 3Minimum row: 3
 4Maximum row: 9
 5Minimum column: 1
 6Maximum column: 2
 739 19
 888 46
 989 38
1023 59
1156 21
1224 18
1334 15

7. Openpyxl 工作表

每个工作簿可以有多个工作表。

让手动创建一张包含这三张纸的工作簿。

sheets.py

 1#!/usr/bin/env python
 2
 3import openpyxl
 4
 5book = openpyxl.load_workbook("sheets.xlsx")
 6print(book.sheetnames)
 7active_sheet = book.active
 8print(type(active_sheet))
 9sheet = book["March"]
10print(sheet.title)

该程序可用于 Excel 工作表。

1print(book.sheetnames)

sheetnames 返回工作簿中可用工作表的名称。

1active_sheet = book.active
2print(type(active_sheet))

我们获取活动表并将其类型打印到终端。

1sheet = book["March"]

我们使用book[“March”]获得对工作表的引用。

1print(sheet.title)

检索到的工作表的标题将打印到终端。

1$ ./sheets.py 
2['January', 'February', 'March']
3
4<class 'openpyxl.worksheet.worksheet.Worksheet'>
5
6March

这是程序的输出。

sheets2.py

 1#!/usr/bin/env python
 2
 3import openpyxl
 4
 5book = openpyxl.load_workbook("sheets.xlsx")
 6book.create_sheet("April")
 7print(book.sheetnames)
 8
 9sheet1 = book["January"]
10book.remove(sheet1)
11print(book.sheetnames)
12  
13book.create_sheet("January", 0)
14print(book.sheetnames)
15book.save("sheets2.xlsx")

在此示例中,我们创建一个新工作表。

1book.create_sheet("April")

使用create_sheet()方法创建一个新工作表。

1print(book.sheetnames)

工作表名称也可以使用sheetnames属性显示。

1book.remove(sheet1)

可以使用remove()方法将工作表删除。

1book.create_sheet("January", 0)

可以在指定位置创建一个新工作表。 在我们的例子中,我们在索引为 0 的位置创建一个新工作表。

1$ ./sheets2.py 
2['January', 'February', 'March', 'April']
3['February', 'March', 'April']
4['January', 'February', 'March', 'April']

可以更改工作表的背景颜色。

sheets3.py

 1#!/usr/bin/env python
 2
 3import openpyxl
 4
 5book = openpyxl.load_workbook('sheets.xlsx')
 6
 7sheet = book["March"]
 8sheet.sheet_properties.tabColor = "0072BA"
 9
10book.save('sheets3.xlsx')

该示例修改了标题为“ March”的工作表的背景颜色。

1sheet.sheet_properties.tabColor = "0072BA"

我们将tabColor属性更改为新颜色。 第三工作表的背景色已更改为某种蓝色。

7.1. Openpyxl 合并单元格

单元格可以使用merge_cells()方法合并,而可以不使用unmerge_cells()方法合并。 当我们合并单元格时,除了左上角的所有单元格都将从工作​​表中删除。

merging_cells.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4from openpyxl.styles import Alignment
 5
 6book = Workbook()
 7sheet = book.active
 8sheet["A1"] = "Weather"
 9sheet["B1"] = "Temperature"
10sheet["A2"] = "Sunny day"
11sheet["B2"] = "25°C"
12
13sheet.merge_cells('A1:B2')
14
15cell = sheet.cell(row=1, column=1)
16cell.value = 'Sunny day'
17cell.alignment = Alignment(horizontal='center', vertical='center')
18
19book.save('merging.xlsx')

在该示例中,我们合并了四个单元格:A1,B1,A2 和 B2。 最后一个单元格中的文本居中。

1from openpyxl.styles import Alignment

为了使文本在最后一个单元格中居中,我们使用了openpyxl.styles模块中的Alignment类。

1sheet.merge_cells('A1:B2')

我们用merge_cells()方法合并四个单元格。

1cell = sheet.cell(row=1, column=1)

我们得到了最后一个单元格。

1cell.value = 'Sunny day'
2cell.alignment = Alignment(horizontal='center', vertical='center')

我们将文本设置为合并的单元格并更新其对齐方式。

8. Openpyxl 冻结窗格

冻结窗格时,在滚动到工作表的另一个区域时,我们会保持工作表的某个区域可见。

freezing.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4from openpyxl.styles import Alignment
 5
 6book = Workbook()
 7sheet = book.active
 8
 9	sheet.freeze_panes = 'B2'
10
11book.save('freezing.xlsx')

该示例通过单元格 B2 冻结窗格。

1sheet.freeze_panes = 'B2'

要冻结窗格,我们使用freeze_panes属性。

9. Openpyxl 公式

下一个示例显示如何使用公式。 openpyxl不进行计算; 它将公式写入单元格。

formulas.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4
 5book = Workbook()
 6sheet = book.active
 7
 8rows = (
 9    (34, 26),
10    (88, 36),
11    (24, 29),
12    (15, 22),
13    (56, 13),
14    (76, 18)
15)
16
17for row in rows:
18    sheet.append(row)
19
20cell = sheet.cell(row=7, column=2)
21cell.value = "=SUM(A1:B6)"
22cell.font = cell.font.copy(bold=True)
23
24book.save('formulas.xlsx')

在示例中,我们使用SUM()函数计算所有值的总和,并以粗体显示输出样式。

 1rows = (
 2    (34, 26),
 3    (88, 36),
 4    (24, 29),
 5    (15, 22),
 6    (56, 13),
 7    (76, 18)
 8)
 9
10for row in rows:
11    sheet.append(row)

我们创建两列数据。

1cell = sheet.cell(row=7, column=2)

我们得到显示计算结果的单元格。

1cell.value = "=SUM(A1:B6)"

我们将一个公式写入单元格。

1cell.font = cell.font.copy(bold=True)

我们更改字体样式。

10. OpenPyXL 图片

在下面的示例中,我们显示了如何将图像插入到工作表中。

write_image.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4from openpyxl.drawing.image import Image
 5
 6book = Workbook()
 7sheet = book.active
 8
 9img = Image("icesid.png")
10sheet['A1'] = 'This is Sid'
11
12sheet.add_image(img, 'B2')
13
14book.save("sheet_image.xlsx")

在示例中,我们将图像写到工作表上。

1from openpyxl.drawing.image import Image

我们使用openpyxl.drawing.image模块中的Image类。

1img = Image("icesid.png")

创建一个新的Image类。 icesid.png图像位于当前工作目录中。

1sheet.add_image(img, 'B2')

我们使用add_image()方法添加新图像。

10.1. Openpyxl 图表

openpyxl库支持创建各种图表,包括条形图,折线图,面积图,气泡图,散点图和饼图。

根据文档,openpyxl仅支持在工作表中创建图表。 现有工作簿中的图表将丢失。

create_bar_chart.py

 1#!/usr/bin/env python
 2
 3from openpyxl import Workbook
 4from openpyxl.chart import (
 5    Reference,
 6    Series,
 7    BarChart
 8)
 9
10book = Workbook()
11sheet = book.active
12
13rows = [
14    ("USA", 46),
15    ("China", 38),
16    ("UK", 29),
17    ("Russia", 22),
18    ("South Korea", 13),
19    ("Germany", 11)
20]
21
22for row in rows:
23    sheet.append(row)
24
25data = Reference(sheet, min_col=2, min_row=1, max_col=2, max_row=6)
26categs = Reference(sheet, min_col=1, min_row=1, max_row=6)
27
28chart = BarChart()
29chart.add_data(data=data)
30chart.set_categories(categs)
31
32chart.legend = None
33chart.y_axis.majorGridlines = None
34chart.varyColors = True
35chart.title = "Olympic Gold medals in London"
36
37sheet.add_chart(chart, "A8")    
38
39book.save("bar_chart.xlsx")

在此示例中,我们创建了一个条形图,以显示 2012 年伦敦每个国家/地区的奥运金牌数量。

1from openpyxl.chart import (
2    Reference,
3    Series,
4    BarChart
5)

openpyxl.chart模块具有使用图表的工具。

1book = Workbook()
2sheet = book.active

创建一个新的工作簿。

 1rows = [
 2    ("USA", 46),
 3    ("China", 38),
 4    ("UK", 29),
 5    ("Russia", 22),
 6    ("South Korea", 13),
 7    ("Germany", 11)
 8]
 9
10for row in rows:
11    sheet.append(row)

我们创建一些数据并将其添加到活动工作表的单元格中。

1data = Reference(sheet, min_col=2, min_row=1, max_col=2, max_row=6)

对于Reference类,我们引用表中代表数据的行。 在我们的案例中,这些是奥运金牌的数量。

1categs = Reference(sheet, min_col=1, min_row=1, max_row=6)

我们创建一个类别轴。 类别轴是将数据视为一系列非数字文本标签的轴。 在我们的案例中,我们有代表国家名称的文本标签。

1chart = BarChart()
2chart.add_data(data=data)
3chart.set_categories(categs)

我们创建一个条形图并为其设置数据和类别。

1chart.legend = None
2chart.y_axis.majorGridlines = None

使用legend和majorGridlines属性,可以关闭图例和主要网格线。

1chart.varyColors = True

将varyColors设置为True,每个条形都有不同的颜色。

1chart.title = "Olympic Gold medals in London"

为图表设置标题。

1sheet.add_chart(chart, "A8")   

使用add_chart()方法将创建的图表添加到工作表中。

10.2. Openpyxl 如何拷贝一个工作表到别一个工作表

 1# importing openpyxl module`
 2
 3mport openpyxl as xl;
 4
 5# opening the source excel file
 6
 7filename ="C:\\Users\\Admin\\Desktop\\trading.xlsx"
 8
 9wb1 = xl.load_workbook(filename)
10
11ws1 = wb1.worksheets[0]
12
13# opening the destination excel file 
14
15filename1 ="C:\\Users\\Admin\\Desktop\\test.xlsx"
16
17wb2 = xl.load_workbook(filename1)
18
19ws2 = wb2.active
20
21# calculate total number of rows and 
22
23# columns in source excel file
24
25mr = ws1.max_row
26
27mc = ws1.max_column
28
29# copying the cell values from source 
30
31# excel file to destination excel file
32
33for i in range (1, mr + 1):
34
35	for j in range (1, mc + 1):
36	
37		# reading cell value from source excel file
38		
39		c = ws1.cell(row = i, column = j)
40		
41		# writing the read value to destination excel file
42		
43		ws2.cell(row = i, column = j).value = c.value
44
45# saving the destination excel file
46
47wb2.save(str(filename1))