使用Python的xlwings操作Excel的属性和方法

https://docs.xlwings.org 可以查看 xlwings 的全部文档,更多细节在文档的“API参考”部分。

1、Excel表格的开启和关闭

1.1 打开Excel工作表格

import xlwings as xw   # 导入xlwings包
#新建工作簿,Visible表示是否显示Excel窗体,add_book表示是否新增一个工作表
app = xw.App(visible=True, add_book=False)
wb = app.books.add()     # 不加这行话,Excel会一闪而过

1.2 按路径打开Excel表格

import xlwings as xw

# 注意:除了 App 方法是大写开头,其余方法、属性均为小写字母!!
app = xw.App(visible=True, add_book=False)     # 新建工作簿

app.display_alerts = False     # 关闭用户提示
app.screen_updating = False     # 关闭屏幕刷新
FilePath = r'example.xlsx'     # 文件路径
wb = app.books.open(FilePath)     # 打开Excel文档
wb.save('example.xlsx')     # 另存为
wb.close()     # 关闭工作簿
app.quit()     # 退出Excel

2、读写Excel内容

2.1 读取Excel单元格内容

import xlwings as xw
app = xw.App(visible=False, add_book=False)     # 新建Excel对象
wb=app.books.open(r'example.xlsx')     # 打开新工作簿
sheet=wb.sheets[0]     # 指定为开启工作簿的第一个sheet

# 读取excel内容
value = []
value.append(sheet.used_range.value)     # 读取有效部分
value.append(sheet['A3'].value)     # A3单元格内容
value.append(sheet['A1:B5'].value)     # A1到B5单元格内容

# 注意:以下引用方式不是字符串形式,无需加引号
value.append(sheet[:10,:9].value)     # 以A1为起始点,行10格,列9格单元格内容。
value.append(sheet.range(2,2).value)     # 行第2格,列第2格单元格内容
value.append(sheet.cells(2,2).value)     # 行第2格,列第2格单元格内容

# A1到B2的内容
value.append(sheet.range(sheet.cells(1,1), sheet.cells(2,2)).value)

# A1到B2的内容,可直接省略sheet.cells
value.append(sheet.range((1,1),(2,2)).value)

# 循环输出内容
for ValueItems in value:
    print(ValueItems,'\n')
wb.save('example.xlsx')     # 另存为
wb.close()     # 关闭工作簿
app.quit()     # 退出Excel

2.2向Excel写入内容

import xlwings as xw
app = xw.App(visible=False, add_book=False)     # 新建Excel对象
wb = app.books.open(r'example.xlsx')     # 打开新工作簿
sheet = wb.sheets[0]     # 指定为开启工作簿的第一个sheet
sheet.range('A20').value = 'Hello xlwings!'     # A20 的位置写入
sheet.range('A21').value = [1,2,3]     # A21 位置按横向连续写入

# A30 到 A32纵向连续写入,注意列表的维度必须为2,且内容需要放在第2个维度里
# [4,5,6] 一维列表效果会是横向写入
sheet.range('A30:A32').value = [[4],[5],[6]]
sheet.range('A22').options(transpose=True).value = [1,2,3]     # 纵向写入的第二种方式

# 以 A28 为起始位置,输入表格
sheet.range('A28').options(expand='table').value = [[1,2],[3,4]]
# 多行多列写入,不使用 expand 参数也可以,二维列表中每一个列表表示一行数据
sheet.range('a1').value = [[4,8,12], [5,10,15], [7,14,21]]

wb.save('example.xlsx')     # 另存为
wb.close()     #关闭工作簿
app.quit()     # 退出Excel

3、各元素常用的方法和属性

3.1 book的常用方法和属性

xlwings.Book(fullname=None, update_links=None, read_only=None,
             format=None, password=None, write_res_password=None,
             ignore_read_only_recommended=None, origin=None, delimiter=None, 
             editable=None, notify=None, converter=None, add_to_mru=None,
             local=None, corrupt_load=None, impl=None, json=None)

