002xlwings基本语法够用总结(后续更新中)
1.基本语法
import xlwings as xw
import os
import pandas as pd
import numpy as np
import random
# 对象层级,xw包->app就是进程->book工作簿->sheet工作表->cell单元格
# jupyter nbconvert --to markdown 1.ipynb,转化为md
def xw_create_apps():
"""创建app,进程管理"""
app = xw.App(
visible=False, add_book=True) # 启动一个excel程序进程,打印内存地址,是否可见,没有book的app没有pid
pid = app.pid
print(pid)
app = xw.App() # 每次调用APP都会生成一个新的APP,生成一进程
pid = app.pid
print(pid)
apps = xw.apps # 统计启动程序的个数,所有的进程,查看Apps包含的所有App
print(apps.count) # 返回app数量
# 查看所有app的PID,发现后创建的pid在列表前面,xw.Book()优先使用最后创建,列表最前的pid
print(xw.apps.keys())
for i in xw.apps.keys(): # 杀死所有APP进程,注意文件安全性
i = 'taskkill/pid ' + str(i) + ' -t -f'
os.system(i)
print(apps.count) # 返回app数量
# 查看所有app的PID,发现后创建的pid在列表前面,xw.Book()优先使用最后创建,列表最前的pid
print(xw.apps.keys())
"""
Function MySum(x, y)
MySum = x + y
End Function
"""
my_sum = app.macro('MySum') # 调用VBA
def xw_create_app():
"""创建引用app,添加book,sheet,写入文件保存退出,是否刷新可见,基本操作"""
# app1 = xw.apps[19836] # 指定进程excel程序创建book,根据pid引用app
app1 = xw.App() # 上面知道就行,我这里创建一个
# app1 = xw.apps.active # 返回当前活动app
# app1.activate() # 激活app,是否弹出excel窗口
# app1.activate(steal_focus=True) # 激活app,excel变为最前台应用,焦点切换到excel
# app1.screen_updating # 返回屏幕更新状态
app1.screen_updating = False # 关闭屏幕更新
# app1.visible # 返回app可见
app1.visible = False # app不可见
app1.display_alerts = False # excel中的提示信息是否可见
wb = app1.books.add() # app1中添加一个book
sht = wb.sheets['sheet1'] # 选中sheet
sht.range('A1').value = 'hahaha python' # 选中单元格,操作写入内容
# 保存,关闭文件,杀死进程
wb.save('001.xlsx')
wb.close()
app1.calculate() # 从新计算所有工作簿里的公式
# app1.calculation = 'manual' # 模式:'manual', 'automatic','semiautomatic',更改计算模式
app1.quit() # 退出程序
# app1.kill() # 杀死进程,强制退出,慎用
def xw_create_workbook():
"""book的打开和引用,以及和app的关系,这个地方有点烦"""
app2 = xw.App()
# books = xw.books # 当前活动App的工作簿集合
# books = app2.books # 指定App的所有工作簿的集合
# wb = app2.books.add() # 在指定的app下新建book
book = xw.Book() # 如果有app,在此基础上建立book,否则新建app,建book
wb = app2.books.open( # 看一下就好了
fullname='001.xlsx',
update_links=None, # 是否更新链接
read_only=False, # 只读模式打开
format=None, # 指定分隔符
password=None, # 指定工作簿的密码
write_res_password=None, # 写入保留写入工作簿的密码
ignore_read_only_recommended=False, # 设置True为静音只读推荐消息
add_to_mru=None, # 将此工作簿添加到最近添加的工作簿列表中
local=False, # 如果是 True, 根据 Excel 的语言保存文件,否则根据 VBA 的语言保存文件
) # 在某一app下打开wb文件
# wb = xw.Book('test.xlsx') # 如无app,新建app打开wb文件,后面wb.colse()后,自动释放pid
wb = app2.books('001.xlsx') # 引用该app下wb,这里引用不要有路径,必须直接写文件名字
# wb = app2.books(1) # 引用app下第1个wb
# wb = app2.books[0] # 引用切片,第1个wb
# 优先引用打开该文件的app中的文件,找不到在该app中,打开未打开的文件,打开必须有路径,引用可以用文件名,多个app可打开同一个文件,但是该引用不知道那个会报错
wb = xw.Book('001.xlsx')
wb = app2.books.active # 引用活动工作簿
wb.activate() # 激活工作簿
wb.activate(steal_focus=True) # 显示上层,并聚焦
wb.save() # 保存
wb.save(path='data.xls', password=None) # 另存
wb.to_pdf( # 导出为pdf
path='001.pdf',
include=1, # 包括哪些sheets
exclude=None, # 排除哪些sheets
layout=None,
exclude_start_string='#', # 不打印以#开头的
show=False, # 默认程序打开pdf
quality='standard' # PDF 文件的质量,可以是’standard’或’minimum’
)
wb.close() # 关闭
app2.quit() # 退出app
def xw_open_workbook():
'''对wb引用,app,pid的理解,以及一些wb属性'''
# wb = xw.Book(r'001.xlsx') # 这样打开后面可以直接用同样方式引用
# app1 = xw.App(add_book=False, visible=True)
# wb1 = app1.books.open(r'001.xlsx')
# app2 = xw.App(add_book=False, visible=True)
# wb2 = app2.books.open(r'001.xlsx')
# wb11 = app1.books(r'001.xlsx') # 引用app1的001.xlsx
# wb21 = app2.books(r'001.xlsx') # 引用app2的001.xlsx
# 多个app下多个同文件名,直接这样引用报错,这种打开引用方式可以保存关闭文件,wb.app.qiut(),才能kill
wb = xw.Book(r'001.xlsx')
# wb4=xw.Book(r'001.xlsx')
print(
wb.fullname, # 返回绝对路径
wb.name, # wb文件名字
wb.app, # 返回app对象,pid
wb.names, # 返回wb中所有的命名区域,列表呈现,名称管理器查看
wb.selection, # 返回选定单元格区域
sep='\n',
)
# 更改计算模式 manual(手动), automatic(自动), semiautomatic(半自动)
wb.app.calculation = 'manual'
print(xw.apps.keys()) # 所有app进程
app0 = wb.app # 找到wb所在app
wb.save() # 保存
wb.close() # 注意wb所在app没有被kill
app0.quit() # 这样才能被kill
# wb1.close()
# app1.quit()
# wb2.close()
# app2.quit()
print(xw.apps.keys()) # 没有wb的app没有pid
def xw_sheet():
'''sheet一些操作和属性,添加,从命名,选择'''
wb = xw.Book(r'001.xlsx')
sheets = xw.sheets # 当前活动工作簿所有sheet,包括隐藏,深度隐藏的,在vba中调改
sheets1 = wb.sheets # 指定wb工作簿所有sheet,sheet对象,包括隐藏,深度隐藏的,在vba中调改
# sht = wb.sheets.add('新表1', after='新表') # sheet名字,位置,无则excel默认,活动sheet之前,sheet名字重复报错
# sheet名字,位置,无则excel默认,活动sheet之前,sheet名字重复报错
# sht = wb.sheets.add('新表1', before='sheet2')
sht1 = wb.sheets('sheet2') # sheet名字,引用,英文不区分大小写
# sht1 = wb.sheets['sheet2'] # 这样写也可以
sht2 = wb.sheets(1) # 顺序引用,注意,xls用(0)表示第一个sheet,其他(1)表示
# sht2 = wb.sheets[1] # 这样写也可以
sht3 = xw.sheets.active # 当前活动工作表
sht3.activate() # 激活工作表
for m, n in zip(sheets, sheets1): # 对比一下效果看看
print(m, n)
# 一些属性
# sht1.visible = -1 # 设置其可见性,-1可见,0不可见
print(
'-' * 90,
sht1.name, # 返回工作表的名称
sht1.book, # 返回指定工作表所属的工作簿
sht1.cells, # 工作表上所有单元格的区域对象,包括所有的单元格,不仅仅是那些正在使用中的单元格
sht1.index, # 返回工作表的索引值,按照Excel的方式,从1开始的,xls从0
sht1.names, # 返回所有与本工作表有关的命名区域,名称管理器中的
sht1.used_range, # 返回sheet中使用过的区域,如果整张表为空,则返回A1单元格
sht2.name,
sht3.name,
sht3.tables, # 返回表对象
'=' * 90,
sheets, # sheet对象
sheets1,
sep='\n',
)
# sht1.name = '123' # 从新命名sheet
# sht3.clear() # 清除工作表所有内容和格式,不仅可以清除背景色等格式,还可以清除数据有效性和条件格式等,特别提醒:可以清除受保护的工作表的内容
# sht2.clear_formats() # 清理格式,保留内容
# sht1.clear_contents() # 清除工作表的所有内容但是保留原有格式
# sheets1.copy(after=sheets1.sheets[0], name='copied') # sheet的复制
# sheets1('新表1').delete() # 删除sheet,慎重
sht1.autofit('c') # 自动调整行高列宽,columen
sht2.autofit('row') # r,行
sht3.autofit() # 自动调整行高列宽
sht1.select() # 选定工作表,只能在活动工作簿中选择
print(
sht1.name, # 修改后的名字
wb.sheets.count,
)
wb.save()
app = wb.app
print(xw.apps.keys())
wb.close()
app.quit() # 一定要关掉进程
print(xw.apps.keys())
def xw_range_select():
"""主要是区域的选择和赋值"""
app = xw.App()
wb = app.books.open('001.xlsx')
sht = wb.sheets[2]
# 1.区域引用的方式通常有
xw.Range('A1:C3').value = 1 # 赋值方便查看,没有指定操作sheet的都是活动sheet
xw.Range((4, 4), (5, 5)).value = 2
xw.Range(xw.Range('A7'), xw.Range('C9')).value = 3
xw.Range(xw.Range('A10:F12'), xw.Range('B13:D15')).value = 100 # 最大矩形区域
# xw.Range('name01').value = 120 # 区域名称,默认打开不是名称所在sheet会报错
app.range("A1").value = 200
sht.range('A1').value = 300
xw.books['001.xlsx'].sheets[0].range('A1').value = 123
ran = sht.range('c20:d25')
ran1 = ran.offset(row_offset=3, column_offset=5) # 区域偏移
# 模式'down','right','table',Crtl+Shift+↓ | → | ↓→
ran2 = ran.expand(mode='table')
ran3 = ran.resize(row_size=6, column_size=4) # 从新调整区域大小,None表示不变
ran4 = ran.current_region # 全选,Ctrl+A
print(
ran,
ran1,
ran2,
ran3,
ran4,
app.selection, # 返回选中区域
wb.selection, # 返回选中区域,鼠标所在地方
sep='\n'
)
# 2.属性
ran.name = 'name02' # 设置区域名字
print(
'='*100,
ran.name, # 获取区域名字
ran.height, # 获得高,宽,数量,大小
ran.width,
ran.count, # 这个count和size好像都返回单元格数量
ran.size,
# 以区域左上角为始,获得边界单元格 效果同 Ctrl+Up,Ctrl+down,Ctrl+left,Ctrl+right,可能会超出所选区域
ran.end('up'),
ran.end('down'),
ran.end('right'),
ran.end('left'),
ran.last_cell, # 定位到区域中的的右下角单元格
ran.sheet, # 返回区域所在工作表
ran.address, # 返回区域字符串引用
ran.get_address(row_absolute=True, column_absolute=True, include_sheetname=True,
external=True), # 行列绝对引用,sheet,wb名字是否包含在内,会excel的不用解释都懂
ran.left, # 区域到左的距离
ran.top, # 到上的距离
sep='\n'
)
# 3.range的操作
ran1.select() # 选中区域,只能在活动的工作表中选,如果rng区域并不属于当前活动工作表,就会报错
ran1.value = 110 # 赋值
ran2.raw_value = 900 # 第二种赋值方式,听说更快
print(
'='*100,
ran1.value, # 获取区域值
ran2.value,
sep='\n',
)
wb.save()
def xw_range_write():
"""对单元格的操作,主要是写入内容,添加一个table"""
sht = xw.Book('001.xlsx').sheets[0]
sht.range('A6').value = 'hello 老师!' # 写入内容,会覆写原来单元格
sht.range('b1').value = 'b1'
sht.range('c2').value = [100, 2, 3] # 横向填充
sht.range('d2').options(transpose=True).value = [
'AAA', 'BBB', 'CCC'] # 纵向填充
sht.range('E5').options(expand='table').value = [
(1, 2), (3, 2), (5, 6)] # 二维表格
sht.tables.add( # 添加一个table
source=xw.sheets[0].range('k3:o15'), # 数据源
# name='t2', # 表名称,默认excel自己生成
source_type=None,
link_source=None,
has_headers=False, # 是否有列标签,True, False,‘guess’
destination=None,
# table_style_name='t1'
)
print(
'='*100,
sht.tables[0].api, # sht.tables[0].api
sht.tables[0].data_body_range, # 返回一个表示值范围的 xlwings 范围对象,不包括标题行
sht.tables[0].display_name, # 返回表示标题行范围的 xlwings 范围对象
sht.tables[0].header_row_range, # 标题行,第一行区域对象
sht.tables[0].name, # 返回或设置表的名称
sht.tables[0].parent, # 返回表的父级
sht.tables[0].range, # 返回表的 xlwings 范围对象,包括标题行
sep='\n',
)
sht.tables[0].show_headers = True # 显示或隐藏标题,字段column
sht.tables[0].show_autofilter = True # 打开或关闭自动过滤器,字段筛选否
sht.tables[0].show_totals = True # 显示汇总行,是否有汇总否
# 列是否显示样式(相间,不要True巨丑)
sht.tables[0].show_table_style_column_stripes = False
# sht.tables[0].show_table_style_first_column = True # 首列格式化,加粗,show_table_style_last_column最后一行
# sht.tables[0].show_table_style_row_stripes = False # 是否显示行的样式(相间),默认True显示
# sht.tables[0].table_style = 'TableStyleMedium28' # 获取或设置表格样式
sht.tables[0].resize(sht.range('n3:o12')) # 重新设置表的大小,列必须对其
print(
'='*100,
# 回一个 xlwings 范围对象,表示将要插入数据的行。这仅适用于空表,否则将返回 None
sht.tables[0].insert_row_range,
sht.tables[0].range, # 表全部区域,包括汇总
sht.tables[0].totals_row_range, # 返回汇总行区域对象
sep='\n',
)
# sht.book.save() # 找到上级对象进行操作
# sht.book.app.quit()
def xw_range_func():
"""公式,数字格式,复制粘贴,清除,删除,合并拆分单元格"""
app = xw.App()
wb = app.books.open('001.xlsx')
sht = wb.sheets[-1]
ran = sht.range('b3:d8')
ran1 = ran.offset(0, 4) # ran后偏移一列,设置新的区域
# ran.formula = "=1+5" # 写入公式
# ran1.formula_array = '=sum(b3:d8)' # 设置数组公式
# ran.number_format = '0.00%' # 设置数字格式
# 复制,destination 设置目标区域,如果省略,会被拷贝到剪贴板上
# ran.copy(destination=sht.range('b10:d15'))
# ran.copy() # 如果省略,会被拷贝到剪贴板上,这样下面才会选择性粘贴
# sht.range('b20:d25').paste( # 将剪贴板里内容粘贴到指定区域
# paste='all', # all(粘贴全部内容),formats(粘贴复制的源格式),formulas(粘贴公式),values(粘贴值)等等有很多
# operation=None, # add(加),divide(除),multiply(乘),subtract(减)
# skip_blanks=True, # 设为 True 时忽略空白单元格
# transpose=False # 设为 True 时对行列转置
# )
print(
'='*100,
ran.formula, # 获取公式
ran1.formula_array, # 获取数组公式
ran1.has_array, # 检测区域内是否包含数组公式,全部都是数组公式返回True,公式没必要全部一样
ran.number_format, # 获取数字格式
sep='\n'
)
# ran.copy_picture(appearance='screen', format='picture') # 范围范围当作图片复制到剪切板
# ran.clear_contents() # 清除区域内容,保留格式
# ran1.clear(), # 清除区域的内容和格式
# ran.delete(shift='up') #删除单元格,单元格上移还是左移,up,left,删除后ran就没了,需要从新设置区域
# 插入单元格,移动方向down,right,后面可以选择单元格格式拷贝源
# ran.insert(shift='right', copy_origin='format_from_left_or_above')
# 插入单元格
# sht.range("C3").insert(shift=None, copy_origin='format_from_right_or_below')
# sht.api.Rows(3).Insert() # 在第3行插入空行
# sht['2:2'].insert() # 插入行
# sht['B:B'].insert() # 插入列
# sht['B2'].insert() # 插入单元格 (缺省默认'down', 可选 'right')
# sht['B2:C3'].insert() # 插入区域
# # 或者调用api
# sht.api.Rows(1).Insert() # 插入行
# sht.api.Rows('2:4').Insert()
# sht.api.Columns(1).Insert() # 插入列
# sht.api.Columns('2:4').Insert()
ran.row_height = 40 # 设置行高
ran.rancolumn_width = 60 # 设置列宽
ran.columns.autofit() # 宽度自适应
ran.rows.autofit() # 高度自适应
ran.autofit() # 调节行高列宽
ran.merge(across=False) # 合并单元格,True跨越合并,只有列合并,长条
ran.unmerge() # 取消单元格合并
xw.Range('A1').color = (255, 100, 0) # 设置背景色
xw.Range('A2').color = None # 去除背景色
xw.Range('a3').add_hyperlink(r'www.baidu.com',
'百度', '提示:点击即链接到百度') # 地址,显示文本,提示信息
print(
'='*100,
ran.row_height, # 获取行高
ran.column_width, # 获取列宽
# ran.merge_area, # 返回合并单元格区域,如果ran位于合并单元格内,则返回这个合并单元格,如果ran位于合并单元格外,则返回ran,一半一半报错
ran.merge_cells, # 检测区域内是否包含合并单元格
ran.color, # 获取指定区域的背景色,
xw.Range('a3').hyperlink, # 返回指定区域的超链接(仅适合单个单元格)
sep='\n',
)
wb.save() # 没有写退出代码,方便查看
def xw_other_object():
"""excel中的其他对象,shape,picture,name,chart等等,具体的大小,边框对其太多了,后面需要去翻官方文档行了,不再赘述"""
wb = xw.Book('001.xlsx')
# sht = wb.sheets.add('new') # 添加个sheet
sht = wb.sheets('new')
rng = sht.range('b2:c4')
rows = rng.rows # 一个区域内所有的行
columns = rng.columns # 一个区域内所有的列
rows.autofit() # 自动调整行高,宽
columns.autofit()
# 创建集合,收集其中的对象类型
shapes_dic = sht.shapes # 自选图形、任意多边形、OLE 对象或图片(可以拖动的形状,试试就知道了)
charts_dic = sht.charts # 图表
pictures_dic = sht.pictures # 图片
names_dic = sht.names # 注意要定义在sheet中,定义在book中找不到
# 拿出单一对象
shp = sht.shapes[0]
chr = sht.charts[0]
pic = sht.pictures[0]
name = sht.names[0] # 注意要定义在sheet中,定义在book中找不到
print(
rows.count, # 返回行数,列数
columns.count,
shapes_dic, # 返回集合
charts_dic,
pictures_dic,
names_dic,
sht.pictures.count, # 返回集合中的对象数
shp, # 返回集合中的切片元素
chr,
pic,
name,
sep='\n',
)
# 四大对象都有相同性质,以图片为例
# pic.delete() # 删除
pic.height = 200 # 设置高宽,位置,名称
pic.width = 400
pic.left = 200
pic.top = 400
pic.name = 2222
print(
'='*100,
sht.shapes.count,
sht.charts.count,
sht.pictures.count,
sht.names.count,
pic.parent, # 返回所在sht名字
pic.height, # 返回高,宽,位置,名字
pic.width,
pic.left,
pic.top,
pic.name,
sep='\n',
)
# 特有属性
chr.chart_type = '3d_column' # 更改(设置)图表类型
# 新建图表并且设置图表类型,指定数据
# rng1=sht.range('A1').value = [['Foo1', 'Foo2'], [1, 2]]
sht.range('k1').value = [['k', 'l', 'm', 'n'], [1, 2, 3, 4], [5, 6, 7, 8]]
chr1 = charts_dic.add()
chr1.set_source_data(sht.range('k1').expand()) # 设置数据范围,这里注意用expand(),是个区域
chr1.chart_type = 'line'
chr1.name = '图图'
# 添加名称区域
name04 = names_dic.add('name04', '=new!$c$7:$e$10')
print(
shp.type, # 返回形状类型
chr.chart_type, # 返回图表类型
chr1.chart_type,
chr1.name,
name04, # 返回名称对象
name04.refers_to_range, # 返回区域
name04.refers_to, # 返回引用公式
sep='\n',
)
name04.refers_to = "=new!$E$6:$H$8" # 更改,设置引用公式
print(name04.refers_to, name04.refers_to_range) # 查看从新设置后的引用公式,区域
pictures_dic.add( # 添加替换图片
r'D:\Users\Pictures\Saved Pictures\004dog.jpg', # 文件路径名或者是 Matplotlib图形对象
link_to_file=False,
save_with_document=True,
left=30, # 位置宽高
top=30,
width=None,
height=None,
name='dog', # 命名
update=False, # 替换图片的名字
scale=0.2, # 缩放
)
# 替换图片,原属性完全继承,这里我失败了,兄弟们加油
pic.update(r"D:\Users\Pictures\Saved Pictures\bear.jpg")
def xw_font():
"""字体设置"""
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
app = xw.App(add_book='s')
sht = app.books[0].sheets[0]
sht.tables.add(
source=sht.range('a1:d11')
)
sht.tables[0].update(df, index=False) # table中填充df
sht['A2'].font.bold = True # 返回或设置粗体属性
sht['A2'].font.color = (255, 0, 0) # 返回或设置颜色属性(元组)
sht['A2'].font.italic = True # 返回或设置斜体属性
sht['A2'].font.size = 21.5 # 返回或设置大小(浮点数)
print(
'='*100,
sht['A1'].font, # 当作值来访问
# sht.shapes[0].font, # 当作形状来访问
sht['A1'].font.api, # 正在使用的引擎的本机对象(pywin32或appscriptobj)
sht['A2'].font.name, # 返回或设置字体的名称
sep='\n',
)
def xw_option():
"""转换器和选项,和其他对象numpy,pandas的转换,冻结窗口,批注,更改单元格类型,插入一二维数据,修改窗口大小"""
# wb=xw.App(add_book='s').books[0]
# sht=wb.sheets[0]
app = xw.App(visible=True, add_book=False)
wb = app.books.open('001.xlsx')
wb.activate(steal_focus=True)
sht = wb.sheets[0]
dic = {'k': [1, 2, 3], 'l': [4, 5, 6]}
d1 = sht.range('A1:B10').options(dict).value # 数据是列方向
d2 = sht.range('A4:k5').options(dict, transpose=True).value # 数据是行方向
sht.range('A1').options(transpose=True).value = np.array([8, 2, 3]) # 一维数据
d3 = sht.range('A1:C3').options(np.array, ndim=2,
dtype=None, copy=True, order=None).value # 二维数据
d4 = sht.range('E1').options(pd.Series, expand='table', dtype=None,
copy=False, index=False, header=False).value # 返回series
d5 = sht.range('A1:D5').options(pd.DataFrame, header=2,
dtype=None, copy=False, index=1).value # 返回df
# 默认数字读取为float,可以修改为int,str
d6 = sht.range('A1').options(numbers=int).value
sht.range('f1').options(transpose=True).value = [1, 2, 3] # 列表写入列
sht.range('b4').api.NumberFormat = "@" # 单元格的格式改为文本类型
print(
'='*100,
d1,
d2,
d3,
d4,
d5,
d6,
sep='\n',
)
# 冻结窗口
active_window = wb.app.api.ActiveWindow
active_window.FreezePanes = False
active_window.SplitColumn = 3 # 冻结至哪一列
active_window.SplitRow = 3 # 冻结至哪一行
# active_window.FreezePanes = True #False,没有冻结的化直接拆分4部分
active_window.WindowState = -4137 # 最大最小窗口 -4137表示常量xlMaximized
sht.range("a1").api.AddComment(Text='修改') # 插入批注
def xw_api():
"""使用xw中的api方法,
在调用range后的api后面的方法或者属性首字母必须大写,
表格线条样式,粗细,字体颜色,样式,加粗,倾斜,背景色"""
app = xw.App(visible=True, add_book=False)
app.display_alerts = True
app.screen_updating = True
wb = app.books.open('005.xlsx')
sht = wb.sheets[0]
rng = sht.range('a1:b4')
rng1 = sht.range('c3:f8')
# rgn.api.Font.Color = 0xffff00 # 改变颜色,或者16776960.0
rng.api.Font.ColorIndex = 17 # 都能看懂不再注释了
rng.api.Font.Size = 25
rng.api.Font.Bold = True
rng.api.Font.Name = '宋体'
rng.api.Font.FontStyle = "倾斜"
rng.api.Font.Underline = 2
rng.api.HorizontalAlignment = -4131 # -4108 居中(默认),-4131 靠左,-4152 靠右
rng.api.VerticalAlignment = -4130 # -4108 居中,-4160 靠上,-4107 靠下,-4130 自动换行对齐
# -4108 居中,-4160 靠上,-4107 靠下,-4130 自动换行对齐,这里自动换行和对其只能设置一个
rng.api.VerticalAlignment = -4107
# 画框,这里就这样吧,不好搞,用到再说,或者直接去学VBA吧,
# 1代表顶部边框,2代表右侧边框,3代表左侧边框,4代表底部边框,5代表内部横线,6代表内部竖线,
# 7代表所有四个角的外角,8代表所有四个角的内角,9代表整个单元格的边框(即所有四个角和四条边),
# 10代表单元格的外部所有边框(即不包括内部横线和内部竖线),
# 11代表单元格的外部左边和右边的边框(即不包括顶部和底部边框),12代表单元格的外部上边和下边的边框(即不包括左侧和右侧边框)
# rng.api.Borders(7).LineStyle = 9
# rng.api.Borders(7).Weight = 3
# # rgn.api.Borders(10).LineStyle = 2
# # rgn.api.Borders(10).Weight = 1.5
# 划底部边框,0(无边框)、1(实线)、2(虚线)、3(点线)、4(点划线)、5(双点划线)
rng1.api.Borders(9).LineStyle = 1
rng1.api.Borders(9).Weight = 3 # 参数可以设置为0(自动)、1(细线)、2(中等)、3(粗线)
rng1.api.Borders(10).LineStyle = 1 # 划右部边框
rng1.api.Borders(10).Weight = 3
rng1.api.Borders(11).LineStyle = 1 # 划内部竖线
rng1.api.Borders(11).Weight = 2
rng1.api.Borders(12).LineStyle = 1 # 划内部横线
rng1.api.Borders(12).Weight = 2
app.display_alerts = False # 取消警告,把下面合并警告取消
# rng1.api.Merge() # 合并
# rng1.api.UnMerge() # 取消合并
row_num = sht['A1'].current_region.last_cell.row # 最后行数
sht['A2:A{}'.format(row_num)].number_format = 'm/d' # 设置数字格式
column_num = sht['A1'].current_region.last_cell.column # 最后列数
alpha_column_num = chr(ord("A") + column_num - 1) # 最后列字母
sht['b2:b{}'.format(row_num)].number_format = '0.0' # 设置数字格式
print(row_num, alpha_column_num)
sht['a1:{}1'.format(alpha_column_num)].api.Font.Size = 15
sht['a1:{}1'.format(alpha_column_num)].api.Font.Name = '宋体'
sht['a1:{}1'.format(alpha_column_num)].api.Font.Bold = True
# 颜色随机设置
r = random.randint(0, 255)
b = random.randint(0, 255)
g = random.randint(0, 255)
r1 = random.randint(0, 255)
b1 = random.randint(0, 255)
g1 = random.randint(0, 255)
sht['A1:{}1'.format(alpha_column_num)].api.Font.Color = xw.utils.rgb_to_int(
(r, b, g)) # 字体颜色
sht['A1:{}1'.format(alpha_column_num)].color = xw.utils.rgb_to_int(
(r1, b1, g1)) # 填充背景颜色
sht['A1:{}1'.format(
alpha_column_num)].api.HorizontalAlignment = xw.constants.HAlign.xlHAlignCenter # 设置水平对齐方式为居中
sht['A1:{}1'.format(
alpha_column_num)].api.VerticalAlignment = xw.constants.VAlign.xlVAlignCenter # 设置垂直对齐方式为居中
for cell in sht.range('f10').expand('table'): # 画线看看
# print(cell) # 每一个单元格
cell.api.Borders(7).LineStyle = 1 # 1左线,2右,3上,4下,5斜线右下,6斜下左下,自己试吧
cell.api.Borders(7).Weight = 2
for i in range(1, 11): # 循环向里面写数据
for j in range(1, 6):
sht.range(i, j).value = '{}-{}'.format(i, j) # 被excel解读为日期
values = sht.range((1, 1), (10, 5)).expand().value
print(values)
print(
'='*100,
rng.api.Font.ColorIndex, # 都能看懂不再注释了
rng.api.Font.Size,
rng.api.Font.Bold,
rng.api.Font.Name,
rng.api.Font.Color,
rng.api.HorizontalAlignment,
rng.api.VerticalAlignment,
rng.api.Borders,
rng.merge_cells, # 是否是合并单元格
# rng.api.Borders(7).Weight,
sep='\n',
)
def xw_df():
"""使得df在excel中显示"""
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
# xw.view(obj=df, sheet=None, table=True, chunksize=5000)
app = xw.App(add_book='s')
sht = app.books[0].sheets[0]
sht.tables.add(
source=sht.range('a1:d11')
)
sht.tables[0].update(df, index=False) # table中填充df
def xw_supplement():
"""xw想到的补充"""
wb = xw.App(visible=True, add_book='s').books[0]
sht = wb.sheets[0]
rng = sht.range('a1:d5')
for r in rng.rows: # 所有行对象
print(r)
for cell in r: # 遍历单元格
print(cell)