openpyxl

Python 可以读写 Excel 表格吗?

那当然。 Python 下有很多类库可以做到, openpyxl 就是其中的佼佼者。

openpyxl设计非常漂亮 ,你一定会喜欢它!不信请往下看:

工作簿

开始 openpyxl 前,无需提前建好工作簿( Workbook )。只需导入 Workbook 类,便可开始在内存中创建并操作工作簿:

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

新建的工作簿默认预先建好一个工作表,通过 active 属性获取:

  1. >>> ws = wb.active

注解

如果工作簿包含多个工作表,该属性将返回第一个。

通过 create_sheet 方法,可以创建新的工作表。创建可以是在后面追加:

  1. >>> ws1 = wb.create_sheet('Mysheet')

或者,在前面插入:

  1. >>> ws1 = wb.create_sheet('Mysheet', 0)

未指定表格名将自动生成,序列形如: SheetSheet1Sheet2 ,以此类推。当然了,你觉得不合适可以进行修改:

  1. >>> ws.title = 'New Title'

工作表标题标签背景颜色默认是白色。用一个 RGB 颜色代码设置 sheet_properties.tabColor 属性即可修改:

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

一旦你给工作表命名,便可以通过该名字来定位:

  1. >>> ws3 = wb["New Title"]

通过 sheetnames 方法,可以取出所有工作表表名:

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

当然了,遍历所有工作表,直接 for-in 更为优雅:

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

使用 copy_worksheet 方法,可在工作簿内拷贝工作表:

  1. >>> source = wb.active
  2. >>> target = wb.copy_worksheet(source)

数据处理

单单元格

操作工作表,从修改单元格内容开始。单元格可以通过工作表键直接访问:

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

这个语句将返回 A4 单元格,或者在单元格不存在时创建它。可以直接赋值:

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

另一种方式是使用 cell 方法访问单元格,给定行列:

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

注解

工作表创建后,不包含任何单元格,单元格在第一次被访问时自动创建。

多单元格

连续多个单元格可以通过切片获得:

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

以行或类为单位也可以:

  1. >>> colC = ws['C']
  2. >>> col_range = ws['C:D']
  3. >>> row10 = ws[10]
  4. >>> row_range = ws[5:10]

使用 iter_rows 方法也可以:

  1. >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
  2. ... for cell in row:
  3. ... print(cell)
  4. <Cell Sheet1.A1>
  5. <Cell Sheet1.B1>
  6. <Cell Sheet1.C1>
  7. <Cell Sheet1.A2>
  8. <Cell Sheet1.B2>
  9. <Cell Sheet1.C2>

如需遍历表格所有行或列,可以使用相关属性。使用 rows 属性遍历所有行:

  1. >>> ws = wb.active
  2. >>> ws['C9'] = 'hello world'
  3. >>> tuple(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>))

使用 columns 属性遍历所有列:

  1. >>> tuple(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>))

数据存储

Excel 表格通过单元格存储数据,直接赋值即可:

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

与此同时,还可以附加类型以及格式化信息:

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

保存至文件

最保险的保存方式是调用 save 方法保存到指定文件:

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

警告

这个操作将覆盖已存在的文件,没有任何提示!

借助 template 属性,可以将工作表保存成文档:

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

或者保存成普通文档:

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

保存至流

FlaskDjangoWeb 应用,可能需要将文件保存到流( stream )。借助一个临时文件( NamedTemporaryFile )可以轻松解决:

  1. >>> from tempfile import NamedTemporaryFile
  2. >>> from openpyxl import Workbook
  3. >>> wb = Workbook()
  4. >>> with NamedTemporaryFile() as tmp:
  5. ... wb.save(tmp.name)
  6. ... tmp.seek(0)
  7. ... stream = tmp.read()

从文件加载

导入 openpyxl.load_workbook 函数来加载已存在的工作簿:

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

下一步

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../_images/wechat-mp-qrcode.png小菜学编程

微信打赏