fullname (str or path-like object, default None)–现有工作簿的完整路径或名称(包括。xlsx, xlsm等)或未保存的工作簿的名称。 如果没有完整路径,将在当前工作目录中查找文件。
update_links (bool, default None)–如果省略该参数,将提示用户指定如何更新链接 
read_only (bool, default False) –True表示以只读模式打开工作簿
format (str)–如果打开文本文件,则指定分隔符
password (str)—密码打开受保护的工作簿
write_res_password (str)  –写入保存时的密码
ignore_read_only_recommended (bool, default False) –只读推荐关闭
origin (int)–仅适用于文本文件。 指定它的起源位置。 使用平台常数。 
delimiter (str) —如果format参数为6,则指定分隔符。 
editable (bool, default False) —此选项仅适用于遗留的Microsoft Excel 4.0插件。
 notify (bool, default False) —如果文件无法以读写方式打开则通知用户。 
converter (int) -打开文件时要尝试的第一个文件转换器的索引。 
add_to_mru (bool, default False) -将此工作簿添加到最近添加的工作簿列表中。 
local (bool, default False) —如果为True以Excel语言保存文件,否则以VBA语言保存文件。 不支持macOS
corrupt_load (int, default xlNormalLoad) —可以是“xlNormalLoad”、“xlRepairFile”或“xlExtractData”的其中一个。 不支持macOS。 
json (dict) 一个JSON对象,由MS Office Scripts或谷歌Apps Script xlwings模块交付,但以反序列化的形式,即作为字典。
import xlwings as xw
def my_macro():
    wb = xw.Book.caller()     # 另VBA反选调用Python函数
    wb.sheets[0].range('A1').value = 1

app = xw.App(visible=True, add_book=False)     # 新建Excel对象
wb = app.books.open(r'example.xlsx')     # 打开新工作簿

wb.activate()     # 切换当前工作簿
wbFilePath = wb.fullname     # 现有工作簿的完整路径或名称(包括。xlsx, xlsm等) 
wbFileName = wb.name     #获取工作簿的文件名称

sheet = wb.sheets[0]     # 指定为开启工作簿的第一个sheet
# sheets为表单列表,调用时里面可以输入表单名称或表单位置Index
wb.sheets[1].select()

Apiobject = wb.api     #返回正在使用引擎的本机对象(或obj) 
Appobject = wb.app     #返回一个代表Book创建者的应用程序对象。 

wb.save('example.xlsx')     # 另存为,当内容为(Path=None)为仅保存,不是另存
wb.close()     # 关闭工作簿
app.quit()     # 退出Excel

print(wbFilePath)
print(wbFileName)
print(Apiobject)
print(Appobject)

3.2 sheet的常用方法和属性

class xlwings.Sheet(sheet=None, impl=None)

import xlwings as xw
app = xw.App(visible=True, add_book=False)     # 新建Excel对象
wb = app.books.open(r'example.xlsx')     # 打开新工作簿
sheet = wb.sheets[0]     # 指定为开启工作簿的第一个sheet
sheet.activate()     # 指定sheet为当前sheet

# 下面三行是 workbook 对象的 sheets (注意有字母 s) 属性的 add 方法
wb.sheets.add(after = sheet)     # 在指定sheet后面新增sheet
wb.sheets.add(before = sheet)     # 在指定sheet前面新增sheet
wb.sheets.add(name = '2')     # 新工作表的名称。 如果为None,则默认为Excel的默认名称。

sheet.autofit('c')     # rows 或者 r,行自动调整适应大小
sheet.autofit('r')     # Column或者c,列自动调整适应大小
sheet.autofit()     # 行列均自适应,不用传值

cells = sheet.cells(1,1)     # 单元格对象
chart = sheet.shapes     # 图表对象

sheet.clear()     # 清空表格内容
sheet.clear_contentser()     # 清理内容保留格式

sheet.copy()     # 使用方式与add类似
sheet.delete()     # 删除sheet
sheet.select     # 选择当前sheet

SheetName = sheet.name     # sheet名称

SheetPicture = sheet.pictures     # sheet图像对象
SheetRange = sheet.range('A1:B32')     # sheet范围对象
SheetShapes = sheet.shapes     # sheet图形对象
Sheettables = sheet.tables     # sheet表格对象

# 转换成PDF,属性path为路径,show为转后是否打开
# Quality为文件质量,可以为'standard'或'minimum'
sheet.to_pdf()

SheetUsed_range = sheet.used_range     # 有使用到范围对象
sheet.visible = False     # sheet是否显示或隐藏,False为隐藏

