Python 基於win32com客戶端實現Excel操作

来源:https://www.cnblogs.com/shouke/archive/2023/04/29/17277611.html
-Advertisement-
Play Games

測試環境 Python 3.6.2 代碼實現 非多線程場景下使用 新建並保存EXCEL import win32com.client from win32api import RGB def save_something_to_excel(result_file_path): excel_app = ...


測試環境

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

作者:授客
微信/QQ:1033553122
全國軟體測試QQ交流群:7156436

Git地址:https://gitee.com/ishouke
友情提示:限於時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞後如有任何疑問,請聯繫我!!!
           微信打賞                        支付寶打賞                  全國軟體測試交流QQ群  
              


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、四層結構 viewer --> datasources(DataSourceCollection類型) --> datasource --> entities(EntityCollection類型) --> entity 需要學習的方向是:只需要註意每個層與層之間的關係和entity實例如何創建 ...
  • 簡介 模板方法模式(Template Method Pattern)也叫模板模式,是一種行為型模式。它定義了一個抽象公開類,包含基本的演算法骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變演算法的結構,只是重定義該演算法的某些特定步驟。不同的子類以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不 ...
  • 轉載請註明 來源:http://www.eword.name/ Author:eword Email:[email protected] 安裝Python 一、查詢是否安裝了Python及安裝路徑 #查看當前Python版本 python --version Python 2.7.16 #查看當前所有 ...
  • B/S結構系統的會話機制(session) 每博一文案 你跑得快,22歲有個家,身邊全是贊嘆,你跑得慢,30歲還在路上追求夢想。有的人為了車,房拼了一輩子, 有的人買輛摩托車走遍了大好江山。你想成為怎樣的人,過怎樣的生活,只要你不後悔就行。 並不是所有人都能在早上七點鐘起床的,也別拿一碗飯來衡量一個 ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Django筆記三十三之緩存操作 這一節介紹一下如何在 Django 中使用 redis 做緩存操作。 在 Django 中可以有很多種方式做緩存,比如資料庫,比如伺服器文件,或者記憶體,這裡介紹用的比較多的使用 redis 作為緩存。 這篇筆記主要內容如 ...
  • 大部分程式員走入編程世界第一個學習的語言就是C語言。 作為一門古老的編程語言,c語言擁有48年的發展歷程。 為什麼要學習 C語言? C語言是學習電腦程式設計語言的入門語言。最全面的編程面試網站 C語言是一門偏底層的語言,學好它,可以讓你更好的瞭解電腦。 學會了C語言,你就能學習現在任何的高級編程 ...
  • 在前幾篇文章中`LyShark`通過多種方式實現了驅動程式與應用層之間的通信,這其中就包括了通過運用`SystemBuf`緩衝區通信,運用`ReadFile`讀寫通信,運用`PIPE`管道通信,以及運用`ASYNC`反向通信,這些通信方式在應對`一收一發`模式的時候效率極高,但往往我們需要實現一次性... ...
  • P6818 [PA2013]Działka 前言 我太菜了。。。。 對著 jiangly 大佬的題解研究了一下午研究了一下午才搞出來(淚目。 作為一個蒟蒻,我就詳細的講一下我對與本題的理解。 題意 本題的的題意描述的還是比較明瞭。 在二維坐標系中,輸入 $n$ 個點 $m$ 次詢問, 每次詢問,給出 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...