Python中用OpenPyXL处理Excel表格
新建Excel表格
新建Excel表格,默认有一个名为 Sheet 的表格,如下:
| 1 | from openpyxl import Workbook | 
打开已有的Excel表格
对已有的Excel表格进行操作,如下:
| 1 | from openpyxl import Workbook, load_workbook | 
新建/获取Sheet表格
使用 Workbook.create_sheet() 方法新建Sheet表格。第一个参数是sheet名称,若不填,则默认以 Sheet1 Sheet2 Sheet3 …方式命名;第二个参数是插入Sheet表格的位置,以 0 为第一个位置,若不填,则置于最后。如下:
| 1 | ws1 = wb.create_sheet("Mysheet") #默认在最后插入 | 
也可以后期随时修改sheet的名字,如下:
| 1 | ws.title = "New Title" | 
修改sheet标签颜色,如下:
| 1 | ws.sheet_properties.tabColor = "1072BA" | 
若知道sheet的名字,可以用如下方式获取sheet :
| 1 | ws = wb.get_sheet_by_name("New Title") | 
也可获取全部sheet的名字,遍历sheet名字,如下:
| 1 |  sheets = wb.sheetnames | 
也可以定位到相应sheet页,[0]为sheet页索引,如下:
| 1 | sheet_names = wb.sheetnames  # 获取所有sheet页名字 | 
复制Sheet表格
仅能复制 单元格的值 样式 超链接 注释块 等,而 图片 和 表格 等是无法复制的,如下:
| 1 | source = wb.active | 
操作单元格
由 worksheet 获取单元格,或直接给单元格赋值,如下:
| 1 | cell = ws['A4'] #获取第4行第A列的单元格 | 
获取区域内的单元格,如下:
| 1 | cell_range = ws['A1':'C2']  #获取A1-C2内的区域 | 
如果得到单元格,可以赋值,如下:
| 1 | cell.value = 'hello, world' | 
获取单元格的值,如下:
| 1 | cellValue = ws.cell(row=i, column=j).value | 
获取行列数,如下:
| 1 | row = ws.max_row #最大行数 | 
一行行的获取数据,如下:
| 1 | >>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2): | 
一列列的获取数据,如下:
| 1 | >>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2): | 
因为性能的原因, Worksheet.iter_cols() 方法不能在只读模式下使用。
获取所有的列或行,如下:
| 1 | rows = ws.rows | 
因为性能的原因, Worksheet.columns 方法不能在只读模式下使用。
如果只想从worksheet中获取值,可以使用 Worksheet.values 属性,如下:
| 1 | for row in ws.values: | 
Worksheet.iter_rows() 和 Worksheet.iter_cols() 方法都可以添加 values_only 参数来达到仅获取值的目的,如下:
| 1 | for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True): | 
保存文件
使用 Workbook.save() 方法保存workbook,这个方法会不加提示的覆盖原文件,如下:
| 1 | wb = Workbook() | 
获取单元格类型
| 1 | from openpyxl import Workbook, load_workbook | 
使用公式
| 1 | from openpyxl import Workbook, load_workbook | 
合并单元格
| 1 | from openpyxl import Workbook, load_workbook | 
插入一个图片
需要 pillow 库,安装如下:
| 1 | pip install pillow | 
| 1 | from openpyxl import load_workbook | 
隐藏单元格
| 1 | from openpyxl import load_workbook | 
优化模式
在处理非常大的 XLSX 文件时,openpyxl 的常规模式无法处理这种负载。幸运的是,有两种模式可以在(几乎)恒定内存消耗的情况下读写无限量的数据。
只读模式
| 1 | from openpyxl import load_workbook | 
只写模式
| 1 | from openpyxl import Workbook | 
- 与普通工作簿不同,新创建的只写工作簿不包含任何工作表;必须使用 create_sheet()方法专门创建工作表。
- 在只写的工作簿中,只能使用 append()添加行。使用cell()或iter_rows()在任意位置写(或读)单元格是不可能的。
- 它能够导出无限数量的数据(甚至比Excel实际能够处理的更多),同时将内存使用量保持在10Mb以下。
插入/删除行/列,移动区域单元格
插入行/列
在第7行之上插入一行,如下:
| 1 | ws.insert_rows(7) | 
在第7列的左边插入一列,如下:
| 1 | ws.insert_cols(7) | 
删除行/列
从第6列开始,删除3列,即删除6、7、8列,如下:
| 1 | ws.delete_cols(6, 3) | 
移动区域单元格
将 D4:F10 区域向上移动一行向右移动2列,如下:
| 1 | ws.move_range("D4:F10", rows=-1, cols=2) | 
如果区域内包含 公式 ,则如下方法可以连同公式一起挪动:
| 1 | ws.move_range("G4:H10", rows=1, cols=1, translate=True) | 
使用 Pandas 和 NumPy
详情请移步 Working with Pandas and NumPy
图表
图表由至少一个系列的一个或多个单元格区域数据点组成。更多内容请移步 图表介绍
注释
openpyxl 可读/写注释,但格式信息会被丢失。在 只读模式 下不支持操作注释。注释必须包括 内容 和 作者 。
读注释,如下:
| 1 | comment = ws["A1"].comment | 
写注释,如下:
| 1 | comment = Comment("Text", "Author") | 
表格样式
字体样式
字体名称、字体大小、字体颜色、加粗、斜体、纵向对齐方式(有三种:baseline,superscript, subscript)、下划线、删除线,如下:
| 1 | from openpyxl.styles import Font | 
字体颜色可以用 RGB 或 aRGB ,如下:
| 1 | font = Font(color="FFBB00") | 
继承并重写样式,如下:
| 1 | ft1 = Font(name='Arial', size=14) | 
填充样式
详情请移步 填充样式
| 1 | from openpyxl.styles import PatternFill | 
边框样式
详情请移步 边框样式
| 1 | from openpyxl.styles import Border, Side | 
对齐样式
horizontal 的值有:distributed, justify, center, left, fill, centerContinuous, right, general
vertical 的值有:bottom, distributed, justify, center, top
| 1 | from openpyxl.styles import Alignment | 
保护样式
锁定、隐藏
| 1 | from openpyxl.styles import Protection | 
整行或整列应用样式
| 1 | col = ws.column_dimensions['A'] | 
更改合并的单元格样式
合并的单元格可以想想成为左上角的那个单元格来操作。
筛选和排序
| 1 | from openpyxl import Workbook | 
生成的Excel表格,有筛选排序的操作,但是没有实际表现出效果,如下图:

需要手动点击 重写应用 才能显示出效果,如下图:


密码保护
该功能仅能提供一个很基础的密码保护,没有进行加密处理,网上普通的破解软件都可以破解密码。不过,日常使用还是可以的。
该功能仅可用于新建excel表格,不能用于已存在的excel表格。
workbook工作薄保护
防止查看隐藏sheet,避免增加、移动、删除、隐藏或重命名sheet等操作,可以保护workbook的结构,如下:
| 1 | wb.security.workbookPassword = '...' | 
worksheet保护
worksheet保护不需要密码,如下:
| 1 | ws = wb.active | 
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号