print(cells.value)
print(chart)
print(SheetName)
print(SheetRange.value)
print(SheetUsed_range.value)

wb.save('example.xlsx')     # 另存为,当内容为(Path=None)为仅保存,不是另存
wb.close()     # 关闭工作簿
app.quit()     # 退出Excel

3.3 range的常用方法和属性

import xlwings as xw
app = xw.App(visible=True, add_book=False)     # 新建Excel对象
wb = app.books.open(r'example.xlsx')     # 打开新工作簿
sheet = wb.sheets[0]     # 指定为开启工作簿的第一个sheet

# 各种赋值方式,注意 range 属性为小写
Range = sheet.range('A1')
Range = sheet.range('A1:C3')
Range = sheet.range((1,1))
Range = sheet.range((1,1), (3,3))
Range = sheet.range(sheet.range('A1'), sheet.range('B2'))
Range.value = 1     # 范围赋值

adress = 'www.baidu.com'     # 超链接地址
text_to_display = '百度地址'     # 超链接的地址。 要为超链接显示的文本。默认为超链接地址。
screen_tip = "跳转到百度"     # 当鼠标指针暂停在超链接上时显示的屏幕提示。默认设置为 <地址> 

# 单击一次即可follow。 点击并按住选择这个单元格。 
Range.add_hyperlink(adress, text_to_display, screen_tip)     # 添加超链接

Rangehyperlink = sheet.range('A1').hyperlink     # 获取范围超链接,仅限单格
Rangeadress = Range.address     # 获取范围地址

Range.autofit()     # 范围自适应
Range.clear()     # 范围清空
Range.clear_contents()     # 清空内容保留格式

Range.color = (255, 128, 128)  # or '#ffffff' 更改背景颜色,使用RGB代码
Range.color = None # 清除背景颜色

RangeColumn = Range.column     #获取改区域第一列的位置,为只读属性
# column_width为可更改属性
Range.column_width = 10     # 设置范围列宽度
RangeColumn_Width = Range.column_width     # 获取范围列宽度

RangeCount = Range.count     # 获取范围内单元格的个数
Range1 = sheet.range('A20:C32')

Current_Regin = Range.current_region     # 提取新的范围,不包括空行和空列

Range2 = sheet.range('A20:A20')
Range2.delete(shift = 'left')     # 删除范围,向左或向上使用。 如果省略,Excel将根据范围的形状来决定。 

# 在 6-10 行插入新行,格式取自原第 5 行( copy_origin 参数的默认值为 'format_from_left_or_above' )
# 原表中的第5行不动,新插入的行复制其格式设置;原表中的第6行及以后的行将被挤到第11行;6-10行为新插入的空行
# 如果区域指定为 A6:A10,则只有 A 列会复制上一行格式。以 A6:C10 指定区域,才会复制 A:C 列的格式
# 无法从带有表格线的最底侧行复制表格线格式,如果想复制带有表格线的格式,模板行至少应为原表格的下数第 2 行
# 换言之,就是要在表格中间插入行,而不要在最底侧行下面插入新行

sheet.range('A6:C10').insert(shift = 'down')

# 返回一个Range对象,该对象表示包含源范围的区域末尾的单元格。 
# 相当于按Ctrl+上,Ctrl+下,Ctrl+左,或Ctrl+右,使用 'up', 'down', 'right', 'left'
RangeEnd = Range1.end(direction = 'up')

RangeEepand = Range1.expand(mode = 'table')     # 返回范围扩展的区域,不同于End,table为Down&Right

sheet.range('A19:B19').formula = '=A21+B21'     # 范围公式赋值
sheet.range('B21:B23').value = 2
sheet.range('A19').formula_array = '=A21:A23*B21:B23'     # 范围公式赋值范围公式

AdressList = []
# get_address(row_absolute=True, column_absolute=True, include_sheetname=False, external=False)
# row_absolute (bool,默认为True) -设置为True将引用的行部分作为绝对引用返回。  
# column_absolute (bool,默认为True) -设置为True返回引用的列部分为绝对引用。  
# include_sheetname (bool,默认为False) -设置为True以包括地址中的Sheet名称。 如果忽略外部= True。  
# external (bool,默认为False) -设置为True返回带有工作簿和工作表名称的外部引用。
AdressList.append(sheet.range((1,1)).get_address())
AdressList.append(sheet.range((1,1)).get_address(False, False))
AdressList.append(sheet.range((1,1), (3,3)).get_address(True, False, True))
AdressList.append(sheet.range((1,1), (3,3)).get_address(True, False, external=True))

