Openpyxl 操作

Openpyxl 操作

Openpyxl 操作

xls xlsx 文件格式转换

openpyxl是用于读取/写入Excel 2010 xlsx/xlsm文件的Python库, 也就是说openpyxl这个Python库不支持xls文件的读取和操作

可以手工打开另存转换格式 或者

 1import os
 2import win32com.client as win32
 3filename = '.\1.xls'
 4Excelapp = win32.gencache.EnsureDispatch('Excel.Application')
 5workbook = Excelapp.Workbooks.Open(filename)
 6# 转xlsx时: FileFormat=51,
 7# 转xls时:  FileFormat=56,
 8workbook.SaveAs(filename.replace('xls', 'xlsx'), FileFormat=51)
 9workbook.Close()
10Excelapp.Application.Quit()
11# 删除源文件
12# os.remove(filename)
13
14# 如果想将xlsx的文件转换为xls的话,则可以使用以下的代码:
15# workbook.SaveAs(filename.replace('xlsx', 'xls'), FileFormat=56)

创建、打开工作簿

 1import openpyxl
 2
 3# 创建新工作簿
 4wb = openpyxl.WorkBook()
 5# 在指定位置新建工作表
 6ws = wb.create_sheet('sheetname', 0)
 7
 8# 打开已有工作簿
 9wb = openpyxl.load_workbook('xlsx_filename')
10# 打开已有工作表
11ws = wb['sheetname']
12ws1 = wb.get_sheet_by_name('sheetname')
13
14# 设置工作表标签颜色
15ws.sheet_properties.tabColor = 'ff0000'
16
17# 读取已有所有工作表名称
18for sht in ws.sheetnames:
19    print("sht : ", sht)
20# 保存并退出
21wb.save('xlsx_filename')
22wb.close()

单元格操作

 1# 访问指定单元格
 2cell_1 = ws['A1']
 3cell_2 = ws.cell(row=1, column=1)
 4
 5# 返回指定单元格的值
 6value_1 = ws['A1'].value
 7value_2 = ws.cell(row=1, column=1).value
 8
 9# 设置指定单元格内容
10ws['A1'].value = 'xlsx 内容'
11ws.cell(row=1, column=1).value ='xlsx 内容'
12
13# 多个单元格
14# 访问A1至C3范围单元格
15cell_range = ws['A1':'C3']
16# 访问A列所有存在数据的单元格
17colA = ws['A']
18# 访问A列到C列所有存在数据的单元格
19col_range = ws['A:C']
20# 访问第1行所有存在数据的单元格
21row1 = ws[1]
22# 访问第1行至第5行所有存在数据的单元格
23row_range = ws[1:5]
24
25# 多行列
26for row in ws.iter_rows(min_row=1, max_col=2, max_row=2):
27    for cell in row:
28        print(cell)
29#输出:
30<Cell 'sht'.A1>
31<Cell 'sht'.B1>
32<Cell 'sht'.A2>
33<Cell 'sht'.B2>
34
35for col in ws.iter_cols(min_row=1, max_col=2, max_row=2):
36         for cell in col:
37             print(cell)
38#输出:
39<Cell 'sht'.A1>
40<Cell 'sht'.A2>
41<Cell 'sht'.B1>
42<Cell 'sht'.B2>
43
44# 单元格的常见属性
45print(ws.cell(column=2, row=9).column_letter)
46print(ws.cell(column=2, row=9).coordinate)
47print(ws.cell(column=2, row=9).col_idx)
48print(ws.cell(column=2, row=9).encoding)
49print(ws.cell(column=2, row=9).offset)
50print(ws.cell(column=2, row=9).is_date)
51print(ws.cell(column=2, row=9).data_type)
52print(ws.cell(column=2, row=9).has_style)
53print(ws.cell(column=2, row=9).style)
54print(ws.cell(column=2, row=9).style_id)
55print(ws.cell(column=2, row=9).font)
56print(ws.cell(column=2, row=9).alignment)
57print(ws.cell(column=2, row=9).border)
58print(ws.cell(column=2, row=9).fill)
59print(ws.cell(column=2, row=9).number_format)
60print(ws.cell(column=2, row=9).hyperlink)
61
62# 调整列宽和行高
63# 调整列宽
64ws.column_dimensions['A'].width = 20.0
65# 调整行高
66ws.row_dimensions[1].height = 40
67
68# 合并单元格
69ws.merge_cells("A1:B1")
70ws.merge_cells(start_column=3,end_column=5,start_row=3,end_row=5)

