介绍
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) 注意 仅复制单元格(包括值,样式,超链接和注释)和某些工作表属性(包括维度,格式和属性)。不复制所有其他工作簿/工作表属性 - 例如图像,图表。 您也无法在工作簿之间复制工作表。如果工作簿以只读或只写 模式打开,则无法复制工作表。
操作单元格
#访问单个单元格 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'] 这样就结束了本教程,您可以进入简单使用部分

浙公网安备 33010602011771号