# 右shift (str,默认为None) - 使用右或下。 
# 如果省略,Excel将根据范围的形状来决定。  
# copy_origin (str,默认format_from_left_or_above) 
# 使用format_from_left_or_above或format_from_right_or_below。 
Range1.insert(shift='right', copy_origin='format_from_left_or_above')
LastCell = Range1.last_cell     # 范围内的最后一个单元格,只读属性
Left = Range1.left     # 返回从A列左边缘到范围左边缘的距离,以点为单位,只读属性
Range.top     # 返回从第1行的上边缘到范围上边缘的距离(以点为单位),只读属性。 
Range.width     # 返回范围宽度
Range.height     # 返回范围的高度

# 从指定的Range对象创建一个合并单元格。  
# across(bool,默认为False) - True将指定范围的每一行中的单元格合并为单独的合并单元格。 
Range1.merge(across = False)
MregeBoolean = Range1.merge_cells     # 如果Range包含合并单元格则返回True,否则返回False 

RangeName = Range.name     # 设置或获取Range的名称。
note = Range.note     # 返回一个Note对象。及单元格注释内容
Range1.number_format = '0.00%'     # 设置单元格内容格式

# 返回一个Range对象,该对象表示一个与指定范围偏移的Range。 
RangeOffset = Range1.offset(row_offset=1, column_offset=1)

# destination (xlwings.Range) - xlwings指定范围将被复制到的范围。 
# 如果省略,范围将复制到剪贴板。  
Range1.copy(destination=Range)     # 将范围复制到目标范围或剪贴板。  

sheet.pictures.add(image='1.jpeg', left=0, top=0, width=100, height=100)

# 将范围作为图片复制到剪贴板。  
# appearance (str,默认'screen') -要么是'screen'要么是' printer '。  
# format (str,默认为'picture') - 'picture'或' bitmap '。 
sheet.range('A1:C8').copy_picture(appearance ='screen', format = 'picture')

Range1.paste()     # 粘贴剪切板内容

# row_size (int > 0) -新范围内的行数(如果为None,则范围内的行数不变)。  
# column_size (int > 0) -新范围内的列数(如果为None,则范围内的列数不变)。 
RangeResize = Range.resize(row_size=2, column_size=2)     # 调整范围大小

RangeRow = Range1.row     # 返回指定范围内的第一行的编号,只读属性。
RangeRow = Range1.rows     # 返回一个RangeRows对象,它表示指定范围内的行。 

# 获取或设置Range的高度(以点为单位)。
# 如果Range中的所有行具有相同的高度,则返回高度。
# 如果Range中的行有不同的高度,则返回None。 
RangeRowHeight = Range1.row_height

Range1.select     # 选择范围,仅适用于打开的工作簿
Range1.shape     # 返回范围没的shape对象
Range1.sheet     # 返回范围所属的sheet
Range1.size     # 返回Range中元素的数量。
Range1.table     # 返回Range的table对象
Range1.to_png(path = '123.jpg')     # 保存为图片,path为路径
Range1.unmerge()     # 解除合并
Range1.value     # 范围内的值

print(RangeRowHeight)
print(RangeRow)
print(RangeResize)
print(RangeOffset)
print(note)
print(RangeName)
print(MregeBoolean)
print(Left)
print(LastCell)
print(Rangehyperlink)
print(AdressList)
print(RangeEnd)
print(Current_Regin.value)
print(RangeCount)
print(Rangeadress)
print(RangeColumn)
print(RangeColumn_Width)
print(RangeEepand)

wb.save('example.xlsx')     # 另存为,当内容为(Path=None)为仅保存,不是另存
wb.close()     # 关闭工作簿
app.quit()     # 退出Excel

3.4 rows、columns、shapes、pictures、tables等对象集合

