大鹏

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

介绍
openpyxl是一个用于读取/写入Excel 2010 xlsx / xlsm / xltx / xltm文件的Python库。
它源于缺乏现有的库,可以从Python本地读取/写入Office Open XML格式。
作为openpyxl,PHPExcel团队的所有荣誉最初都基于PHPExcel。

#示例代码
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws ['A1'] = 42
ws.append([1,2,3])
import datetime
ws['A2'] = datetime.datetime.now()
wb .save('sample.xlsx')

 

from openpyxl import Workbook    #创建新的工作薄
wb = Workbook()
ws = wb.active     #获取当前工作表

#创建工作表
ws1 = wb.create_sheet('Mysheet')    # insert at the end (default)
ws2 = wb.create_sheet('Mysheet',0)  # insert at first position
#改变工作表的名称
ws.title = "New Title"

#改变工作表的背景颜色
ws.sheet_properties.tabColor= '1072BA'

#保存工作内容
wb.save('ELE.xlsx')

#查看工作簿的所有工作表的名称
print(wb.sheetnames)

#遍历工作表
for sheet in wb:
    print(sheet.title)


#复制当前工作表
source = wb.active
target = wb.copy_worksheet(source)
print(wb.sheetnames)

 

创建工作簿
无需在文件系统上创建文件即可开始使用openpyxl。只需导入Workbook该类并开始工作:

>>> from openpyxl import Workbook
>>> wb = Workbook()
始终使用至少一个工作表创建工作簿。您可以使用该Workbook.active属性获取它:

>>> ws = wb.active
注意

默认设置为0。除非您修改其值,否则您将始终使用此方法获取第一个工作表。

您可以使用以下Workbook.create_sheet()方法创建新工作表:

>>> ws1 = wb.create_sheet("Mysheet") # insert at the end (default)
# or
>>> ws2 = wb.create_sheet("Mysheet", 0) # insert at first position
表单在创建时会自动为其指定名称。它们按顺序编号(Sheet,Sheet1,Sheet2,...)。您可以随时使用该Worksheet.title属性更改此名称:

ws.title = "New Title"
默认情况下,包含此标题的选项卡的背景颜色为白色。您可以更改此项RRGGBB,为Worksheet.sheet_properties.tabColor属性提供颜色代码 :

ws.sheet_properties.tabColor = "1072BA"
一旦为工作表提供了名称,就可以将其作为工作簿的一个键:

>>> ws3 = wb["New Title"]
您可以使用该Workbook.sheetname属性查看工作簿的所有工作表的名称

>>> print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1']
您可以遍历工作表

>>> for sheet in wb:
...     print(sheet.title)
您可以在单个工作簿中创建工作表的副本:

Workbook.copy_worksheet() 方法:

>>> source = wb.active
>>> target = wb.copy_worksheet(source)
注意

仅复制单元格(包括值,样式,超链接和注释)和某些工作表属性(包括维度,格式和属性)。不复制所有其他工作簿/工作表属性 - 例如图像,图表。

您也无法在工作簿之间复制工作表。如果工作簿以只读或只写 模式打开,则无法复制工作表。
View Code

 

 

操作单元格

#访问单个单元格
c = ws['A4'] #返回A4处的单元格,如果尚不存在,则创建一个单元格
ws['A4'] = 4   #存在就赋值,出存在并创建且赋值

#使用行和列表示法提供对单元格的访问
d = ws.cell(row=4,column=2,value=10)
print(d)

#将在内存中创建100x100个单元格,无需任何操作
for x in range(1,101):
    for y in range(1,101):
        ws.cell(row= x,column=y)

 

#访问多个单元格
cell_range = ws['A1':'C2']

colC = ws['C']
col_range = ws['C:D']
row10 = ws[10]
row_range = ws[5:10]


#Worksheet.iter_rows() 返回行
for row in ws.iter_rows(min_row=1,max_col=3,max_row=2):
    for cell in row:
        print(cell)

#Worksheet.iter_cols()方法将返回列

for col in ws.iter_cols(min_row=1,max_col=3,max_row=2):
    for cell in col:
        print(cell)


#如果需要遍历文件的所有行或列,则可以使用该 Worksheet.rows属性

ws = wb.active
ws['C9']='hello world'
tuple(ws.rows)

 

 

玩数据
访问一个单元
现在我们知道如何获取工作表,我们可以开始修改单元格内容。单元格可以直接作为工作表的键访问:

>>> c = ws['A4']
这将返回A4处的单元格,如果尚不存在,则创建一个单元格。值可以直接分配:

>>> ws['A4'] = 4
还有Worksheet.cell()方法。

这使用行和列表示法提供对单元格的访问:

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

在内存中创建工作表时,它不包含单元格。首次访问时会创建它们。

警告

