官方文檔:
- Microsoft >> office 開發人員中心 Excel
- GitHub >> MicrosoftDocs/VBA-Docs
目 錄
- 一、前沿
- 二、庫導入及類的初始化
- 三、工作簿及工作表(Workbook & Worksheet)
- 1、新建工作簿
- 2、打開工作簿
- 3、新建工作表
- 4、刪除工作表
- 四、單元格及區域(Cell & Range)
- 1、讀取單元格的值
- 2、設置單元格的值
- 3、設置單元格格式
- 4、區域(某一范圍內的全部單元格)
- 五、文件
- 1、保存及關閉
- 2、另存為
- 3、退出
- 六、枚舉(Excel)
- 1、常量枚舉
- 2、XlFileFormat 枚舉 (文件格式)
- 七、測試代碼
- 八、參考文獻
- 九、尾聲
一、前沿
利用本文代碼可以實現讀寫.xlsx、.xls及.csv文件,單元格格式的簡單設置,文件的另存為等。
1、pywin32庫的安裝
如已安裝Anaconda,在 Anaconda Prompt 中鍵入 pip install pywin32 便可自動完成該庫的導入;如未安裝 Anaconda,也可 pip 手動導入,其在PyPI(Python Package Index)上的注冊地址為: https://pypi.org/project/pywin32 。
2、版本說明
pywin32: 224
Excel: 2016
3、COM
COM(Component Object Model,組件對象模型)是微軟公司于1993年提出的一種組件技術,它是一種平臺無關、語言中立、位置透明、支持網絡的中間件技術。
組件對象模型,一種面向對象的編程模式。它定義了對象在單個應用程序內部或多個應用程序之間的行為方式。它是微軟對于網頁服務器與客戶端、增益集與Office系列軟件之間交互的一項軟件組件技術。
二、庫導入及類的初始化
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
=============================
Author = Hulunbuir & DalaiNur
Email: liyang@alu.hit.edu.cn
Last Update: 2019.09.09 18:47
=============================
"""
import
win32com
.
client
import
os
class
Excel
:
def
__init__
(
self
,
file_abs_path
=
None
,
create_if_not_exists
=
False
,
visible
=
False
,
display_alerts
=
False
)
:
"""初始化數據
:param file_abs_path: 文件的絕對路徑
:param create_if_not_exists: 文件不存在則不新建(默認)
:param visible: Excel程序不可見(默認)
:param display_alerts: 不顯示警告信息(默認)
"""
self
.
_visible
=
visible
self
.
_display_alerts
=
display_alerts
self
.
_xlApp
=
win32com
.
client
.
Dispatch
(
"Excel.Application"
)
self
.
_xlApp
.
DisplayAlerts
=
self
.
_display_alerts
# 關閉警告(默認)
self
.
_xlApp
.
Visible
=
self
.
_visible
# Excel對象不可見(默認)
self
.
file_abs_path
=
file_abs_path
# 文件的絕對路徑
self
.
_create_if_not_exists
=
create_if_not_exists
# 文件不存在是否新建選項
self
.
_xlBook
=
None
try
:
# 打開文件
self
.
_xlBook
=
self
.
_xlApp
.
Workbooks
.
Open
(
self
.
file_abs_path
)
print
(
f
"""文件【{self.file_abs_path}】已打開!"""
)
except
:
# 文件打開失敗后判斷是否新建文件
if
not
create_if_not_exists
:
# 文件打開失敗后不新建文件
print
(
f
"""文件【{self.file_abs_path}】打開失敗!"""
)
raise
Exception
(
f
"""文件【{self.file_abs_path}】不存在,請檢查輸入路徑!"""
)
else
:
# 文件打開失敗后新建文件
print
(
"文件新建中..."
)
dirct
=
os
.
path
.
split
(
self
.
file_abs_path
)
[
0
]
# 獲取文件路徑
dir_exist
=
os
.
path
.
isdir
(
dirct
)
# 判斷路徑是否存在
file_name
=
os
.
path
.
split
(
self
.
file_abs_path
)
[
1
]
# 獲取文件名
# 判斷所給文件路勁及文件名的合理性
if
dir_exist
:
try
:
# 根據文件拓展名新建各種格式的文件
ext
=
os
.
path
.
splitext
(
self
.
file_abs_path
)
[
1
]
# 獲取文件拓展名
xl_file_format
=
{
".xlsx"
:
51
,
".xls"
:
56
,
".csv"
:
6
}
# 代表相應文件格式的數值
# .xls 97-2003文件;.csv 逗號分隔值文件。
file_format_value
=
xl_file_format
[
ext
]
if
ext
in
xl_file_format
else
51
# 根據拓展名確定文件格式標識碼,默認格式為.xlsx,其標識碼為51。
wb
=
self
.
_xlApp
.
Workbooks
.
Add
(
)
# 新建工作簿
wb
.
SaveAs
(
self
.
file_abs_path
,
file_format_value
)
# 文件另存為
print
(
f
"""文件【{self.file_abs_path}】已創建!!"""
)
self
.
_xlBook
=
self
.
_xlApp
.
Workbooks
.
Open
(
self
.
file_abs_path
)
print
(
f
"""新建文件【{self.file_abs_path}】已打開!!"""
)
except
:
# 文件名稱不合法
raise
Exception
(
f
"""文件名稱【{file_name}】不合法!"""
)
else
:
# 文件路徑不合法
raise
Exception
(
f
"""文件目錄【{dirct}】不存在!"""
)
三、工作簿及工作表(Workbook & Worksheet)
1、新建工作簿
2、打開工作簿
3、新建工作表
def
add_sheet
(
self
,
new_sheet_name
=
None
,
new_sheet_location
=
None
)
:
"""為工作簿添加工作表,默認向右添加。
:param new_sheet_name: 新添加工作表的名稱
:param new_sheet_location: 新添加工作表的位置
"""
try
:
if
new_sheet_location
is
None
:
# 新建工作表位于到最右側
new_sheet_location
=
self
.
_xlBook
.
Worksheets
(
self
.
_xlBook
.
Worksheets
.
Count
)
sht
=
self
.
_xlBook
.
Worksheets
.
Add
(
Before
=
None
,
After
=
new_sheet_location
)
if
new_sheet_name
is
not
None
:
sht
.
Name
=
new_sheet_name
elif
new_sheet_location
==
0
:
# 新建工作表位于到最左側
new_sheet_location
=
self
.
_xlBook
.
Worksheets
(
1
)
sht
=
self
.
_xlBook
.
Worksheets
.
Add
(
Before
=
new_sheet_location
)
if
new_sheet_name
is
not
None
:
sht
.
Name
=
new_sheet_name
else
:
# 新建工作表位于指定工作表之后
new_sheet_location
=
self
.
_xlBook
.
Worksheets
(
new_sheet_location
)
sht
=
self
.
_xlBook
.
Worksheets
.
Add
(
Before
=
None
,
After
=
new_sheet_location
)
if
new_sheet_name
is
not
None
:
sht
.
Name
=
new_sheet_name
except
:
print
(
"工作表名稱已存在"
)
raise
Exception
(
f
"""工作表名稱【{new_sheet_name}】已存在!"""
)
4、刪除工作表
def
delete_sheet
(
self
)
:
# 刪除工作表
pass
四、單元格及區域(Cell & Range)
1、讀取單元格的值
def
get_cell_value
(
self
,
sheet
,
row
,
col
)
:
"""讀取單個單元格的值
:param sheet: 工作表名稱或索引號
:param row: 單元格的行號
:param col: 單元格的列號
"""
sht
=
self
.
_xlBook
.
Worksheets
(
sheet
)
return
sht
.
Cells
(
row
,
col
)
.
Value
2、設置單元格的值
def
set_cell_value
(
self
,
sheet
,
row
,
col
,
value
)
:
"""設置單個單元格的值
:param sheet: 工作表名稱或索引號
:param row: 單元格行的索引號
:param col: 單元格列的索引號(column)
:param value: 設置的數值
"""
sht
=
self
.
_xlBook
.
Worksheets
(
sheet
)
sht
.
Cells
(
row
,
col
)
.
Value
=
value
3、設置單元格格式
def
set_cell_format
(
self
,
sheet
,
row
,
col
,
bold
=
False
,
font_clr
=
None
,
background
=
None
,
center
=
False
)
:
"""設置單個單元格格式
:param sheet: 設置格式的工作表名稱或索引號
:param row: 設置格式的單元格行索引號
:param col: 設置格式的單元格列索引號(column)
:param bold: 文字加粗(默認不加粗)
:param font_clr: 字體顏色
:param background: 單元格背景色
:param center: 設置水平居中(默認不水平居中)
注:顏色代號——https://blog.csdn.net/weixin_34202952/article/details/85416015
"""
sht
=
self
.
_xlBook
.
Worksheets
(
sheet
)
if
bold
:
sht
.
Cells
(
row
,
col
)
.
Font
.
Bold
=
bold
# 設置文字加粗
if
font_clr
is
not
None
:
sht
.
Cells
(
row
,
col
)
.
Font
.
ColorIndex
=
font_clr
# 設置文字顏色
if
background
is
not
None
:
sht
.
Cells
(
row
,
col
)
.
Interior
.
ColorIndex
=
background
# 單元格背景色
if
center
:
sht
.
Cells
(
row
,
col
)
.
HorizontalAlignment
=
-
4108
# 設置平居中xlCenter
4、區域(某一范圍內的全部單元格)
def
get_range
(
self
)
:
# 獲取指定區域內的全部單元格數值
pass
五、文件
1、保存及關閉
def
save
(
self
)
:
# 保存工作簿
print
(
f
"""文件【{self.file_abs_path}】已保存!"""
)
return
self
.
_xlBook
.
Save
(
)
def
close
(
self
)
:
# 關閉工作簿
print
(
f
"""文件【{self.file_abs_path}】已關閉!"""
)
return
self
.
_xlBook
.
Close
(
)
2、另存為
def
save_as
(
self
,
new_file_abs_path
=
None
)
:
"""文件另存為
:param new_file_abs_path: 另存為文件的絕對路徑
"""
new_dirct
=
os
.
path
.
split
(
new_file_abs_path
)
[
0
]
# 另存為文件的文件夾路徑與原文件保持一致
new_dirct_exist
=
os
.
path
.
isdir
(
new_dirct
)
# 判斷另存為文件的路徑是否存在
new_file_name
=
os
.
path
.
split
(
new_file_abs_path
)
[
1
]
# 另存為文件的名稱
ori_file_name
=
os
.
path
.
split
(
self
.
file_abs_path
)
[
1
]
# 原文件的名稱
ori_ext
=
os
.
path
.
splitext
(
self
.
file_abs_path
)
[
1
]
# 獲取原文件的拓展名
new_ext
=
os
.
path
.
splitext
(
new_file_name
)
[
1
]
# 獲取另存為文件的拓展名
if
new_dirct_exist
:
if
new_file_name
==
ori_file_name
:
print
(
"另存為文件名稱(含拓展名)與原文件完全一致"
)
raise
Exception
(
f
"""另存為文件名稱【{new_file_name}】與原文件名稱【{ori_file_name}】完全一致!"""
)
else
:
if
ori_ext
==
new_ext
:
print
(
"另存為文件與原文件拓展名一致,文件格式保持不變。"
)
self
.
_xlBook
.
SaveAs
(
new_file_abs_path
)
else
:
xl_file_format
=
{
".xlsx"
:
51
,
".xls"
:
56
,
".csv"
:
6
}
file_format_value
=
xl_file_format
[
new_ext
]
self
.
_xlBook
.
SaveAs
(
new_file_abs_path
,
file_format_value
)
print
(
f
"""文件【{ori_file_name}】已另存為【{new_file_name}】!"""
)
print
(
f
"""文件格式由【{ori_ext}】變為【{new_ext}】!"""
)
print
(
f
"""另存為文件的絕對路徑為【{new_file_abs_path}】。"""
)
else
:
raise
Exception
(
f
"""另存為文件的文件目錄【{new_dirct}】不存在!"""
)
3、退出
def
quit
(
self
)
:
# 退出程序
print
(
f
"""程序已退出!"""
)
return
self
.
_xlApp
.
Quit
(
)
六、枚舉(Excel)
1、常量枚舉
名稱 | 值 | 說明 |
---|---|---|
xlCenter | -4108 | 居中 |
更多詳見:https://docs.microsoft.com/zh-cn/office/vba/api/excel.constants 。
2、XlFileFormat 枚舉 (文件格式)
名稱 | 值 | 說明 | 拓展名 |
---|---|---|---|
xlCSV | 6 | CSV | *.csv |
xlExcel8 | 56 | Excel 97-2003工作簿 | *.xls |
xlWorkbookDefault | 51 | 默認工作簿 | *.xlsx |
更多格式詳見:https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlfileformat 。
七、測試代碼
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
=============================
Author = Hulunbuir & DalaiNur
Email: liyang@alu.hit.edu.cn
Last Update: 2019.09.09 18:47
=============================
"""
if
__name__
==
"__main__"
:
# 測試代碼
xl
=
Excel
(
r
"D:\Test.xlsx"
,
create_if_not_exists
=
1
)
# 打開文件,若文件不存在則新建并打開。
xl
.
set_cell_value
(
"Sheet1"
,
row
=
1
,
col
=
1
,
value
=
"H100"
)
# 設置單元格單元格數值
xl
.
set_cell_value
(
1
,
row
=
2
,
col
=
"B"
,
value
=
"H200"
)
# 設置單元格單元格數值
print
(
xl
.
get_cell_value
(
"Sheet1"
,
row
=
1
,
col
=
1
)
)
# 讀取單元格數值
xl
.
add_sheet
(
"New_Sheet1"
,
0
)
# 目前New_Sheet1位于最左側
xl
.
add_sheet
(
"New_Sheet2"
)
# 目前New_Sheet2位于最后
xl
.
add_sheet
(
"New_Sheet3"
,
2
)
# 目前New_Sheet3位于第二個工作表之后
xl
.
add_sheet
(
)
# 目前位于最后,名稱采用系統默認名稱
xl
.
add_sheet
(
new_sheet_location
=
3
)
# 目前位于第3個工作邊之后,名稱采用系統默認名稱
xl
.
set_cell_value
(
4
,
row
=
1
,
col
=
1
,
value
=
"H300"
)
# 設置單元格單元格數值
xl
.
set_cell_value
(
5
,
row
=
1
,
col
=
1
,
value
=
"H400"
)
# 設置單元格單元格數值
xl
.
set_cell_format
(
"Sheet1"
,
row
=
1
,
col
=
1
,
font_clr
=
3
,
bold
=
True
,
background
=
15
,
center
=
True
)
# 設置單元格格式(紅色加粗灰色背景水平居中)
xl
.
set_cell_format
(
"Sheet1"
,
row
=
2
,
col
=
2
,
font_clr
=
5
)
# 藍色字體
xl
.
save
(
)
# 保存文件
xl
.
save_as
(
r
"D:\Test.xls"
)
# 文件另存為.xls文件
xl
.
close
(
)
# 關閉文件
xl
.
quit
(
)
# 退出程序
八、參考文獻
[1] Mark Hammond, Andy Robinson. Python Programming on Win32 Chapter 9 - Integration with Excel.
[2] 熱心市民小磊. win32com模塊 https://blog.csdn.net/u013289615/article/details/89295957.
[3] zhu2695. C# Excel ColorIndex 對應列表 https://blog.csdn.net/zhu2695/article/details/47444745.
九、尾聲
以上,便是利用pywin32庫對Excel進行二次開發的簡單介紹,因篇幅有限,某些非關鍵功能未做詳細介紹,如有疑問,歡迎郵件來詢。
僅以此文為我的Python調用Excel有關功能的實現做個一個備忘,同時也為有需要的人提供多一點參考。
胸藏文墨懷若谷,腹有詩書氣自華,希望各位都能在知識的pāo子里快樂徜徉。
因個人水平有限,文中難免有所疏漏,還請各位大神不吝批評指正。
最后,祝各位攻城獅們,珍愛生命,保護發際線!
本文部分內容來自圖書 Python Programming on Win32 !
歡迎大家點贊、評論及轉載,轉載請注明出處!
為我打call,不如為我打款!
打賞可備注郵箱,本人會將上述代碼發送給各位土豪!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
