Python 基于win32com客户端实现Excel操作的详细过程

 更新时间:2023年05月01日 07:56:10   作者:授客  
这篇文章主要介绍了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

到此这篇关于Python 基于win32com客户端实现Excel操作的详细过程的文章就介绍到这了,更多相关Python Excel操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

    Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

    这篇文章主要介绍了Python+Dlib+Opencv实现人脸采集并表情判别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • django缓存配置的几种方法详解

    django缓存配置的几种方法详解

    缓存对各位学习或者使用django的朋友们来说应该都不陌生,下面这篇文章主要给大家介绍了关于django缓存配置的几种方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-07-07
  • pytorch之inception_v3的实现案例

    pytorch之inception_v3的实现案例

    今天小编就为大家分享一篇pytorch之inception_v3的实现案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python实现爬取百度图片的方法示例

    python实现爬取百度图片的方法示例

    这篇文章主要介绍了python实现爬取百度图片的方法,涉及Python基于requests、urllib等模块的百度图片抓取相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • Python删除视频的某一段并保留其他时间段

    Python删除视频的某一段并保留其他时间段

    moviepy是一个非常强大的视频处理库,可以轻松进行视频剪切、合并、添加特效等操作,本文我们就来使用moviepy实现删除视频的某一段并保留其他时间段吧
    2024-11-11
  • python3中替换python2中cmp函数的实现

    python3中替换python2中cmp函数的实现

    这篇文章主要介绍了python3替换python2中cmp函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 计算机二级python学习教程(3) python语言基本数据类型

    计算机二级python学习教程(3) python语言基本数据类型

    这篇文章主要为大家详细介绍了计算机二级python学习教程的第3篇,python语言基本数据类型,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 用sleep间隔进行python反爬虫的实例讲解

    用sleep间隔进行python反爬虫的实例讲解

    在本篇文章里小编给大家整理了一篇关于用sleep间隔进行python反爬虫的实例讲解内容,有需要的朋友们可以学习下。
    2020-11-11
  • 像线程一样管理进程的Python multiprocessing库

    像线程一样管理进程的Python multiprocessing库

    multiprocessing库是基于threading API,它可以把工作划分为多个进程.有些情况下,multiprocessing可以作为临时替换取代threading来利用多个CPU内核,相应地避免Python全局解释器锁所带来的计算瓶颈.本文详细介绍了Python multiprocessing库,需要的朋友可以参考下
    2021-05-05
  • Python Web App开发Dockerfiles编写示例

    Python Web App开发Dockerfiles编写示例

    这篇文章主要为大家介绍了Python Web App编写Dockerfiles的示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论