在内存中编辑workbook

英文源地址


创建workbook

使用openpyxl并不需要在系统上新建一个文件,只需引用Workbook类即可。

  1. >>> from openpyxl import Workbook
  2. >>> wb = Workbook()

一个Excel文档在创建是至少会有一个标签(worksheet)。因此可以通过使用openpyxl.workbook.Workbook.active()方法激活该标签。

  1. >>> ws = wb.active

Note

该功能使用了_active_sheet_index方法,默认值为0。如果你没有改变其值,那么通过此方法始终会获取第一个worksheet。 同时,你也可以通过说使用方法openpyxl.workbook.Workbook.create_sheet()创建一个新的worksheet。

  1. >>> ws1 = wb.create_sheet() # 在末尾创建 (默认)
  2. # or
  3. >>> ws2 = wb.create_sheet(0) # 在第一个位置插入

创建Sheets的时候会按照数字队列自动命名(Sheet,Sheet1,Sheet2, …)。你可以通过title属性随时改变其名称。

  1. ws.title = "New Title"

页面的背景色默认为白色.你可以为ws.sheet_properties.tabColor属性赋值RRGGBB颜色编码进行更改:

  1. ws.sheet_properties.tabColor = "1072BA"

一旦你给一个worksheet命名之后,你可以通过将worksheet的名称作为workbook的key或者使用openpyxl.workbook.Workbook.get_sheet_by_name()方法得到它。

  1. >>> ws3 = wb["New Title"]
  2. >>> ws4 = wb.get_sheet_by_name("New Title")
  3. >>> ws is ws3 is ws4
  4. True

你可以通过方法openpyxl.workbook.Workbook.get_sheet_names()获取说为sheet名称:

  1. >>> print(wb.get_sheet_names())
  2. ['Sheet2', 'New Title', 'Sheet1']

你可以遍历所有worksheets

  1. >>> for sheet in wb:
  2. ... print(sheet.title)

使用数据

访问单个单元格

现在,我们知道怎样方位一个worksheet了,现在我们来学习如何改变单元格的内容。

我们可以直接通过worksheet的键值(key)方位单元格。

  1. >>> c = ws['A4']

这样就可以直接获取A4单元格了。如果该单元格不存在,则会被创建。 也可以直接为单元格赋值。

  1. >>> ws['A4'] = 4

也可以使用方法openpyxl.workbook.Workbook.cell()进行操作

  1. >>> c = ws.cell('A4')

同样,你也可以通过使用单元格的行和列标记访问:

  1. >>> d = ws.cell(row = 4, column = 2)

Note

在worksheet在被创建时存在于内存中的。此时worksheet不包含任何单元格。 单元格将在第一次被访问时被创建。 此功能将不会创建不会访问的对象,从而达到可以节约内存的目的。


Warning

正式因为此功能,当遍历所有单元格而非直接访问时,将会在内存中创建它们,即使你不为他们赋值。

比如说

  1. >>> for i in range(1,101):
  2. ... for j in range(1,101):
  3. ... ws.cell(row = i, column = j)

将会在内存中创建100x100个空白单元格。

然后,openpyxl提供了一种方法清空这些不需要的单元格,这个我们将在之后介绍。

访问多个单元格

单元格区块(Ranges of cells)可以通过切片方式访问。

  1. >>> cell_range = ws['A1':'C2']

同样,你也可以使用方法openpyxl.worksheet.Workbook.iter_rows():

  1. >>> tuple(ws.iter_rows('A1:C2'))
  2. ((<Cell Sheet1.A1>, <Cell Sheet1.B1>, <Cell Sheet1.C1>),
  3. (<Cell Sheet1.A2>, <Cell Sheet1.B2>, <Cell Sheet1.C2>))
  4. >>> for row in ws.iter_rows('A1:C2'):
  5. ... for cell in row:
  6. ... print cell
  7. <Cell Sheet1.A1>
  8. <Cell Sheet1.B1>
  9. <Cell Sheet1.C1>
  10. <Cell Sheet1.A2>
  11. <Cell Sheet1.B2>
  12. <Cell Sheet1.C2>

