首页 > 编程语言 >Python 基于win32com客户端实现Excel操作

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

时间:2023-04-29 12:55:16浏览次数:67  
标签:__ index sheet Python Excel app excel win32com result

测试环境

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

标签:__,index,sheet,Python,Excel,app,excel,win32com,result
From: https://www.cnblogs.com/shouke/p/17277611.html

相关文章

  • python高阶用法汇总——(1)高阶函数
    lambda1defsum(a,b):2returna+b3print(sum(1,5))45lab=lambdaa,b:a+b6print(lab(1,3))1-3行正常用法,5-6lambda用法。lambda:冒号之前的全是参数,即函数括号里面的 sum(a,b)冒号之后的是表达式,即return的结果。lambda只能写在一行。一般情况下,我们不使用......
  • 【python基础】创建和删除目录
    前言importosimportshutilpath='/home/tfl19671/out'ifnotos.path.exists(path):os.mkdir(path)else:shutil.rmtree(path,True)os.mkdir(path)其中shutil.rmtree(filepath,ignore_errors=True)删除整个filepath路径的内容。如果ignore_errors=True,则表示删除......
  • Python数据类型详解
    Python最基本的内置数据类型包括:布尔型(表示真假的类型,仅包含True和False两种取值);整型(整数,例如42、10000000);浮点型(小数,例如3.14159,或用科学计数法表示的数字,例如1.0e8,它表示1乘以10的8次方,也可写作10000000.0);字符串型(字符组成的序列);一、变量Python里所有数据——布尔值、整数、浮点......
  • Windows安装Python3
    1、Python安装Python是跨平台的编程语言,它可以运行在windowS、Mac和各种Linux/Unix系统上。也就是说,假设在windows系统下编写的Python程序,在Mac或Linux系统下也是可以运行的。目前,Python的版本主要分为两大类,即Python3.X版和Python2.x版,这两个版本是不兼容的。由于Python3.x......
  • Python自动化办公——Selenium控制浏览器
    Python之selenium创建多个标签页码夫破石2022-11-04原文最近在做一个项目,需要用到cookies登录,想法是,在同一个浏览器下,打开两个标签页进行。让其自动获取cookies,先记录,不行的话,到时候再手动加载cookies。1'''2#selenium加载新标签页3'''4#导入所需库5fromseleniumi......
  • csv用Excel打开出现乱码
    CSV用Excel打开出现乱码今天出现一个问题使用wps打开不会出现乱码。但使用excel打开的时候会出现乱码。其实在我们把文件流转成文件的时候需要在bolb对象前加上unicode标识,只需要下载的时候在数据流前面新增一个标识就行了。还有一点需要记住,res一定是blob对象,所以看......
  • Python元组传参, cv2.rectangle的奇怪错误
    colors=(np.array(colors)*255).astype(np.int)color=colors[i]cv2.rectangle(img,(x0,y0),(x1,y1),color,2)"""tuple(colors[i])(0,255,0)tuple(colors[i])==(0,255,0)Truecv2.rectangle(img,(x0,y0),(x1,y1),colors[i],2)Tra......
  • 树莓派Python读取DHT11温湿度数据
    树莓派4使用Python通过GPIO从DHT11温湿度传感器读取数据原文地址:https://blog.zeruns.tech/archives/625.html介绍DHT11是一款有已校准数字信号输出的温湿度传感器。其精度湿度±5%RH,温度±2℃,量程湿度20-90%RH,温度0~50℃。精度不高,但价格低廉。DHT11使用单总线通信。供电电......
  • 4.25python
      Python编程规范主要包括代码布局、命名规范、注释规范、函数编写规范等多个方面,下面给出一些常见的编程规范及其示例代码。1.代码布局规范代码布局规范主要是指代码的缩进、行宽、空行、换行等方面,下面是一些常见的代码布局规范:使用四个空格作为一个缩进级别,不要使......
  • [oeasy]python0141_自制模块_module_reusability_复用性
    自制包内容回忆上次内容上次导入了外部的py文件importmy_module导入一个自己定义的模块 可以使用my_module中的变量不能直接使用my_module.py文件中的变量只要加my_module.作为前缀就可以  直接导入导入变量、函数frommy_mo......