# 可以使用Rows或者Columns定位到表格行与列
# 可以使用shapes、pictures、tables定位表格中的所有shape、picture、table等
import xlwings as xw
app = xw.App(visible=True, add_book=False)     #新建Excel对象
wb = app.books.open(r'example.xlsx')     #打开新工作簿
sheet = wb.sheets[0]     # 指定为开启工作簿的第一个sheet
rng = xw.Range('A1:C4')
for r in rng.rows:
    print(r.address)
for c in rng.columns:
    print(c.address)
for s in sheet.shapes:
    print(s.name)
for p in sheet.pictures:
    print(p.name)
for t in sheet.tables:
    print(t.name)
# wb.save('example.xlsx')     # 另存为,当内容为(Path=None)为仅保存,不是另存
# wb.close()     # 关闭工作簿
# app.quit()     # 退出Excel

3.5 shape的常用方法和属性

import xlwings as xw
app = xw.App(visible=True, add_book=False)     # 新建Excel对象
wb = app.books.open(r'example.xlsx')     # 打开新工作簿
sheet = wb.sheets[0]     # 指定为开启工作簿的第一个sheet
Shape = sheet.shapes[1]
# Shape.delete()     # 删除图形
# 与range一样的left,top,width,height
Shape.left
Shape.top
Shape.width
Shape.height
ShapeName = Shape.name     # Shape的名称
ShapePrent = Shape.parent    # 返回Shape的父元素,也就是Sheet
Shape.text = "这是一个Shape"     # 设置图形内位置,如果是Chart的Shape是不可用的
ShpeType = Shape.type    #返回形状的类型。
print(ShpeType)
print(ShapePrent)
print(ShapeName)
wb.save('example.xlsx')     # 另存为,当内容为(Path=None)为仅保存,不是另存
wb.close() # 关闭工作簿
app.quit() # 退出Excel

3.6 chart常用属性与方法

import xlwings as xw
app = xw.App(visible=True, add_book=False)     # 新建Excel对象
wb = app.books.open(r'example.xlsx')     # 打开新工作簿
sheet = wb.sheets[0]     # 指定为开启工作簿的第一个sheet
sheet.range('A1').value = [['Foo1', 'Foo2'], [1, 2]]
chart = sheet.charts.add(left=50, top=50, width=300, height=300)     # 添加Chart
chart.set_source_data(sheet.range('A1').expand())
chart.chart_type = 'line'     # 返回并设置图表的图表类型。 
#以下图表类型可供选择:
# 3d_area, 3d_area_stacked, 3d_area_stacked_100, 
# 3d_bar_clustered, 3d_bar_stacked, 3d_bar_stacked_100, 
# 3d_column, 3d_column_clustered, 3d_column_stacked, 
# 3d_column_stacked_100, 3d_line, 3d_pie, 3d_pie_exploded,
# area, area_stacked, area_stacked_100, bar_clustered, bar_of_pie,
# bar_stacked, bar_stacked_100, bubble, bubble_3d_effect,
# column_clustered, column_stacked, column_stacked_100, combination, 
# cone_bar_clustered, cone_bar_stacked, cone_bar_stacked_100, cone_col,
# cone_col_clustered, cone_col_stacked, cone_col_stacked_100, 
# cylinder_bar_clustered, cylinder_bar_stacked, cylinder_bar_stacked_100,
# cylinder_col, cylinder_col_clustered, cylinder_col_stacked,
# cylinder_col_stacked_100, doughnut, doughnut_exploded,
# line, line_markers, line_markers_stacked, 
# line_markers_stacked_100, line_stacked,
# line_stacked_100, pie, pie_exploded, 
# pie_of_pie, pyramid_bar_clustered, 
# pyramid_bar_stacked, pyramid_bar_stacked_100,
# pyramid_col, pyramid_col_clustered, pyramid_col_stacked,
# pyramid_col_stacked_100, radar, radar_filled, radar_markers,
# stock_hlc, stock_ohlc, stock_vhlc, stock_vohlc, 
# surface, surface_top_view, surface_top_view_wireframe,
# surface_wireframe, xy_scatter, xy_scatter_lines,
# xy_scatter_lines_no_markers, xy_scatter_smooth,
# xy_scatter_smooth_no_markers
# 与Shape一样,同样拥有name、left、top、width、height、
# name、parent、delete,使用方法一样
chart.name
chart.left
chart.top
chart.width
chart.height
chart.name
chart.parent
# to_png与之前讲过的方式一样
chart.to_png('1456.jpg')
chart.delete()
wb.save('example.xlsx') # 另存为,当内容为(Path=None)为仅保存,不是另存
wb.close() # 关闭工作簿
app.quit() # 退出Excel

