python用openpyxl来操作excel表格

用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']
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • 最近在网上爬取奥运项目资料,并写入Excel中。在写到Excel中是用到了OpenPyXL,翻译了一部分自己用到的...
    LeeLom阅读 196,150评论 7 78
  • 本例为设置密码窗口 (1) If Application.InputBox(“请输入密码:”) = 1234 Th...
    浮浮尘尘阅读 13,535评论 1 20
  • 使用首先需要了解他的工作原理 1.POI结构与常用类 (1)创建Workbook和Sheet (2)创建单元格 (...
    长城ol阅读 8,372评论 2 25
  • 原文链接 翻译自官方文档 开始在内存中使用 创建一个workbook 在刚开始使用openpyxl的时候,不需要直...
    TryEnough阅读 32,884评论 1 44
  • 写作不易,转载请注明出处,且用且珍惜。 OpenPyXL的API文档 1.OpenPyXL基础操作 引入Workb...
    一只写程序的猿阅读 857评论 0 7