操作excel文档有多简单?看看python是如何处理的。1前言最近需要经常读写excel文件。我想通过一个程序自动处理excel文件。我发现使用python的openpyxl库读写excel文件非常方便。结构清晰,操作简单。本文总结了openpyxl的使用,主要包括以下内容:openpyxl介绍及excel文件结构说明工作表读写处理行列读写处理单元格读写处理2openpyxl与excel文件结构openpyxl是一对xlsx/xlsm/xltx/xltm格式的读写2010excel文档的python库。它的官方网站有详细的文档。使用前需要先安装导入#安装pipinstallopenpyxl#引入openpyxl模块importopenpyxl在进行excel操作之前,先对excel文件结构做一个简单的了解,以便熟悉后面的操作。如下图:一个excel文件,其内容按层级分为工作簿(file)->工作表(sheet)->行列->单元格,对应上图,整个excel文件为工作簿;工作簿下,可以有多个工作表(图中的Sheet1/test1等);工作表是对应的表格数据,分为行和列。行用序号表示,列用大写字母表示(也可以用序号);rows与column的交集是存储数据的每个单元格。所以,我们在读写excel表格的时候,基本都是按照这个层次的思路来操作的:读入文件,查找工作表,遍历行列,定位单元格,读写单元格。因此,会涉及到工作表、行列、单元格的读写操作。在这些操作之前,您需要先加载文件。一个excel文件就是一个工作簿(workbook)。加载操作如下(示例中excel文件为text.xlsx):#加载excel文件file_path="E:/pythontest/test.xlsx"workbook=openpyxl.load_workbook(file_path)3Worksheet处理3.1Worksheet读取会有多个工作表,所有工作表都可以阅读。阅读单个工作簿时,可以按工作表名称阅读。也可以使用下标(下标从0开始)。所有工作表对象:workbook.worksheets所有工作表名称:workbook.sheetnames按名称获取工作表(sheet_name):workbook[sheet_name]按下标获取工作表(i从0开始):workbook.worksheets[i]获取当前使用的工作表:workbook.active获取工作表的属性(如工作表名称、最大行数和列数等):sheet.title,sheet.max_row,sheet.max_column如下:#所有sheet对象>>>工作簿。worksheets[,,]#所有工作表名称>>>workbook.sheetnames['Sheet1','test1','test2']#按名称读取取sheet>>>workbook["Sheet1"]#按下标读取>>>workbook.worksheets[0]#获取当前使用的sheet>>>工作簿。active#获取工作表的属性>>>sheet_active.titleSheet1>>>sheet_active.max_row6>>>sheet_active.max_column33.2添加工作表如果需要添加新的工作表,按照操作流程并先添加工作表,然后保存文件。创建是通过create_sheet完成的,创建后保存(save)后才能添加文件。创建工作表,如果名称相同,会自动重命名:workbook.create_sheet("test3")在指定下标处创建工作表:workbook.create_sheet("test4",1)保存文件,如果文件路径与打开的相同如果文件路径相同,则覆盖;如果不同,则复制原文件保存(相当于另存为):workbook.save(file_path)3.3工作表修改修改工作表名称,直接设置工作表标题即可,修改后还需要保存之后的文件。#修改工作表名称>>>sheet1=workbook['test1']>>>sheet1.title='test11'#保存文件>>>workbook.save(file_path)3.4删除工作表要删除一个工作表,需要获取工作表第一个对象,并将其删除。删除有两种方法,一种是使用工作簿提供的remove方法,也可以直接使用python的del删除。删除操作后,还需要保存文件:#remove删除工作表sheet=workbook["test-1"]workbook.remove(sheet)#del操作删除delworkbook["test2"]#保存文件workbook.save(file_path)4行列处理获取sheet对象后,可以进行后续的行列操作,包括行列的读取、添加、删除。4.1读取行列得到所有的行列,然后遍历:sheet.rows,sheet.columns读取部分行列:读取sheet[1]的一行,读取sheet[2的多行:3],读取一列sheet['A'],读取多列sheet['B:C']#遍历所有行>>>forrowinsheet.rows:...print(row)...(,,)(,,)...#读取部分行>>>sheet[1](,,)>>>sheet["A:B"](('Sheet1'.A5>,),(,,,,,))4.2添加行和列添加行和列,可以指定位置添加单行或列或多行和列。直接在工作表追加行数据:sheet.append(rowdata)在指定索引处添加行和列(从1开始计算):sheet.insert_rows,sheet.insert_cols#在第4行>>>sheet插入空白行。insert_rows(4)#在第2行插入2个空行>>>sheet.insert_rows(idx=2,amount=2)#向表中添加一行数据>>>row_data=["tom",15,"tom@test.com"]>>>sheet.append(row_data)#保存修改的内容>>>workbook.save(file_path)4.3删除行列删除操作和插入行列操作一样,使用delete_rows和delete_cols方法。#删除行>>>sheet.delete_rows(2,2)>>>workbook.save(file_path)5单元格处理我们的数据最终保存在每个单元格(Cell)中,所以最后我们对数据的操作其实是单元格中的数据。在单元格中,openpyxl使用Cell对象。遍历行列数据时,可以看到输出的内容,对应的是单元格对象。电池的操作描述如下。5.1获取单元格数据值和属性值定位获取单元格有两种方式:直接指定行列名:sheet[A1]使用单元格函数(行列下标从1开始):sheet.cell(row=2,column=1)#指定行列坐标获取单元格>>>sheet["A1"]#获取单元格的单元格函数>>>sheet.cell(row=1,column=1)获取单元格对象后,可以获取数据值及其属性,包括所在的行数和列数、坐标、值等。>>>cell=sheet["A2"]>>>cell.value'张三'>>>cell.coordinate'A2'>>>cell.column1>>>cell.row25.2通过配对移动单元格cell网格区域可以上下左右移动,使用move_range(range,rows,cols),其中rows和cols为整数,正整数表示向下或向右,负整数表示向上或向左。#移动数据区(向上移动2行,向右移动3列),正整数向下或向右,负整数向上或向左sheet.move_range("A3:C3",rows=-2,cols=3)wb.save(file_path)5.3合并拆分单元格对于跨行跨列的单元格,需要合并单元格,使用merge_cells(range_string,start_row,start_column,end_row,end_column)。如果要合并的单元格有数据,则只保留左上角的数据,其他的丢弃。合并和拆分都可以通过行列坐标(如A1)或行列下标(如1,2)进行。#合并单元格,使用范围坐标sheet.merge_cells("A2:B3")#合并单元格,指定行列下标(下标从1开始)sheet.merge_cells(start_row=5,start_column=3,end_row=7,end_column=4)wb.save(file_path)#splitthecellsheet.unmerge_cells("A2:B3")sheet.unmerge_cells(start_row=5,start_column=3,end_row=7,end_column=4)#保存文件wb。save(file_path)5.4写入单元格修改写入单元格值,直接赋值cell.value即可。这里需要注意的是,可以写一个excel公式,具体公式和excel中使用的公式一致。另外,写公式的话,读的时候得到的值也是公式,不是公式值。#写数值cell.value="张三"#写公式(平均值)cell.value="=AVERAGE(B2:B6)"5.5设置单元格格式单元格的格式包括行高,列宽,字体、边框、对齐方式、填充颜色等。这些都在openpyxl的样式模块中。行高/列宽:row_dimensions[row_num].height=xx,sheet.column_dimensions[col_name].width=xxFont(字体对象):包括字段名、字号、粗体、斜体、颜色等,Font(name="MicrosoftYahei",size=20,bold=True,italic=True,color="000000")Border(Border对象和Side对象):边框各边的格式大小/颜色Side(style="thin",color="000000"),side建立边框对象:Border(left=side,right=side,top=side,bottom=side)Alignment(Alignment对象):垂直和水平对齐方向,是否自动换行。Alignment(horizo??ntal="center",vertical="center",wrap_text=True)填充颜色,分为普通色填充和渐变色填充:PatternFill(fill_type="solid",fgColor="FF0000")和GradientFill(stop=("FF0000","FD1111","000000"))#设置行高和列宽sheet.row_dimensions[1].height=50sheet.column_dimensions["A"].width=20#设置单元格字体cell=sheet["A1"]current_font=cell.fontfont=Font(name="微软雅黑",size=20,bold=True,italic=True,color="000000")cell.font=font#setborder(thinborder,black)side_style=Side(style="thin",color="000000")border=Border(left=side_style,right=side_style,top=side_style,bottom=side_style)cell.border=border#居中对齐,自动换行cell_alignment=Alignment(horizo??ntal="center",vertical="center",wrap_text=True)cell.alignment=cell_alignment#填充颜色(红色填充,以及红黑渐变填充)p_fill=PatternFill(fill_type="solid",fgColor=“FF0000”)g_fill=GradientFill(停止=(“FF0000”,“FD1111","000000"))cell.fill=p_fillsheet["B1"].fill=g_fill最后需要注意的是,这些修改操作需要在最后才进行保存操作(wb.save(file_path))才能它生效。6小结通过上面的讲解,了解了如何使用python的openpyxl库来处理excel文档,可以发现其操作逻辑相当清晰简单,符合我们使用excel的习惯。处理流程基本上是加载文件并定位要处理的工作表、行、列和单元格。对它们进行读、写、修改格式等操作。所以,如果有自动处理excel文件的需求,使用openpyxl,但仅限于只能处理2010格式的excel文档。旧格式(xls)的建议应该在操作之前更改为新格式,或者你也可以使用xlrd与xlwt模块一起操作。参考资料openpyxl官方文档:https://openpyxl.readthedocs.io/Python自动化办公系列Python操作Excel过往文章Python基础操作-文件、目录和路径MinIO分布式部署使用MinIO轻松搭建静态资源服务获取SpringBoot多数据源(三):参数化改源获取SpringBoot多数据源(二):动态数据源获取SpringBoot多数据源(一):多套源攻略Java开发必学知识:动态代理2019手头好书更多技术记录请阅读推荐我的公众号(搜索梅森技术记录): | | | | | | | | | | | | | | | | | | |