python操作Excel 需要安装第三方模块,这里选用openpyxl
pip install openpyxl
1. 读Excel 1.sheet相关操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from openpyxl import load_workbookwb = load_workbook("pdata.xlsx" ) print(wb.sheetnames) sheet = wb["Sheet1" ] cell = sheet.cell(2 ,1 ) print(cell.value) sheet = wb.worksheets[0 ] cell = sheet.cell(2 ,1 ) print(cell.value)
2.单元格操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from openpyxl import load_workbookwb = load_workbook("pdata.xlsx" ) sheet = wb.worksheets[0 ] cell = sheet['A2' ] print(cell.value) print(cell.style) print(cell.alignment) for cell in sheet[1 ]: print(cell.value) for row in sheet.rows: print(row[0 ].value,row[1 ].value) for col in sheet.columns: print(col[0 ].value,col[1 ].value)
2. 写Excel 1.原文件基础上写
1 2 3 4 5 6 7 8 9 from openpyxl import load_workbookwb = load_workbook("pdata.xlsx" ) sheet = wb.worksheets[0 ] cell = sheet.cell(2 ,1 ) cell.value = '新接口' wb.save("pdata.xlsx" )
2.新建文件写
1 2 3 4 5 6 7 8 9 from openpyxl import workbookwb = workbook.Workbook() sheet = wb.worksheets[0 ] cell = sheet.cell(2 ,1 ) cell.value = '新接口' wb.save("pdata1.xlsx" )
3.操作sheet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 sheet = wb.worksheets[0 ] sheet.title = '个人计划' wb.save("pdata1.xlsx" ) sheet = wb.create_sheet("新计划" ,0 ) sheet.sheet_properties.tabColor = '3c7d0d' wb.save("pdata1.xlsx" ) wb.active = 0 wb.save("pdata1.xlsx" ) new_sheet = wb.copy_worksheet(wb["个人计划" ]) wb.save("pdata1.xlsx" ) del wb["个人计划" ]wb.save("pdata1.xlsx" )
4.写单元格操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 from openpyxl import workbookwb = workbook.Workbook() sheet = wb.worksheets[0 ] cell = sheet.cell(2 ,1 ) cell.value = '开始' cell_list = sheet['B3' :'C4' ] for row in cell_list: for cell in row: cell.value = '填充' wb.save("pdata2.xlsx" ) sheet.insert_rows(idx=5 ,amount=10 ) sheet.insert_cols(idx=3 ,amount=2 ) wb.save("pdata2.xlsx" ) sheet = wb.workbooks[0 ] sheet["D3" ] = "=sum(B3,C3)" wb.save("pdata2.xlsx" )
3. 设置单元格风格 openpyxl的单元格样式由6种属性决定,每一种都是一个类
font(字体类):字号、字体颜色、下划线等
fill(填充类):颜色等
border(边框类):设置单元格边框
alignment(位置类):对齐方式
number_format(格式类):数据格式
protection(保护类):写保护
① 需要导入的类
from openpyxl.styles import Font, colors, Alignment, Border, PatternFill
② 字体
微软雅黑24号,加粗斜体,字体颜色红色
font = Font(name='微软雅黑', size=24, italic=True, color=colors.RED, bold=True) sheet['A1'].font = font
③ 背景颜色
sheet['A1'].fill = PatternFill('solid',fgColor='b6eafb')
④ 对齐方式
cell的属性aligment,这里指定垂直居中和水平居中。除了center,还可以使用right、left等等参数。
设置A1中的数据垂直居中和水平居中
sheet['A1'].alignment = Alignment(horizontal='center', vertical='center')
⑤ 设置边框
side = Side(style='thin',color='000000') # 边框样式与颜色
border = Border(top=side,bottom=side,left=side,right=side)
sheet['A1'].border = border
⑥ 设置行高和列宽
设置第1行行高
sheet.row_dimensions[1].height = 20
设置A列列宽
sheet.column_dimensions['A'].width = 25
⑦ 合并和拆分单元格
以合并区域的左上角的那个单元格为基准,覆盖其他单元格为一个单元格。 相反,拆分单元格后将这个大单元格的值返回到原来的左上角位置。
合并单元格 , 保留左上角数据,其余值丢弃
sheet.merge_cells('B1:G1') # 合并一行中的几个单元格
sheet.merge_cells('A1:C3') # 合并一个矩形区域中的单元格
合并后只可以往左上角写入数据,也就是区间中:左边的坐标。
拆分单元 格的代码,拆分后,左上角保留原值。
sheet.unmerge_cells('A1:C3')
4. 实例
读取.ini文件配置信息,并整理写入Excel(此处使用了MySQL的配置文件)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 import osimport configparserfrom openpyxl import workbookfrom openpyxl.styles import Font, Alignment, Border, PatternFill,Sidebase_dir = os.path.dirname(os.path.abspath('my.ini' )) file_path = os.path.join(base_dir,'my.ini' ) out_file_path = os.path.join(base_dir,'my.xlsx' ) wb = workbook.Workbook() del wb['Sheet' ]config = configparser.ConfigParser() config.read(file_path,encoding='utf-8' ) for section in config.sections(): sheet = wb.create_sheet(section) side = Side(style='thin' ,color='000000' ) border = Border(top=side,bottom=side,left=side,right=side) align = Alignment(horizontal='center' ,vertical='center' ) sheet.column_dimensions['A' ].width = 30 sheet.column_dimensions['B' ].width = 30 title_dict = {"A1" :"键" ,"B1" :"值" } for position,text in title_dict.items(): cell = sheet[position] cell.value = text cell.alignment = align cell.fill = PatternFill('solid' ,fgColor='b6eafb' ) cell.font = Font(name='微软雅黑' ,color="FFFFFF" ) cell.border = border row_index = 2 for group in config.items(section): print(group) for col,text in enumerate (group,1 ): cell = sheet.cell(row_index,col) cell.value = text cell.alignment = align cell.border = border row_index+=1 wb.save(out_file_path)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ('port ', '3306 ') ('default-character-set ', 'utf8 ') ('port ', '3306 ') ('basedir ', 'E:/MySQL/MySQL Server 5.7 /') ('datadir ', 'D:/MySQL/MySQL Server 5.7 /Data') ('character-set-server ', 'utf8 ') ('default-storage-engine ', 'INNODB ') ('sql-mode ', '"STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" ') ('general-log ', '0 ') ('general_log_file ', '"ZHAN.log" ') ('slow_query_log_file ', '"ZHAN-slow.log" ') ('long_query_time ', '10 ') ('log-error ', '"ZHAN.err" ') ('relay_log ', '"ZHAN-relay" ') ('server-id ', '1 ') ('report_port ', '3306 ') ('lower_case_table_names ', '1 ') ('secure-file-priv ', '"D:/MySQL/MySQL Server 5.7/Uploads" ') ('myisam_max_sort_file_size ', '100G ') ('sync_relay_log ', '10000 ') ('sync_relay_log_info ', '10000 ') ('自定义参数 ', '自定义值 ')