Python 基于win32com客户端实现Excel操作

简介: 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()

说明:

  1. 如果不添加以下代码行:
pythoncom.CoInitialize()
  1. 会报错,如下:
pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。', None, None)
  1. 建议使用
excel_app = win32com.client.DispatchEx('Excel.Application')
  1. 替代
# excel_app = win32com.client.Dispatch('Excel.Application')
  1. 实践发现,多线程的情况下,使用Dispatch会出现报错,原因似乎是Dispatch若发现进程已经存在的话,就不会创建新的进程。若不创建新的进程,有些操作会有冲突,可能会影响到已经打开的文件。

参考连接

https://learn.microsoft.com/zh-cn/office/vba/api/excel.font.color

https://blog.csdn.net/qq_25176745/article/details/125085819

目录
相关文章
|
7天前
|
XML 物联网 API
服务端和客户端 RESTful 接口上传 Excel 的 Python 代码
本文作者木头左是物联网工程师,分享如何使用 Python 和 Flask-RESTful 构建一个简单的 RESTful API,实现文件上传功能,特别支持Excel文件。通过安装Flask和Flask-RESTful库,创建Flask应用,实现文件上传接口,并将其添加到API。该方法具有简单易用、灵活、可扩展及社区支持等优点。
服务端和客户端 RESTful 接口上传 Excel 的 Python 代码
|
9天前
|
Java Serverless 应用服务中间件
Serverless 应用引擎操作报错合集之部署python项目时,构建过程报错,怎么解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
1天前
|
API Python
Python库`openpyxl`是一个用于读取和写入Excel 2010 xlsx/xlsm/xltx/xltm文件的库。
【6月更文挑战第19天】`openpyxl`是Python处理xlsx文件的库,支持读写Excel 2010格式。使用`pip install openpyxl`安装。基本操作包括加载文件、读写单元格、操作行和列。例如,加载Excel后,可以读取单元格`A1`的值,或将“Hello, World!”写入`A1`。还可修改单元格内容,如加1后保存到新文件。更多功能,如样式和公式,见官方文档[1]。 [1]: <https://openpyxl.readthedocs.io/en/stable/>
7 1
|
1天前
|
Python
【代码】Python实现Excel数据合并
【代码】Python实现Excel数据合并
7 0
|
1天前
|
Python
【干货】python xlwt写入excel操作
【干货】python xlwt写入excel操作
8 2
|
5天前
|
JSON 数据格式 Python
Python 的 requests 库是一个强大的 HTTP 客户端库,用于发送各种类型的 HTTP 请求
【6月更文挑战第15天】Python的requests库简化了HTTP请求。安装后,使用`requests.get()`发送GET请求,检查`status_code`为200表示成功。类似地,`requests.post()`用于POST请求,需提供JSON数据和`Content-Type`头。
32 6
|
5天前
|
测试技术 iOS开发 MacOS
用Python处理Excel的资源
用Python处理Excel的资源
用Python处理Excel的资源
|
5天前
|
缓存 Python
[译]Python 和 TOML:新最好的朋友 (2) 使用Python操作TOML
[译]Python 和 TOML:新最好的朋友 (2) 使用Python操作TOML
|
5天前
|
开发者 Python
Python零基础入门-4 使用函数减少重复操作
Python零基础入门-4 使用函数减少重复操作
|
5天前
|
编解码
Python-【键盘-鼠标】移动、操作、输入
Python-【键盘-鼠标】移动、操作、输入
11 0