一、各个模块的比较
二、情况说明
我本次使用是要操作几百页excel,并且在原基础上不能改变格式,因此折腾了几天,用下来最终选择
openxyxl
修改大量数据表格的时候非常缓慢,但是在内容较少时很快,win32com
一直比较稳定,可用于区域内容的复制粘贴xlwings
速度也比较稳定,用于写入数据和图片
最终选择:
xlrd
用作表格读取openpyxl
用作内容比较少的时候内容添加win32com
用于模板页的复制xlwings
用于内容较多时候的添加任务
三、库的使用
3.1 openxyxl
库的使用
from openpyxl import load_workbook
from openpyxl.styles import Side, Border, colors, Font, Alignment,PatternFill
# 加载现有表格
wb = load_workbook('模板.xlsx')
# 获取sheet
ws: object = wb["sheet1"]
# 设置单元格内容
ws.cell(1, 1).value = '表格A1的内容'
# 设置单元格背景颜色
LightGrey_fill = PatternFill(fill_type='solid', fgColor="D3D3D3")
ws.cell(1, 1).fill = LightGrey_fill
# 合并单元格
ws.merge_cells('b3:e3')
# 设置单元格边框
border = Border(left=Side(border_style='thin', color=colors.BLACK),
right=Side(border_style='thin', color=colors.BLACK),
top=Side(border_style='thin', color=colors.BLACK),
bottom=Side(border_style='thin', color=colors.BLACK))
ws.cell(i + 3, j).border = border
# 设置单元格字体和对齐样式
font_content = Font('宋体', size=11, color=colors.BLACK, bold=False, italic=False)
alignment_cc = Alignment(horizontal='center', vertical='center', text_rotation=0, wrap_text=True,shrink_to_fit=True, indent=0)
alignment_cl = Alignment(horizontal='left', vertical='center', text_rotation=0, wrap_text=True,shrink_to_fit=True,indent=0)
# (1,1)表示的是A1
ws.cell(1, 1).font = font_content
ws.cell(1, 1).alignment = alignment_cc
# 覆盖或另存为
wb.save('新表格.xlsx')
3.2 win32com
库的使用
from win32com.client import Dispatch
xlApp = Dispatch('Excel.Application')
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open('模板.xlsx')
xlSheet = xlApp.Worksheets('sheet1')
# 复制某个区域
rng_data = xlSheet.Range(xlSheet.Cells(1, 1), xlSheet.Cells(5, 5))
# 从哪里开始粘贴
xlSheet.Paste(Destination=xlSheet.Cells(10, 1))
xlBook.Save()
xlApp.Quit()
3.3 xlwings
库的使用
import xlwings
app = xlwings.App(visible=False, add_book=False)
app.display_alerts = False # 关闭一些提示信息,可以加快运行速度。 默认为 True。
app.screen_updating = False # 更新显示工作表的内容。默认为 True。关闭它也可以提升运行速度
wb = app.books.open('模板.xlsx')
sht = wb.sheets["sheet1"]
sht.range(basic_rows + 1, 1).value = rows_info['case_title']
# 添加图片(一种自适应添加图片的方法)
pic_path= '{0}\\test_pic\\{1}.jpg'.format(os.getcwd(),rows_info['case_title'])
rng = sht.range('a{0}:l{1}'.format(basic_rows + 31,basic_rows + 46))
if (os.path.isfile(pic_path)):
img = Image.open(pic_path)
img_width,img_height = img.size[0],img.size[1]
left = rng.left + (rng.width - img_width) / 2
top = rng.top + (rng.height - img_height) / 2
if (img_width<450 and img_height<210):
sht.pictures.add(pic_path, left=left, top=top, width=img_width, height=img_height)
if(img_width>420 or img_height>210):
rate = img_width/img_height
if( rate > 2.0):
# 过宽(以宽度为标准,高度自动缩放)
left = rng.left + (rng.width - 450) / 2
top = rng.top + (rng.height - (450//rate)) / 2
sht.pictures.add(pic_path, left=left, top=top, width=450, height=(450//rate))
else:
# 过高(以高度为标准,宽度自动缩放)
left = rng.left + (rng.width - (210*rate)//1) / 2
top = rng.top + (rng.height - 210) / 2
sht.pictures.add(pic_path, left=left, top=top, width=(210*rate)//1, height=210)
else:
pic_path= '{0}\\{1}.jpg'.format(os.getcwd(),'图片模板')
left = rng.left + (rng.width - 420) / 2
top = rng.top + (rng.height - 210) / 2
sht.pictures.add(pic_path, left=left, top=top, width=420, height=210)
wb.save('模板.xlsx')
wb.close()
app.quit()