pywin32模块操作Excel

部署运行你感兴趣的模型镜像

# 导入基本模块
import os
import win32com.client as win32 # 导入Win32com模块
from openpyxl.cell.cell import get_column_letter, column_index_from_string

# 通过Python打开Excel
app = 'Excel'
xl = win32.DispatchEx('%s.Application' % app)
# 退出Excel程序操作
xl.Application.Quit()

# Application对象操作
xl.DisplayAlerts = False # 禁止提示警告
xl.DisplayAlerts = True # 可以提示警告
xl.ScreenUpdating = False # 禁止屏幕刷新
xl.ScreenUpdating = True # 可以屏幕刷新

# 1、工作簿操作

# 1)打开工作簿,工作簿的名称应当为绝对地址下的文件名
fn = os.path.join(os.getcwd(), 'test.xlsx') # 假设当前文件夹下有名为test的xlsx文件
wb = xl.Workbooks.Open(fn)

# 2)新建工作簿
wb = xl.Workbooks.Add()

# 3)保存工作簿
wb.Save() # 保存并退出,并且在保存退出的时候弹出提示框
# 但是DisplayAlerts设置为False时,会自动保存且不会弹出提示框

# 4)另存为工作簿,地址需要写绝对地址
fn = os.path.join(os.getcwd(), 'new.xlsx')
wb.SaveAs(fn)

# 5)关闭工作簿
wb.Close(SaveChanges=False) # 关闭表格,不保存修改,SaveChanges默认参数为False
wb.Close() # 同上行
wb.Close(SaveChanges=True) # 关闭表格,保存修改,不会弹出弹框

# 2、工作表操作

# 1)读取工作表
ws = wb.Worksheets(2) # 通过索引号读取工作表
ws = wb.Sheets(2) # 与上行作用相同
ws = wb.Worksheets('SheetName') # 通过工作表名字读取工作表
ws = wb.Sheets('SheetName') # 与上行作用相同

# 2)获取工作表个数
print(wb.Worksheets.Count)
print(wb.Sheets.Count) # 与上一行相似

# 3)修改工作表可见性
ws.Visible = 0 # 隐藏工作表

# 4)读取/修改工作表名称
print(ws.Name)
ws.Name = 'new_name'

# 5)复制工作表
ws.Copy(Before=wb.Sheets(1)) # 在wb.Sheets(1))前面复制,默认命名为ws的名字后面加上(2)
ws.Copy(After=wb.Sheets(1)) # 在wb.Sheets(1))后面复制,默认命名为ws的名字后面加上(2)
# 有的电脑用上面的方法复制可能会打开多张空白工作簿,建议用下面方法复制
ws.Copy(Before=None, After=ws) # 将ws工作表复制到ws之后,Before关键字可省略
ws.Copy(None, After=ws) # 同上
ws.Copy(None, wb.Sheets(wb.Sheets.Count)) # 将ws工作表复制到最后一张工作表
ws.Copy(Before=ws, After=None) # 将ws工作表复制到ws之前,此时参数After关键字不能省略
# 可以跨工作簿进行复制
fn1 = os.path.join(os.getcwd(), 'test1.xlsx')
wb1 = xl.Workbooks.Open(fn1)
fn2 = os.path.join(os.getcwd(), 'test2.xlsx')
wb2 = xl.Workbooks.Open(fn2)
ws1 = wb1.Sheets(1)
ws2 = wb2.Sheets(1)
ws1.Copy(None, ws2)

# 6)删除工作表
ws.Delete()

# 3、单元格操作

# 1)单元格范围与复制
ws.Cells(1, 1).Value = 'aaaaa' # 对位于第一行第一列的单元格(即A1单元格)赋值
ws.Range('A1').Value = 'aaaaa' # 与上面代码等价
ws.Range("A:A") # 第一列
ws.Columns("A:A") # 第一列
ws.Columns(1) # 第一列
ws.Columns("A") # 第一列
ws.Range("A:C") # 第一至三列
ws.Range(ws.Columns(1), ws.Columns(3)) # 第一至三列
ws.Range(ws.Columns("A"), ws.Columns("C")) # 第一至三列
ws.Range(ws.Columns("A:A"), ws.Columns("C:C")) # 第一至三列
ws.Range('1:1') # 第一行
ws.Rows('1:1') # 同上
ws.Range('A1:B3') # A1单元格到B3单元格
ws.Cells # 整张工作表的所有单元格

# 2)单元格输入公式
ws.Range('A1').Value = 12
ws.Range('A2').Value = 24
ws.Range('A3').Formula = "=A1+A2"

# 3)列坐标数字与字母的转换,可以调用openpyxl模块中的函数实现
get_column_letter(113) # 返回113对应的列字母
column_index_from_string('AAA') # 返回列坐标'AAA'对应的列数

# 4)读取单元格所在的行与列
ws.Range('AA15').Row # 获取单元格AA15所在的行数
ws.Range('AA15').Column # 获取单元格AA15所在的列数

# 5)End+方向键获取的行列数,通过VBA常量表可以查询各个方向对应的数字
# xlDown -4121
# xlToLeft -4159
# xlToRight -4161
# xlUp -4162
ws.Range('B15').End(-4162).Row # B15单元格按下End+上箭头后所处单元格的行数
ws.Range('B15').End(-4121).Row # B15单元格按下End+下箭头后所处单元格的行数
ws.Range('B15').End(-4159).Column # B15单元格按下End+左箭头后所处单元格的列数
ws.Range('B15').End(-4161).Column # B15单元格按下End+右箭头后所处单元格的列数

