用openpyxl操作excel表格

2024-02-05未分类1613

用openpyxl操作excel表格

openpyxl 是一个用来操作excel 2010 的xlsx/xlsm的Python库。
官方文档

安装

pip3 install openpyxl
如果excel表格里面包含图片,想处理图片的话,需要安装pillow
pip3 install Pillow

首先来个例子

from openpyxl import Workbook
wb = Workbook()
# 切换到活动工作表
ws = wb.active
# 数据可以直接写到单元格中
ws['A1'] = 42
# 可以用append添加行
ws.append([1,2,3])
# Python数据可以直接转换
import datetime
ws['A2'] = datetime.datetime.now()
#保存
wb.save('sample.xlsx')

创建一个excel文档

我们没必要创建一个文档来体验openpyxl,只需要导入Workbook类就可以开始使用openpyxl了。

from openpyxl import Workbook
wb = Workbook()

一个工作薄(workbook)创建之后至少含有一个工作表(worksheet),我们可以用
openpyxl.workbook.Workbook.active()来切换切换为当前使用的工作表。
ws = wb.active

如果有多个worksheet,我们一般是切换到第一个工作表
我们也可以用openpyxl.workbook.Workbook.create_sheet()来创建工作表。

# 创建一个worksheet在最后面的位置(默认创建的工作表会在最后面,除非你指定位置)
ws1 = wb.create_sheet("mysheet1")
#创建一个工作表在最前面的位置,注意编号
ws2 = wb.create_sheet("mysheet",0)

当然我们也可以更改worksheet的名字用 title 属性
ws.title = "New Title"
默认的标签颜色是白色的,我们也可以用tabColor属性更改标签颜色,颜色格式为RRGGBB
ws.sheet_properties.tabColor = "1072BA"
当然,如果你更改了工作表(worksheet)的名字,你可以用切换过去
ws = wb["New Title"]
你可以用openpyxl.workbook.Workbook.sheetnames()来查看所有工作表名。
print(wb.sheetnames)
当然,你也可以遍历一下

for sheet in wb:
    print(sheet.title)

我们可以用openpyxl.workbook.Workbook.copy_worksheet()来复制工作表

source = wb.active
target = wb.copy_worksheet(source)

只可以复制单元格和样式,无法在工作薄之间复制单元格。

数据操作

编辑一个单元格

我们已经知道了如何访问工作表(worksheet),下面我们就可以修改单元格内容了。
我们可以直接得到单元格内容
c = ws["A4"]
也可以直接修改单元格内容
ws["A4"] = 4
有workbook方法,当然也有worksheet方法
openpyxl.worksheet.Worksheet.cell()
它提供了通过行和列来操作单元格的操作方式
d = ws.cell(row = 4, column = 2, value = 10)

当一个工作表在内存中被创建出来的时候,实际上里面是没有单元格的,单元格实在我们第一次访问的时候才被创建的。

我们只要访问单元格,即使不给单元格写入具体内容,单元格也会被创建,即只要访问了,就会被创建。例如

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

这样会创建100*100个单元格,当然,里面什么内容都没有

编辑多个单元格

我们可以用切片来访问一个单元格范围
cell_range = ws["A1":"C2"]
行和列我们也可以用类似的方法得到

colc = ws["C"]
col_range = ws["C:D"]
row10 = ws[10]
row_range = ws[5:10]

你也可以用openpyxl.worksheet.Worksheet.iter_rows()方法

>>>> for col 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>

同样,用openpyxk.worksheet.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>

如果你想迭代所有的行或者列,你可以用openpyxl.worksheet.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>))

或者用openpyxl.worksheet.Worksheet.cols属性

>>> tuple(ws.cols)

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

数据存储

一旦我们得到了一个openpyxl.cell.Cell,我们就可以给它分配一个值

>>> c.value = 'Hello World'
>>> print(c.value)
'Hello World'

>>> d.value = 3.14
>>> print(d.value)
3.14

你也可以启用数据类型和格式判断

You can also enable type and format inference

>>> wb = Workbook(guess_types = True)
>>> c.value = '12%'
>>> print(c.value)
0.12
1.
>>> import datetime
>>> d.value = datetime.datetime.now()
>>> print(d.value)
datetime.datetime.now(2010, 9, 10, 22, 25,18)

>>> c.value = '31.50'
>>> print(c.value)
31.5

保存到文件

最快速和安全的保存文件的方法是使用openpyxl.workbook.Workbook对象的openpyxl.workbook.Workbook.save()方法

>>> wb = Workbook()
>>> wb.save("balance.xlsx")

警告:
如果balance.xlsx文件已经存在,会被直接覆盖掉,木有任何提示的哦

考虑到你可能没有对应的软件来打开office文件,所以并不是强制你必须保存为xlsx或者xlsm文件。
因为OOXML文件是基于.zip文件的,所以你可以以.zip作为后缀,然后用你喜欢的压缩文件管理器来打开。
下面还有一部分没有翻译,因为暂时用不到那些功能,以后用上了再说吧。

打开一个文件,读取里面数据

你可以用openpyxl.load_workbook()来打开文件

>>> from openpyxl import load_workbook
>>> wb2 = load_workbook("test.xlsx")
>>> print(wb2.get_sheet_names())
['Sheet2', 'New Title', 'Sheet1']
>>>ws = wb['sheet2']
>>>ws['A1'].value
'姓名'
标签: python
返回列表

上一篇:list与tuple

没有最新的文章了...

相关文章

list与tuple

list与tuple

Listlist是一种有序的集合,可以随时增加或删除元素。如 L = [1,2,3,4] 我们可以用len来获取列表中元素的个数 >>>len(L) 4 我们可...