Python openpyxl win32com xlwings excel文档的写入!

一、各个模块的比较

在这里插入图片描述

二、情况说明

我本次使用是要操作几百页excel,并且在原基础上不能改变格式,因此折腾了几天,用下来最终选择

  1. openxyxl修改大量数据表格的时候非常缓慢,但是在内容较少时很快,
  2. win32com一直比较稳定,可用于区域内容的复制粘贴
  3. 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()

猜你喜欢

转载自blog.csdn.net/u014779536/article/details/105055550
今日推荐