# 6)单元格样式,参数不记得可以通过在Excel中录制宏获取,注意查询常量表替换对应名字
# 6_1 数字格式
ws.Range("A1").NumberFormatLocal = "¥#,##0.00_);[红色](¥#,##0.00)" # 可以在Excel中尝试后自己设置
# 6_2 单元格内部填充
ws_In = ws.Range("A1").Interior
ws_In.Pattern = 1 # xlSolid对应的值为1
ws_In.PatternColorIndex = -4105 # xlAutomatic对应的值为-4105
ws_In.Color = 65535
ws_In.TintAndShade = 0
ws_In.PatternTintAndShade = 0
# 6_3 调整列宽及行高
ws.Range('A:A').ColumnWidth = 20 # 调整列宽
ws.Range('1:1').RowHeight = 20 # 调整行高
# 6_4 其他
# 边框字体等设置如6_2所示,需要查询常量表

# 7)单元格复制
# 7_1 复制一个单元格
# xlPasteValues(粘贴为数值)对应值为-4163,xlNone对应值为-4142
ws.Range('A1').Copy()
ws.Range('H5').PasteSpecial(Paste=-4163, Operation=-4142)
# 7_2 复制指定区域单元格
ws.Range("A3:D9").Copy()
ws.Range("B6").PasteSpecial(Paste=-4163, Operation=-4142)
# 7_3 复制单行(单列类似)
ws.Range("1:1").Copy()
ws.Range("3:3").PasteSpecial(Paste=-4163, Operation=-4142)
# 7_4 复制工作表上所有的单元格
ws.Cells.Copy()
ws.Cells.PasteSpecial(Paste=-4163, Operation=-4142)

# 8)清除
ws.Range('B15').Clear() # 清除全部
ws.Range('B15').ClearContents() # 清除内容
ws.Range('B15').ClearFormats() # 清除格式
ws.Range('B15').ClearComments() # 清除评论
# 不能对区域进行清除操作,需要用循环清除,例如删除B2到C5部分的内容
for i in range(2, 6):
    for j in range(2, 4):
        ws.Cells(i, j).ClearContents()

# 9)删除整列,右侧行左移
ws.Columns("E:E").Delete(Shift=-4159) # xlToLeft -4159

# 10)删除整行,下侧行上移
ws.Columns("1:1").Delete(Shift=-4162) # xlUp -4162

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

使用 `pywin32` 模块操作 Excel 文件时,可以通过调用 Windows 的 COM 接口实现Excel 文件的读写,并且能够保留 Excel 文件中的宏功能(VBA 代码)以及复杂的格式,例如公式、图表、样式和特殊符号等。这使得 `pywin32` 成为处理复杂 Excel 文件的理想选择,尤其是在需要保留文件结构和功能的场景下 [^1]。 ### 读取 Excel 文件并保留宏 使用 `pywin32` 读取 Excel 文件时,不需要额外的配置即可保留文件中的宏和其他复杂格式。以下是一个示例代码: ```python import win32com.client as win32 # 启动 Excel 应用程序 excel = win32.Dispatch("Excel.Application") excel.Visible = False # 不显示 Excel 窗口 # 打开包含宏的 Excel 文件 workbook = excel.Workbooks.Open(r'C:\path\to\your\file.xlsm') # 读取工作表 worksheet = workbook.Sheets(1) cell_value = worksheet.Cells(1, 1).Value # 获取单元格 A1 的值 print(cell_value) # 关闭工作簿并退出 Excel 应用程序 workbook.Close() excel.Quit() ``` 上述代码中,`Workbooks.Open` 方法能够正确加载包含宏的 `.xlsm` 文件,并且保留其 VBA 代码和格式 [^1]。 ### 写入 Excel 文件并保留宏 在写入数据时,同样可以使用 `pywin32` 对 Excel 文件进行操作,并确保宏和格式不被破坏。以下是一个写入数据的示例: ```python import win32com.client as win32 # 启动 Excel 应用程序 excel = win32.Dispatch("Excel.Application") excel.Visible = False # 打开包含宏的 Excel 文件 workbook = excel.Workbooks.Open(r'C:\path\to\your\file.xlsm') # 选择工作表 worksheet = workbook.Sheets(1) # 写入数据到指定单元格 worksheet.Cells(2, 1).Value = "New Data" # 保存文件并关闭 workbook.Save() workbook.Close() excel.Quit() ``` 此代码在执行写入操作后,文件中的宏仍然存在,并且所有公式、样式和图表都保持不变 [^1]。 ### 注意事项 - **文件格式**:确保文件保存为支持宏的 `.xlsm` 格式。如果保存为 `.xlsx`,宏代码将被删除。 - **COM 注册**:安装 `pywin32` 后,需要运行 `pywin32_postinstall.py` 脚本以注册 COM 组件,否则无法正常使用 [^2]。 - **性能问题**:由于 `pywin32` 是通过 COM 接口与 Excel 交互,因此在处理大型文件时可能较慢。 ### 其他替代方案 如果不需要保留宏,可以使用其他库如 `OpenPyXL` 或 `xlrd/xlwt` 进行 Excel 操作,但这些库不支持宏保留 [^3]。如果需要保留宏,`pywin32` 是目前最合适的解决方案 [^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值