python+excel=openpyxl(一)

14分钟前阅读1回复0
wly
wly
  • 管理员
  • 注册排名8
  • 经验值52065
  • 级别管理员
  • 主题10413
  • 回复0
楼主

原方案写一个openpyxl的操做文档,普及下python若何来操做excel,成果人家官方的文档已经写的十分完美了,就暂时改主意把人家的文档翻译了一遍。能够阅读英文文档的同窗,定见各人间接往看官方的API操做文档

官网地址:Openpyxl

创建一个excel文件

利用openpyxl模块工做时,我们并需要在系统文件中创建一个excel文件。只需要导进Workbook类就能够了:

from openpyxl import Workbook

wb = Workbook()

一个excel文件老是会主动创建至少一张表,也就是所谓的sheet

你能够通过利用号令Workbook对象名.active来获取那张sheet

ws = wb.active

重视:active默认获取下标0的表。除非你自行指定了下标,不然你将永久都只能获取到第一张表。

你能够利用号令Workbook对象.create_sheet()来创建sheet表单:

ws1 = wb.create_sheet("Mysheet") # insert at the end (default)

# or

ws2 = wb.create_sheet("Mysheet", 0) # insert at first position

# or

ws3 = wb.create_sheet("Mysheet", -1) # insert at the penultimate position

自行创建的sheet表单城市主动的生成一个名字。类似与sheet、sheet1、sheet2…你随时都能够修改那个名字,只要通过属性title:

wb.title = ‘new title’

默认情状下,改题目表单下的表格是白色的。你能够通过属性:表单对象.sheet_properties.tabColor来设置

ws.sheet_properties.tabColor = "1072BA"

一旦你定义了sheet表单的题目之后,你就能够将其做为workbook对象的key来停止挪用:

ws3 = wb["New Title"]

通过sheetname属性你能够阅读workbook对象下所有sheet表单的题目

print(wb.sheetnames)

['Sheet2', 'New Title', 'Sheet1']

你也能够轮回遍历所有的sheet表单

for sheet in wb:

... print(sheet.title)

你能够在当前文件中,创建sheet表单的副本

source = wb.active

target = wb.copy_worksheet(source)

重视:

只要单位格(包罗值、款式、超链接和正文)和某些表格工做属性(包罗尺寸、格局和属性)。不克不及复造所有其他文件/表单的属性,好比:图像、图表

也不克不及在工做簿之间赋值sheet表。假设工做簿是只读或者只写的形式,那么你也不克不及赋值它。

操做数据

拜候一个单位格

如今我们已经晓得了若何取获取一个sheet表单,如今能够起头修改表单中单位格的内容了。单位格能够做为表单的key来间接拜候

c = ws['A4']

上面号令将会返回A4单位格,假设A4不存在的话,那号令施行完成之后会主动创建一个。能够间接停止赋值操做

ws['A4'] = 4

openpyxl也供给了cell()函数。

那个函数能够通过行和列更切确的拜候单位格

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

重视:

内存中的sheet表不存在任何的单位格。所有你操做的单位格都是在拜候的同时创建的恰是因为此特征,所以即便你没有给他们分配值,也能够通过滚动的阅读的体例在内存中创建单位格

类似于下列办法

for x in range(1,101):

... for y in range(1,101):

... ws.cell(row=x, column=y)

那个代码块将会创建一个100*100的单位格,但没有什么现实意义

拜候多个单位格

能够通过切片来拜候多个单位格

cell_range = ws['A1':'C2']

也能够利用类似的办法来获取行或者列的范畴

colC = ws['C']

col_range = ws['C:D']

row10 = ws[10]

row_range = ws[5:10]

你也能够利用iter_row()办法:

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

同样利用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()办法在只读形式下不成用。

假设你需要遍历所有的行或者列的话,你能够利用row属性或者columns属性

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))

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))

重视:

处于性能原因的考虑,columns属性在只读形式下不成以用

仅获取单位格的值

假设你只是想获取sheet表单中的值的话,能够利用属性valus。那将遍历工做表中所有的行,但仅返回单位格的值

for row in ws.values:

for value in row:

print(value)

iter_rows()和iter_cols()函数通过参数 values_only也都能够之返回值

for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):

... print(row)

(None, None, None)

(None, None, None)

数据存储

一旦我们有了一个单位格之后,我们能够指定它的值

c.value = 'hello, world'

print(c.value)

'hello, world'

d.value = 3.14

print(d.value)

3.14

保留到文件

最简单以及最平安的用来保留workbook的办法,是通过利用workbook类对象的save()办法

wb = Workbook()

wb.save('balances.xlsx')

重视:

此操做将会重写已存在的文件内容,而且不会给出警告

文件名扩展名不是强逼为xlsx或xlsm,假设你不利用官方扩展名,那你可能无法通过其他利用法式间接翻开此文件。

因为OOXML文件根本上是ZIP文件,因而您也能够利用本身喜好的ZIP存档治理器将其翻开。

存储为流

假设你想将文件保留到流对象中,好比,在你利用一些像Pyramid、Flask或者Django如许的web框架时,你只需要通过一个NameTemporaryFile()对象

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,将workbook对象保留为一个模板

wb = load_workbook('document.xlsx')

wb.template = True

wb.save('document_template.xltx')

或者将属性设置为False(默认值),将workbook对象保留为一个文件

wb = load_workbook('document_template.xltx')

wb.template = False

wb.save('document.xlsx', as_template=False)

加载已有的文件

与创建文件不异,通过openpyxl.load_workbook()能够翻开一个现有的文件

from openpyxl import load_workbook

wb2 = load_workbook('test.xlsx')

print wb2.sheetnames

['Sheet2', 'New Title', 'Sheet1']

0
回帖

python+excel=openpyxl(一) 期待您的回复!

取消