如果你需要循环访问一个文件中的所有行或者列,你可以使用openpyxl.worksheet.Workbook.rows()属性。

  1. >>> ws = wb.active
  2. >>> ws['C9'] = 'hello world'
  3. >>> ws.rows
  4. ((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
  5. (<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
  6. (<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
  7. (<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
  8. (<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
  9. (<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
  10. (<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
  11. (<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
  12. (<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))

或者openpyxl.workbook.Workbook.columns()属性:

  1. >>> ws.columns
  2. ((<Cell Sheet.A1>,
  3. <Cell Sheet.A2>,
  4. <Cell Sheet.A3>,
  5. <Cell Sheet.A4>,
  6. <Cell Sheet.A5>,
  7. <Cell Sheet.A6>,
  8. ...
  9. <Cell Sheet.B7>,
  10. <Cell Sheet.B8>,
  11. <Cell Sheet.B9>),
  12. (<Cell Sheet.C1>,
  13. <Cell Sheet.C2>,
  14. <Cell Sheet.C3>,
  15. <Cell Sheet.C4>,
  16. <Cell Sheet.C5>,
  17. <Cell Sheet.C6>,
  18. <Cell Sheet.C7>,
  19. <Cell Sheet.C8>,
  20. <Cell Sheet.C9>))

数据储存

Once we have a openpyxl.cell.Cell, we can assign it a value: 当我们获取了一个单元格openpyxl.cell.Cell之后,就可以给他赋值了:

  1. >>> c.value = 'hello, world'
  2. >>> print(c.value)
  3. 'hello, world'
  4. >>> d.value = 3.14
  5. >>> print(d.value)
  6. 3.14

你也可以使用type和format接口:

  1. >>> wb = Workbook(guess_types=True)
  2. >>> c.value = '12%'
  3. >>> print(c.value)
  4. 0.12
  5. >>> import datetime
  6. >>> d.value = datetime.datetime.now()
  7. >>> print d.value
  8. datetime.datetime(2010, 9, 10, 22, 25, 18)
  9. >>> c.value = '31.50'
  10. >>> print(c.value)
  11. 31.5

保存文件

使用openpyxl.workbook.Workbook.save方法是保存openpyxl.workbook.Workbook对象的最简单、最安全的方式。

  1. >>> wb = Workbook()
  2. >>> wb.save('balances.xlsx')

Warning

该操作会覆盖已存在的文件,并且没有warning提示。


Note

Extension is not forced to be xlsx or xlsm, although you might have some trouble opening it directly with another application if you don’t use an official extension.

As OOXML files are basically ZIP files, you can also end the filename with .zip and open it with your favourite ZIP archive manager.

你可以使用属性as_template=True将文件保存为一个模板(template)。

  1. >>> wb = load_workbook('document.xlsx')
  2. >>> wb.save('document_template.xltx', as_template=True)

或者使用属性as_template=False(默认)将一个模板/文件保存为一个文件。

  1. >>> wb = load_workbook('document_template.xltx')
  2. >>> wb.save('document.xlsx', as_template=False)
  3. >>> wb = load_workbook('document.xlsx')
  4. >>> wb.save('new_document.xlsx', as_template=False)

Warning

在保存/打开文件时你需要监视(monitor)文档模板内的数据属性和文档扩展,否则在保存后的文档可能无法打开。 You should monitor the data attributes and document extensions for saving documents in the document templates and vice versa, otherwise the result table engine can not open the document.


Note

以下操作会失败:

  1. >>> wb = load_workbook('document.xlsx')
  2. >>> # Need to save with the extension *.xlsx
  3. >>> wb.save('new_document.xlsm')
  4. >>> # MS Excel can't open the document
  5. >>>
  6. >>> # or
  7. >>>
  8. >>> # Need specify attribute keep_vba=True
  9. >>> wb = load_workbook('document.xlsm')
  10. >>> wb.save('new_document.xlsm')
  11. >>> # MS Excel can't open the document
  12. >>>
  13. >>> # or
  14. >>>
  15. >>> wb = load_workbook('document.xltm', keep_vba=True)
  16. >>> # If us need template document, then we need specify extension as *.xltm.
  17. >>> # If us need document, then we need specify attribute as_template=False.
  18. >>> wb.save('new_document.xlsm', as_template=True)
  19. >>> # MS Excel can't open the document

加载一个文件

与保存文件一样,你可以通过导入openpyxl.load_workbook()开打一个已存在的workbook:

  1. >>> from openpyxl import load_workbook
  2. >>> wb2 = load_workbook('test.xlsx')
  3. >>> print wb2.get_sheet_names()
  4. ['Sheet2', 'New Title', 'Sheet1']

openpyxl 概览到此结束,你现在可开始 简单用法章节(Simple usage section )了。