openpyxl写入单元格数据,openpyxl读取xlsx合并单元格

  openpyxl写入单元格数据,openpyxl读取xlsx合并单元格

  

目录

  1背景

  2相关信息

  Excel结构

  OpenPyXL概述

  4.1构建环境

  4.2导入工具包

  4.3读取文件

  4.4按行读取和按列读取。

  4.5读取值

  4.6访问和修改单元格

  4.7合并单元格

  4.8储存

  4.9其他

  文件格式

  4.9.2复制值和样式

  1背景前两天家里有一项工作要做:把系统导出的一张excel表分成几个长短不一的部分,分完之后需要把里面的名字提取出来分发给对应的人。观察表格后发现每个分割的部分都有重复的标题,而要提取的姓名等信息的位置相对于标题是固定的,于是想到了写代码识别标题进行分割,然后提取姓名分别导出。

  首先,我找到了excel自己的VBA,但我不习惯这种代码风格。我还发现我可以用pandas,xlrd,openpyxl等在python中处理excel。所以我试了一下。最后我选了openpyxl,方便又互动,大概两个小时就解决了问题。我把大家的表格分别导出,名字等信息作为文件名。结果还不错。

  这里有个小总结。

  2相关资料手册:这是有人在一本简书里翻译的openpyxl的手册。它短小精悍,看完之后就可以做表格的基本操作了。官方文档:如果想深入学习或者使用高级功能,还是要看文档。在阅读相关资料之前,我建议大家先复习一下excel的结构,这样操作起来会更容易一些。

  3 excel结构openpyxl之所以具有交互性和人性化,是因为它的结构是按照excel的结构设计的。我们先来回顾一下excel:

  图为一个新的excel文件打开后的样子。我们可以把它想象成一本账本:

  每个excel文件都是一个

workbook

(一本账簿)

  每个工作簿可以创建多个

worksheet

(每个账簿有很多页)。

  每个工作表中有许多行

rows

和列

columns

。行标签用数字表示,列标签用字母表示。

  在行和列的交叉处是单元格

cell

(簿记),每个单元格有许多属性:

  编号:由单元格的秩唯一表示,即

column+row

  值:每个单元格中记录的内容

  类型:字符、数字、日期等。

  样式:背景颜色、字体等。

  4 OpenPyXL

4.1 搭建环境

总结因为阅读对象可能不是专业程序员,所以我先介绍一下基础环境的搭建。构建环境有三个步骤:

  安装python环境

  安装pip

  通过pip安装openpyxl工具包

  第一步安装环境时,可以安装一个IDE(集成开发环境),比如Pycharm、Anaconda等。这样工具包可以直接安装在IDE中。

  

4.2 导入工具包

先导入python文件中的openpyxl使用。大多数情况下,导入工作簿就足够了。

  从openpyxl导入工作簿

4.3 读取文件

导入pyxlas XL。xlsx文件转换成工作簿变量wb,提取工作簿中的第一张表,存储在变量ws中,这样我们就可以在excel中对工作表进行大量的操作。

  filename= full/path/of/xlsx # load file WB=XL . load _ workbook(filename)# Get first sheets=wb1 . workshop[0]

4.4 按行读取,按列读取

使用工作表的iter_rows()和iter_cols()方法可以读出每一行/列,然后循环读入每一行/列以获取每个单元格。此时,单元格的编号信息被打印出来。

  # read by row for row in ws . ITER _ rows():for cell in row:print(cell)# read by col for col in ws . ITER _ cols():for cell in col:print(cell)4.5读取值获取单元格后,只需调用单元格的method _value即可获取单元格内的内容。

  # read by row for row in ws . ITER _ rows():for cell in row:print(cell。_ value)# read by column for col in ws . ITER _ cols():for col:print(cell。_ value) 4.6访问和修改单元格。您可以通过给出序列号来直接访问和编辑单元格,序列号的规格是列号(字母)和行号(数字),例如“A1”

  # C1得到A1 C1=ws[ A1 ]# C2得到A1 C2=ws。cell(row=1,column=1)# eidt A2ws[A2]=1 4.7合并单元格合并单元格也是超过中非常常见的操作,在超过中只需要拖选中要合并的框然后点击合并即可;安装同理,拖动的步骤由切片完成,切片方法是

起始cell编号:终止cell编号

,合并调用的是工作表的函数合并_单元格

  #将A1合并到f1ws。合并单元格( A1:F1 )4.8存储存储的对象是工作簿,当对工作表进行操作后直接存储其所属的工作簿,存储的格式仍然是文件格式

  文件名保存=path/of/savewb.save(文件名保存)4.9其它还有两点想要补充说明一下:

  4.9.1 文件格式目前安装可以读取的是office2003以后的超过格式即. xlsx,因此如果表格是旧格式。电子表格文档的需要将文件另存一下,

切记不要直接修改后缀名,可能导致文件不可用

  4.9.2 拷贝值和样式这个问题是我在做的时候遇到的,当从一个工作表拷贝价值到另一个工作表时,其样式不会跟随拷贝。如果要连带样式一起拷贝需要加入如下语句:

  从复制导入复制#复制1到10开始=10 #最大列MC=ws。max _ column # for I in range(start,end 1): for j in range(1,mc 1): #从源超过文件读取单元格值source _单元格=工作表。单元格(行=I,列=j) #将读取的值写入目标超过文件目标单元=ws保存。cell(row=I-start 1,column=j) #复制样式、注释和超链接,如果source _ cell。has _ style:target _单元格._style=copy(source_cell ._ style)目标_单元格。font=copy(source _ cell。font)目标单元格。border=copy(source _ cell。border)目标单元格。fill=copy(source _ cell。填充)目标单元格。number _ format=copy(源单元格。数字格式)目标单元格。保护=复制(source _ cell。保护)目标_单元。对齐=复制(source _ cell。对齐)if source _ cell。超链接:目标单元格。_ hyperlink=copy(source _ cell。超链接)if source _ cell。注释:target _ cell。comment=copy(source _ cell。注释)#复制值target _ cell。值=源单元格._值目标单元格。数据类型=源单元格。数据类型请注意的是

cell无法拷贝列宽和行高,列宽行高要通过worksheet的column_dimensions和row_dimensions属性来修改

,可以参考这篇文章,另外可以查到一些自适应宽高的方法。

  欢迎交流和指正。

openpyxl写入单元格数据,openpyxl读取xlsx合并单元格