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

yizhihongxing

测试环境

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()
    

    会报错,如下:

    pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。', None, None)
    
  2. 建议使用

    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/p/17277611.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 基于win32com客户端实现Excel操作 - Python技术站

(0)
上一篇 2023年4月30日
下一篇 2023年4月30日

相关文章

  • Python 函数装饰器详解

    我来详细讲解一下“Python 函数装饰器”的完整攻略。 一、什么是Python函数装饰器 函数装饰器是一种可以动态地给一个函数增加功能的方式。在不改变原有函数的代码的情况下,可以通过“装饰”原函数来对其进行修改。Python中有很多内置的装饰器,比如classmethod、staticmethod和property等。此外,Python中还提供了自定义装饰…

    python 2023年6月3日
    00
  • Python利用xlrd 与 xlwt 模块操作 Excel

    下面是关于“Python利用xlrd 与 xlwt 模块操作 Excel”的完整实例教程。 1. 简介及准备工作 Python是一种强大的编程语言,可用于处理大量数据和实现各种功能。在Python中,使用xlrd和xlwt模块可以非常方便地读取和写入Microsoft Excel文件。 在开始之前,我们需要安装这两个 Python 模块,使用pip工具即可:…

    python 2023年5月13日
    00
  • Python实现自动识别并批量转换文本文件编码

    Python实现自动识别并批量转换文本文件编码 在文本处理中,文本文件的编码格式可能会出现不一致的情况,这会导致文本文件无法正确地被读取或处理。Python提供了多种方法实现自动识别并批量转换文本文件编码的功能。本文将总结Python实现自动识别并批量转换文本文件编码的方法,并提供两个示例说明。 方法一:使用chardet库 chardet是Python中一…

    python 2023年5月14日
    00
  • Python实现不规则图形填充的思路

    下面我将给出详细的Python实现不规则图形填充的攻略。 思路概述 要实现不规则图形的填充,我们需要以下步骤: 根据不规则图形的边界,生成一个包含所有像素点的列表; 循环遍历每个像素点,判断该点是否在不规则图形内部; 如果该点在内部,则对该点进行填充(修改颜色); 输出最终填充完成的图形。 示例一:用Python实现一个正方形的填充 下面是在Python中实…

    python 2023年5月19日
    00
  • python通过http下载文件的方法详解

    在Python中,我们可以使用urllib库或requests库来通过HTTP下载文件。下载文件时,我们需要注意文件的大小和下载进度,以便正确地下载文件。本文将通过实例讲解如何使用Python通过HTTP下载文件,包括使用urllib库和requests库,以及两个示例。 使用urllib库下载文件 我们可以使用urllib库的urlretrieve方法来下…

    python 2023年5月15日
    00
  • python 获取et和excel的版本号

    下面是Python获取ET和Excel的版本号的完整实例教程。 1.概述 ET是Python下的XML解析库,常用于处理XML和HTML数据。而Excel是一款电子表格软件,由微软公司开发。在处理ET和Excel文件的时候,有时候需要获取它们的版本号,可以帮助我们更好地了解这些工具的功能和特性。 2.获取ET版本号 获取ET版本号比较简单,只需要少量Pyth…

    python 2023年5月14日
    00
  • python的sys.path模块路径添加方式

    添加模块搜索路径是Python程序中经常遇到的问题之一。在Python中,可以通过在sys模块中的path列表中查找模块。默认情况下,sys.path是继承自环境变量PYTHONPATH以及Python安装的标准库的目录。但是,我们也可以添加自定义的模块路径到sys.path中,以便Python可以在这些自定义路径中查找模块。 以下是添加python模块路径…

    python 2023年6月2日
    00
  • python判断完全平方数的方法

    下面是“python判断完全平方数的方法”的完整攻略。 判断完全平方数的方法 方法一:使用平方根函数 首先,我们可以使用Python内置的平方根函数判断一个数是否为完全平方数。具体做法如下: import math def isPerfectSquare(num: int) -> bool: if num < 0: return False if…

    python 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部