Python 基于win32com客户端实现Excel操作的详细过程
作者:授客 发布时间:2021-01-18 11:22:47
标签:Python,win32com,Excel
测试环境
Python 3.6.2
代码实现
非多线程场景下使用
新建并保存EXCEL
import win32com.client
from win32api import RGB
def save_something_to_excel(result_file_path):
excel_app = win32com.client.Dispatch('Excel.Application')
excel_app.Visible = False # 设置进程界面是否可见 False表示后台运行
excel_app.DisplayAlerts = False # 设置是否显示警告和消息框
book = excel_app.Workbooks.Add() # 添加Excel工作簿
sheet = excel_app.Worksheets(1) # 获取第一个Sheet
sheet.name = '汇总统计' # 设置Sheet名称
sheet.Columns.ColumnWidth = 10 # 设置所有列列宽
sheet.Columns(1).ColumnWidth = 20 # 设置第1列列宽
sheet.Rows.RowHeight = 15 # 设置所有行高
sheet.Rows(1).RowHeight = 20 # 设置第一行行高
usedRange = sheet.UsedRange # 获取sheet的已使用范围
rows = usedRange.Rows.Count # 获取已使用范围的最大行数,初始值为 1
cols = usedRange.Columns.Count # 获取已使用范围的最大列数,初始值为 1
print(rows, cols) # 输出 1 1
usedRange.Rows.RowHeight = 30 # 设置已使用范围内的行高
usedRange.Columns.ColumnWidth = 30 # 设置已使用范围内的列宽
# do something ...
row_index = 1
for index, item in enumerate(['日期', '请求方法', 'URL', '调用次数']):
# 单元格赋值 sheet.Cells(row_index, col_index).Value = 目标值 row_index, col_index 起始值为1
sheet.Cells(row_index, index + 1).Value = item
row_index += 1
# do something else ...
usedRange = sheet.UsedRange
rows = usedRange.Rows.Count
cols = usedRange.Columns.Count
print(rows, cols) # 输出 1 4
sheet.Cells(1, 2).Font.Size = 29 # 设置单元格字体大小
sheet.Cells(1, 2).Font.Bold = True # 字体是否加粗 True 表示加粗,False 表示不加粗
sheet.Cells(2, 2).Font.Name = "微软雅黑" # 设置字体名称
# sheet.Cells(2, 2).Font.Color = RGB(0, 0, 255) # 设置字体颜色 # 不起作用
sheet2 = excel_app.Worksheets.Add() # 添加Sheet页
sheet2.Activate # 设置默认选中的sheet为sheet2
sheet3 = excel_app.Worksheets.Add()
#注意,Move操作,会将被移动的表单(本例中的sheet)设置为默认选中状态,也就是说覆盖 sheet.Activate所做的变更
sheet.Move(sheet3, None) # 将sheet移动到sheet3之前
book.SaveAs(result_file_path) # 注意:结果文件路径必须是绝对路径
book.Close() # 关闭工作簿
excel_app.Quit() # 退出
if __name__ == '__main__':
save_something_to_excel('D:\\codePojects\\logStatistics\\result\\result.xlsx')
了解更多API,可以查看参考连接
读取现有EXCEL
import win32com.client
def read_something_from_excel(excel_file_path):
excel_app = win32com.client.Dispatch('Excel.Application')
excel_app.Visible = False
excel_app.DisplayAlerts = False
book = excel_app.Workbooks.Open(result_file_path, False, True, None, None) # 打开工作簿
# do something ...
sheet = excel_app.Worksheets(1)
print(sheet.name)
print(sheet.Cells(1, 1).Value)
book.SaveAs(result_file_path) # 注意:结果文件路径必须是绝对路径
book.Close() # 关闭工作簿
excel_app.Quit() # 退出
if __name__ == '__main__':
read_something_from_excel('D:\\codePojects\\logStatistics\\result\\result.xlsx')
多线程场景下使用
import threading
import win32com.client
import pythoncom
def save_something_to_excel(result_file_path):
pythoncom.CoInitialize()
excel_app = win32com.client.DispatchEx('Excel.Application')
# excel_app = win32com.client.Dispatch('Excel.Application')
excel_app.Visible = False
excel_app.DisplayAlerts = False
book = excel_app.Workbooks.Add()
sheet = excel_app.Worksheets(1)
sheet.name = '汇总统计'
row_index = 1
for index, item in enumerate(['日期', '请求方法', 'URL', '调用次数']):
sheet.Cells(row_index, index + 1).Value = item
row_index += 1
book.SaveAs(result_file_path)
book.Close()
excel_app.Quit()
pythoncom.CoUninitialize() # 释放资源
if __name__ == '__main__':
for i in range(3):
file_path = 'D:\\codePojects\\logStatistics\\result\\result%s.xlsx' % i
thread = threading.Thread(target=save_something_to_excel,
args=(file_path,))
thread.start()
说明:
如果不添加以下代码行:
pythoncom.CoInitialize()
会报错,如下:
pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。', None, None)
建议使用
excel_app = win32com.client.DispatchEx('Excel.Application')
替代
# excel_app = win32com.client.Dispatch('Excel.Application')
实践发现,多线程的情况下,使用Dispatch
会出现报错,原因似乎是Dispatch
若发现进程已经存在的话,就不会创建新的进程。若不创建新的进程,有些操作会有冲突,可能会影响到已经打开的文件。
参考连接
https://learn.microsoft.com/zh-cn/office/vba/api/excel.font.color
https://blog.csdn.net/qq_25176745/article/details/125085819
来源:https://www.cnblogs.com/shouke/archive/2023/04/29/17277611.html
0
投稿
猜你喜欢
- 本文实例讲述了使用coverage统计python web项目代码覆盖率的方法。分享给大家供大家参考,具体如下:在使用python+sele
- 本文实例为大家分享了python实现在线翻译的具体代码,供大家参考,具体内容如下具体效果请看图代码:import urllib.reques
- Django 的 ORM 有多种关系:一对一,多对一,多对多各自定义的方式为 :一对一: OneToOneField多对一: Foreign
- 问题描述MySQL函数或者存储过程中使用group_concat()函数导致数据字符过长而报错CREATE DEFINER=`root`@`
- 见图---pycharm左下角点击,就会发现来源:https://blog.csdn.net/huanglei1234567890/arti
- Session作用Session的根本作用就是在服务端存储用户和服务器会话的一些信息。典型的应用有:1、判断用户是否登录。2、购物车功能。s
- 前言对于很多接触Python的人而言,字符的处理和语言整体的温顺可靠相比显得格外桀骜不驯难以驾驭。文章针对Python 2.7,主要因为3对
- MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为N
- 关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码。这样并不利于初学者的学习,希望这篇文章可以更通
- 一般要用到递归,就要判断对象是否和父类型是否一样这里演示简单的对象递归,还有数组递归类似。var obj = { a:{w:1,y:2,x:
- 本文实例讲述了Python使用Pickle库实现读写序列操作。分享给大家供大家参考,具体如下:简介pickle模块实现了用于对Python对
- 知识点:了解lxml模块和xpath语法的关系;了解lxml模块的使用场景;了解lxml模块的安装;了解 谷歌浏览器xpath helper
- Python# coding=utf-8import timeimport sysdef func(): # 格式化输出时间 &
- 什么是pyecharts?pyecharts 是一个用于生成 Echarts 图表的类库。echarts是百度开源的一个数据可视化 JS 库
- 本文实例讲述了python任务调度实现方法。分享给大家供大家参考。具体如下:方法1:import sched, timeimport oss
- CSS写法:overflow-y:visible本代码适用平台:IE6,IE7演示:<textarea style="wid
- 本文实例为大家分享了python实现图片转换成素描和漫画格式的具体代码,供大家参考,具体内容如下原图图片转换后的成果源码# -*- codi
- php高并发之opcache今天工作的时候接触到客户的一台服务器,业务逻辑比较简单 。估算pv在120w左右吧,用的是阿里云2c4g的服务器
- 下面的例子将结合项目实际运用来使用Jquery.TreeView,当然在使用控件树需要现在相应的js文件 下面就把我生成的TreeView展
- 引言“ 这是MySQL系列笔记的第三篇,文章内容均为本人通过实践及查阅资料相关整理所得,可用作新手入门指南,或