文档:https://openpyxl.readthedocs.io/en/stable/index.html
注意事项: 1、查看正在打开的excel表格就不会报错,但是,如果操作正在打开的excel表格,就会报错。 # 写入异常,因为你正在打开当前的 excel。关闭即可。 PermissionError: [Errno 13] Permission denied: '审计模板.xlsx'1、实例化
- 感觉好像两个都可以用。
from openpyxl import load_workbook
from openpyxl import Workbook
wb = load_workbook("data.xlsx") # 实例化;如果是新文件,默认会创建一个工作表
wb = Workbook("data.xlsx") # 实例化
下面开始,ws 就是工作表,wb 就是表格实例化。
下面开始,ws 就是工作表,wb 就是表格实例化。
下面开始,ws 就是工作表,wb 就是表格实例化。
2、操作工作表(sheel)
创建工作表
wb.create_sheet('Datas', 0)
# 第一个参数写要创建的工作表名字,第二个参数是将创建的工作表放在哪里
# 名字不写,则默认(Sheet、Sheet1、Sheet2、...), 第二个参数不写,则默认添加到后面。
对新表操作
# 这样可以直接对新表进行操作 ws2 = wb.create_sheet() # 表对象 ws2['F5'] = 3.14
获取所有工作表的名称
wb.get_sheet_names() # 获取所有sheet的名称;已弃用 wb.sheetnames # 现在用这个
# 循环输出 sheet 的名称。
wb = load_workbook('data.xlsx')
for i in wb:
print(i.title)
使用工作表
sheet = wb.active # 获取第一个 sheet
# 使用指定工作表
修改工作表名称
ws = wb.active ws.title = "range names" # 对第一个工作表修改名字
删除工作表
wb.remove_sheet(wb.get_sheet_by_name("Da")) # 括号参数写工作表的名字
print(wb.get_sheet_names()) # 获取所有sheet的名称
保存
# 所有的操作都需要保存才生效。
wb.save('data.xlsx') # 保存文件,注意:如果该文件存在,则覆盖原有的文件
3、操作单元格
获取最大列(max_column)
sheet.max_column # 获取最大列,要先用了active方法正在使用的sheet,才能用这个方法去获取最大列和最大行
获取最大行(max_row)
sheet.max_row # 获取最大行
获取行和列的值
# sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹。 # 按行获取,所以下面的代码是返回A1, B1, C1这样的顺序 for row in sheet.rows: for cell in row: print(cell.value) # 使用value方法,显示单元格的值
# sheet.columns类似,不过里面是每个tuple是每一列的单元格。 # 按竖获取, A1, A2, A3这样的顺序 for column in sheet.columns: for cell in column: print(cell.value) # 使用value方法,显示单元格的值
# 如果要获取指定行的内容,因为使用rows方法获取到的单元格是元祖数据,下面要将获取到的rows数据使用list方法转换成列表,
# 然后写入索引,就可以获取指定行的内容了,如果要获取竖的内容,就将rows换成columns
for cell in list(sheet.rows)[1]: # 获取第二行内容,记得,列表的索引是从0开始算的
print(cell.value)
# 获取任意区间的单元格,使用range即可
# 注意range从1开始的,因为在openpyxl中为了和Excel中的表达方式一致,并不和编程语言的习惯以0表示第一个值。
for i in range(1,4):
for y in range(1,3):
print(sheet.cell(row=i, column=y).value)
查 获取单元格的值(value)
wb = load_workbook('最终版1 - 审计项目整改落实情况表.xlsx')
ws = wb.active
print(ws['A1'].value) # 输出 A1 的单元格的值。
b4_too = ws.cell(row=1, column=1) # 使用cell方法查看表格的单元格,括号里的参数(row代表行,column代表列) print(b4_too.value) # 使用value方法,显示单元格的值只读模式
- 优点:加载速度快
原理: 有时,您需要打开或写入非常大的 XLSX 文件,而 openpyxl 中的常见例程将无法处理该负载。幸运的是,有两种模式使您能够以(接近)恒定内存消耗读取和写入无限量的数据。 openpyxl.worksheet._read_only.ReadonlyWorksheet 是只读的 与普通工作簿不同,只读工作簿将使用延迟加载。必须使用该close()方法显式关闭工作簿。
from openpyxl import load_workbook
wb = load_workbook(filename='large_file.xlsx', read_only=True) # read_only=True就是只读模式
ws = wb['big_data'] # 这个是工作表的名
for row in ws.rows:
for cell in row:
print(cell.value)
wb.close()
返回的单元格不是常规的openpyxl.cell.cell.Cell而是 openpyxl.cell._read_only.ReadOnlyCell.
写入
# 对 A9 单元格新增值 ws['A9'] = 'create1' ws['A9'].value = 'create1'
# 要写入数据,就要先使用active方法 sheet = wb.active # 数据直接分配到单元格中 # 按行添加数据,在这里使用append,python会自动转换类型 ws.append([1, 2, 3]) ws.append([2, 2, 3, 4]) ws.append(['嘿嘿', '哈哈', '呵呵']) # 使用for就可以对第一列添加数据了 for i in range(10): ws.append([i]) # 下面4行代码可将a列表放进第一列,b列表放进第二列 a = [123,465,897,51,65465,498,65] b = [65,498,65,4,51,65,495,49] for z, x in list(zip(a,b)): ws.append([z,x]) pass wb.save(r'D:ITaa.xlsx') # 保存文件,注意:如果该文件存在,则覆盖原有的文件写入公式
ws["A1"] = "=SUM(1, 1)"合并单元格
# 第一种方法
ws.merge_cells('A5:A6') # A5至A6合并
ws.unmerge_cells('A5:A6') # A5至A6取消合并
ws.merge_cells('A5:A7') # A5至A7合并
ws.unmerge_cells('A5:A7') # A5至A7取消合并
ws.merge_cells('A6:C8') # 大范围合并;A6 ~ C8 合并单元格。
# 第二种方法 ws.merge_cells(start_row=6, start_column=1, end_row=8, end_column=3) # 第6行第1列开始至第8行第3列合并 ws.unmerge_cells(start_row=6, start_column=1, end_row=8, end_column=3) # start_row=开始行,start_column=开始列,end_row=结束行,end_column=结束列插入图片
# 插入的图片会根据图片大小而溢出单元格。
img = Image('1.png') # 读取图片
ws.add_image(img, 'A7') # A7单元格添加图片
wb.save("data2.xlsx")
只写模式
from openpyxl import Workbook
wb = Workbook(write_only=True)
ws = wb.create_sheet() # 不需要写这个,写了就会多创建一个了。Workbook 实例化会自动创建的。
# 生成100行200列的数据
for irow in range(100):
ws.append(['%d' % i for i in range(200)])
wb.save('data.xlsx')
- 与普通工作簿不同,新创建的只写工作簿不包含任何工作表;必须使用该create_sheet()方法专门创建工作表。
- 在只写工作簿中,行只能用 append(). 这是不可能的写入(或读取)的细胞以与任意位置cell()或iter_rows()。
- 它能够导出无限量的数据(甚至超过 Excel 实际可以处理的数据量),同时将内存使用量保持在 10Mb 以下。
- 只写工作簿只能保存一次。之后,每次尝试将工作簿或 append() 保存到现有工作表都会引发openpyxl.utils.exceptions.WorkbookAlreadySaved 异常。
- 在实际单元格数据之前出现在文件中的所有内容都必须在添加单元格之前创建,因为它必须在此之前写入文件。例如,应在添加单元格之前设置freeze_panes。
from openpyxl.cell import WriteonlyCell from openpyxl.styles import Font cell = WriteOnlyCell(ws, value="hello world") # value=单元格的值 cell.font = Font(name='Courier', size=36) # 字体和字体大小 ws.append([cell])
class Font(Serialisable):
def __init__(
self,
name=None, # 字体
sz=None,
b=None,
i=None,
charset=None,
u=None,
strike=None,
color=None, # 字体颜色
scheme=None,
family=None,
size=None, # 字体大小
bold=None, # 是否加粗
italic=None, # 是否斜体
strikethrough=None,
underline=None,
vertAlign=None,
outline=None,
shadow=None,
condense=None,
extend=None
):
添加注释(批注)
- 在表格里面应该叫批注。
from openpyxl.cell import WriteonlyCell from openpyxl.comments import Comment cell = WriteOnlyCell(ws, value="hello world") # 单元格的值 cell.comment = Comment(text="A comment", author="Author's Name") # text=注释,author=添加注释的作者 ws.append([cell])
from openpyxl.comments import Comment
from openpyxl import load_workbook
wb = load_workbook('data1.xlsx')
ws = wb.active
# A6 单元格写批注
ws['A6'].comment = Comment(text="A comment", author="Author's Name") # text=注释,author=添加注释的作者
wb.save('data2.xlsx')
在行或列插入空行
wb = load_workbook('data1.xlsx')
ws = wb.active
ws.insert_rows(5) # 在第5行插入空行
ws.insert_cols(5) # 在第5列插入空行
wb.save('data2.xlsx')
wb.close()
删除行或列
ws.delete_cols(1) # 删除第一行 ws.delete_rows(1) # 删除第一列图表
https://openpyxl.readthedocs.io/en/stable/charts/introduction.html所有的样式都在这
# 所有的样式都在这里面 from openpyxl.styles import *
from openpyxl.styles import Font # 字体样式 from openpyxl.styles import PatternFill # 填充图案和渐变色 from openpyxl.styles import Border # 单元格的边框 from openpyxl.styles import Alignment # 单元格的对齐方式等边框
- 四周边框
cell.border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)