由于此功能,滚动单元格而不是直接访问它们将在内存中创建它们,即使您没有为它们分配值。

就像是

>>> for x in range(1,101):
...        for y in range(1,101):
...            ws.cell(row=x, column=y)
将在内存中创建100x100个单元格,无需任何操作。

访问多个单元
可以使用切片访问单元格范围:

>>> cell_range = ws['A1':'C2']
行或列的范围可以类似地获得:

>>> colC = ws['C']
>>> col_range = ws['C:D']
>>> row10 = ws[10]
>>> row_range = ws[5:10]
您还可以使用以下Worksheet.iter_rows()方法:

>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
...    for cell in row:
...        print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
同样,该Worksheet.iter_cols()方法将返回列:

>>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
...     for cell in col:
...         print(cell)
<Cell Sheet1.A1>
<Cell Sheet1.A2>
<Cell Sheet1.B1>
<Cell Sheet1.B2>
<Cell Sheet1.C1>
<Cell Sheet1.C2>
注意

出于性能原因,该Worksheet.iter_cols()方法不能以只读模式使用。

如果需要遍历文件的所有行或列,则可以使用该 Worksheet.rows属性:

>>> ws = wb.active
>>> ws['C9'] = 'hello world'
>>> tuple(ws.rows)
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
(<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
(<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
(<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
(<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
(<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
或Worksheet.columns财产:

>>> tuple(ws.columns)
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
<Cell Sheet.A4>,
<Cell Sheet.A5>,
<Cell Sheet.A6>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
<Cell Sheet.C2>,
<Cell Sheet.C3>,
<Cell Sheet.C4>,
<Cell Sheet.C5>,
<Cell Sheet.C6>,
<Cell Sheet.C7>,
<Cell Sheet.C8>,
<Cell Sheet.C9>))
注意

出于性能原因,该Worksheet.columns属性不能以只读模式使用。

仅限值
如果您只想要工作表中的值,则可以使用该Worksheet.values属性。这会迭代工作表中的所有行,但只返回单元格值:

for row in ws.values:
   for value in row:
     print(value)
数据存储
一旦我们有了Cell,我们可以为它分配一个值:

>>> c.value = 'hello, world'
>>> print(c.value)
'hello, world'

>>> d.value = 3.14
>>> print(d.value)
3.14
保存到文件
保存工作簿的最简单和最安全的方法是使用对象的 Workbook.save()方法Workbook:

>>> wb = Workbook()
>>> wb.save('balances.xlsx')
警告

此操作将覆盖现有文件而不发出警告。

注意

文件扩展名不是强制为xlsx或xlsm,但如果您不使用官方扩展名,则可能无法直接使用其他应用程序打开它。

由于OOXML文件基本上是ZIP文件,您还可以使用.zip结束文件名,并使用您喜欢的ZIP存档管理器打开它。

保存为流
如果要将文件保存到流中,例如在使用Pyramid,Flask或Django等Web应用程序时,您只需提供 NamedTemporaryFile():

>>> from tempfile import NamedTemporaryFile
>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> with NamedTemporaryFile() as tmp:
        wb.save(tmp.name)
        tmp.seek(0)
        stream = tmp.read()
您可以指定属性template = True,以将工作簿另存为模板:

>>> wb = load_workbook('document.xlsx')
>>> wb.template = True
>>> wb.save('document_template.xltx')
或者将此属性设置为False(默认),以保存为文档:

>>> wb = load_workbook('document_template.xltx')
>>> wb.template = False
>>> wb.save('document.xlsx', as_template=False)
警告

您应该监视数据属性和文档扩展名以便在文档模板中保存文档,反之亦然,否则结果表引擎无法打开文档。

注意

以下将失败:

>>> wb = load_workbook('document.xlsx')
>>> # Need to save with the extension *.xlsx
>>> wb.save('new_document.xlsm')
>>> # MS Excel can't open the document
>>>
>>> # or
>>>
>>> # Need specify attribute keep_vba=True
>>> wb = load_workbook('document.xlsm')
>>> wb.save('new_document.xlsm')
>>> # MS Excel will not open the document
>>>
>>> # or
>>>
>>> wb = load_workbook('document.xltm', keep_vba=True)
>>> # If we need a template document, then we must specify extension as *.xltm.
>>> wb.save('new_document.xlsm')
>>> # MS Excel will not open the document
从文件加载
与编写相同,您可以使用openpyxl.load_workbook()打开现有工作簿:

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook('test.xlsx')
>>> print wb2.sheetnames
['Sheet2', 'New Title', 'Sheet1']
这样就结束了本教程,您可以进入简单使用部分
View Code

 

 

 

参考:https://openpyxl.readthedocs.io/en/stable/

posted on 2018-12-06 00:01  pf42280  阅读(140)  评论(0)    收藏  举报