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
  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值