3.7 picture的常用方法和属性

import xlwings as xw
app = xw.App(visible=True, add_book=False)     # 新建Excel对象
wb = app.books.open(r'example.xlsx')     # 打开新工作簿
sheet = wb.sheets[0]     # 指定为开启工作簿的第一个sheet
# image (str,类似路径的对象或Matplotlib .figure. figure) -一个文件路径或Matplotlib图形对象。  
# left(float,默认为None) -点的左侧位置,默认为0。 如果使用top/left,则不能为anchor提供值。  
# top (float,默认无)-顶点位置,默认为0。 如果使用top/left,则不能为anchor提供值。  
# width(float,默认None) -以点为单位的宽度。 默认为原始宽度。  
# height (float,默认无)-高度,以点为单位。 默认为初始高度。  
# name (str,默认None) - Excel图片名称。 如果没有提供,默认为Excel标准名称,例如“图1”。 
Picture=sheet.pictures.add(image='2.jpeg', left=0, top=0, width=100, height=100, name='NewPicture')
# 同样拥有name、left、top、width、height、
# name、parent、delete,使用方法一样
Picture.name
Picture.left
Picture.top
Picture.width
Picture.height
Picture.name
Picture.parent
wb.save('example.xlsx')     # 另存为,当内容为(Path=None)为仅保存,不是另存
wb.close()     # 关闭工作簿
app.quit()     # 退出Excel

3.8 table常用方法和属性

import xlwings as xw
app = xw.App(visible=True, add_book=False)     # 新建Excel对象
wb = app.books.open(r'example.xlsx')     # 打开新工作簿
sheet = wb.sheets[0]     # 指定为开启工作簿的第一个sheet
sheet['A1'].value = [['a', 'b'], [1, 2]]
# 添加table,source为数据,name为table名称
table = sheet.tables.add(source=sheet['A1'].expand(), name='MyTable')
TableBodyRange = table.data_body_range     # 返回一个范围对象,该对象表示不包括标题行在内的值范围 
table_name = table.name     # 返回或设置指定Table对象的名称 
Header_row_range = table.header_row_range     # 返回表示标题行范围的xlwings范围对象
tablerange = table.range     # 返回表的xlwings范围对象。
table.resize(sheet.range('A1:C3'))     # 通过提供一个xlwings范围对象来调整Table的大小
table.show_autofilter = False     # 通过将自动过滤器设置为True或False来打开或关闭它
table.show_headers = False     # 显示或隐藏标题
table.show_table_style_column_stripes = True     #返回或设置列条纹表样式用于
table.show_table_style_first_column = True     #第一列
table.show_table_style_last_column = True     #最后一列
table.show_table_style_row_stripes = True     #行
table.show_totals = True     # 汇总行开关
tablestyle = table.table_style     # 获取或设置表样式。
RowRange = table.totals_row_range     # 返回一个表示Total行的xlwings范围对象
print(RowRange)
print(tablestyle)
print(tablerange)
print(Header_row_range)
print(table_name)
print(TableBodyRange)
# wb.save('example.xlsx')     # 另存为,当内容为(Path=None)为仅保存,不是另存
# wb.close()     # 关闭工作簿
# app.quit()     # 退出Excel

3.9 font的常用方法和属性

import xlwings as xw
app = xw.App(visible=True, add_book=False)     # 新建Excel对象
wb = app.books.open(r'example.xlsx')     # 打开新工作簿
sheet = wb.sheets[0]     # 指定为开启工作簿的第一个sheet
Fon = sheet.range('A20').font
Fon.bold = True     #字体加粗
Fon.color = (255, 0, 0)  # or '#ff0000' 设置字体颜色
Fon.italic = True     # 斜体
Fon.name = '黑体'     # 设置字体
Fon.size = 50     # 设置字体大小
characters = sheet.range('A20').characters[0:5]     # 提取部分字符段
characters.font.color = (255, 128, 0)     # 部分字符段设置
posted @ 2025-11-18 06:58  汉学  阅读(165)  评论(0)    收藏  举报