单元格样式设置

 1from openpyxl import *
 2from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
 3
 4# 设置字体
 5font = Font(name='微软雅黑',
 6            size=11,
 7            color='FF000000',
 8            bold=True,
 9            italic=True,
10            vertAlign='baseline',
11            underline='double',
12            strike=False)
13wsheet['A2'].font = font
14
15# 边线设置
16side_type = Side(border_style='mediumDashDot',color='FF000000')
17border = Border(left=side_type,
18                right=side_type,
19                top=side_type,
20                bottom=side_type,
21                diagonal=side_type,
22                diagonal_direction=30,
23                outline=side_type,
24                vertical=side_type,
25                horizontal=side_type
26                )
27
28wsheet['A3'].border = border
29# border_style的样式有:
30# ‘dashDot’,‘dashDotDot’,‘dashed’,‘dotted’,‘double’,
31# ‘hair’,‘medium’,‘mediumDashDot’,‘mediumDashDotDot’,
32# ‘mediumDashed’,‘slantDashDot’,‘thick’,‘thin’
33
34# 填充设置
35fill = PatternFill(fill_type = 'darkDown',start_color='A6DA70D6',end_color='000000')
36wsheet['A4'].fill = fill
37# fill_type类型有:'none'、'solid'、'darkDown'、'darkGray'、'darkGrid'、'darkHorizontal'、'darkTrellis'、'darkUp'、'darkVertical'、'gray0625'、
38# 'gray125'、'lightDown'、'lightGray'、'lightGrid'、'lightHorizontal'、
39# 'lightTrellis'、'lightUp'、'lightVertical'、'mediumGray'
40
41# 对齐设置
42align = Alignment(horizontal='center',vertical='center',text_rotation=0,wrap_text=True,shrink_to_fit=True,indent=0)
43wsheet['A6'].alignment = align
44# Horizontal:水平方向,左对齐left,居中center对齐和右对齐right可选。
45# Vertical:垂直方向,有居中center,靠上top,靠下bottom,两端对齐justify等可选。
46# text_rotation:文本旋转度。
47# wrap_text:自动换行
48# Indent:缩进。
49
50# 数字格式设置
51wsheet['A9'].number_format = 'd-mmm-yy'
52
53col = ws.column_dimensions['A']
54col.number_format = u'#,##0.00€'
55# 一些格式
56# 0: 'General',
57# 1: '0',
58# 2: '0.00',
59# 3: '#,##0',
60# 4: '#,##0.00',
61# 5: '"$"#,##0_);("$"#,##0)',
62# 6: '"$"#,##0_);[Red]("$"#,##0)',
63# 7: '"$"#,##0.00_);("$"#,##0.00)',
64# 8: '"$"#,##0.00_);[Red]("$"#,##0.00)',
65# 9: '0%',
66# 10: '0.00%',
67# 11: '0.00E+00',
68# 12: '# ?/?',
69# 13: '# ??/??',
70# 14: 'mm-dd-yy',
71# 15: 'd-mmm-yy',
72# 16: 'd-mmm',
73# 17: 'mmm-yy',
74# 18: 'h:mm AM/PM',
75# 19: 'h:mm:ss AM/PM',
76# 20: 'h:mm',
77# 21: 'h:mm:ss',
78# 22: 'm/d/yy h:mm',
79#
80# 37: '#,##0_);(#,##0)',
81# 38: '#,##0_);[Red](#,##0)',
82# 39: '#,##0.00_);(#,##0.00)',
83# 40: '#,##0.00_);[Red](#,##0.00)',
84#
85# 41: r'_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)',
86# 42: r'_("$"* #,##0_);_("$"* \(#,##0\);_("$"* "-"_);_(@_)',
87# 43: r'_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)',
88#
89# 44: r'_("$"* #,##0.00_)_("$"* \(#,##0.00\)_("$"* "-"??_)_(@_)',
90# 45: 'mm:ss',
91# 46: '[h]:mm:ss',
92# 47: 'mmss.0',
93# 48: '##0.0E+0',
94# 49: '@',

使用公式

1# 所有可用公式都在这里
2from openpyxl.utils import FORMULAE
3print(len(FORMULAE))
4print(FORMULAE)
5
6
7sheet["C2"] = "=SUM(A2,B2)"

合并拆分单元格

1ws.merge_cells('A2:D2')
2ws.unmerge_cells('A2:D2')
3# or equivalently
4ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
5ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)

隐藏行列

1ws.column_dimensions.group('A','D', hidden=True)
2ws.row_dimensions.group(1,10, hidden=True)
3wb.save('group.xlsx')

插入删除行列

1ws.insert_rows(7)
2ws.insert_cols(3)
3ws.delete_rows(7)
4ws.delete_cols(3)