Python 读写 Excel 文件——xlwings
如果有中间有空格或者后面有空格的话,openpyxl的Sheet.max_row、Sheet.max_column是不准确的
(有可能返回的是65536行或1048576行),而且openpyxl无法打开加密的Excel,xlwings
由于使用了与VBA一致的API,因此只要VBA有的方法,xlwings都有;
同时xlwings与pandas结合的也很好;最后实践过程中openpyxl对excel
内置格式支持的不够好,比如修改完工作簿另存为时,合并单元格的边框会丢失)。
xlwings 特色
xlwings 能够非常方便的读写 Excel 文件中的数据,并且能够进行单元格格式的修改
可以和 matplotlib 以及 pandas 无缝连接
可以调用 Excel 文件中 VBA 写好的程序,也可以让 VBA 调用用 Python 写的程序。
开源免费,一直在更新
xlwings 基本对象
1. 打开已保存的 Excel 文档
导入xlwings模块,打开Excel程序,默认设置:程序可见,只打开不新建工作薄,屏幕更新关闭
import xlwings as xw
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False
# 文件位置:filepath,打开test文档,然后保存,关闭,结束程序
filepath=r'g:\Python Scripts\test.xlsx'
wb=app.books.open(filepath)
wb.save()
wb.close()
app.quit()
2. 新建 Excel 文档,命名为 test.xlsx,并保存在 D 盘。
import xlwings as xw
app=xw.App(visible=True,add_book=False)
wb=app.books.add()
wb.save(r'd:\test.xlsx')
wb.close()
app.quit()
3. 在单元格输入值
新建test.xlsx,在sheet1的第一个单元格输入 “人生” ,然后保存关闭,退出Excel程序。
import xlwings as xw
app=xw.App(visible=True,add_book=False)
wb=app.books.add()
# wb就是新建的工作簿(workbook),下面则对wb的sheet1的A1单元格赋值
wb.sheets['sheet1'].range('A1').value='人生'
wb.save(r'd:\test.xlsx')
wb.close()
app.quit()
打开已保存的test.xlsx,在sheet2的第二个单元格输入“苦短”,然后保存关闭,退出Excel程序
import xlwings as xw
app=xw.App(visible=True,add_book=False)
wb=app.books.open(r'd:\test.xlsx')
# wb就是新建的工作簿(workbook),下面则对wb的sheet1的A1单元格赋值
wb.sheets['sheet1'].range('A1').value='苦短'
wb.save()
wb.close()
app.quit()
掌握以上代码,已经完全可以把Excel当作一个txt文本进行数据储存了,也可以读取Excel文件的数据,进行计算后,并将结果保存在Excel中。
引用工作簿、工作表和单元格
1. 引用工作簿,注意工作簿应该首先被打开
wb.=xw.books['工作簿的名字‘]
2. 引用活动工作簿
wb=xw.books.active
3. 引用工作簿中的sheet
sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
wb=xw.books['工作簿的名字']
sht=wb.sheets[sheet的名字]
4. 引用活动sheet
sht=xw.sheets.active
5. 引用A1单元格
rng=xw.books['工作簿的名字‘].sheets['sheet的名字']
sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
rng=sht.range('A1')
6. 引用活动sheet上的单元格
注意Range首字母大写
rng=xw.Range('A1')
其中需要注意的是单元格的完全引用路径是:
第一个Excel程序的第一个工作薄的第一张sheet的第一个单元格
xw.apps[0].books[0].sheets[0].range('A1')
迅速引用单元格的方式是
sht=xw.books['名字'].sheets['名字']
A1单元格
rng=sht[’A1']
A1:B5单元格
rng=sht['A1:B5']
在第i+1行,第j+1列的单元格
B1单元格
rng=sht[0,1]
A1:J10
rng=sht[:10,:10]
PS: 对于单元格也可以用表示行列的tuple进行引用
A1单元格的引用
xw.Range(1,1)
A1:C3单元格的引用
xw.Range((1,1),(3,3))
1. 储存单个值
注意".value“
sht.range('A1').value=1
2. 储存列表
将列表[1,2,3]储存在A1:C1中
sht.range('A1').value=[1,2,3]
将列表[1,2,3]储存在A1:A3中
sht.range('A1').options(transpose=True).value=[1,2,3]
将2x2表格,即二维数组,储存在A1:B2中,如第一行1,2,第二行3,4
sht.range('A1').options(expand='table')=[[1,2],[3,4]]
1. 读取单个值
将A1的值,读取到a变量中
a=sht.range('A1').value
2. 将值读取到列表中
将A1到A2的值,读取到a列表中
a=sht.range('A1:A2').value
将第一行和第二行的数据按二维数组的方式读取
a=sht.range('A1:B2').value
常用函数和方法
1. Book 工作簿常用的api
wb=xw.books[‘工作簿名称‘]
* wb.activate()激活为当前工作簿
* wb.fullname 返回工作簿的绝对路径
* wb.name 返回工作簿的名称
* wb.save(path=None) 保存工作簿,默认路径为工作簿原路径,若未保存则为脚本所在的路径
-wb. close() 关闭工作簿
代码例子:
引用Excel程序中,当前的工作簿
wb=xw.books.acitve
返回工作簿的绝对路径
x=wb.fullname
返回工作簿的名称
x=wb.name
保存工作簿,默认路径为工作簿原路径,若未保存则为脚本所在的路径
x=wb.save(path=None)
关闭工作簿
x=wb.close()
2. sheet 常用的api
引用某指定sheet
sht=xw.books['工作簿名称'].sheets['sheet的名称']
激活sheet为活动工作表
sht.activate()
清除sheet的内容和格式
sht.clear()
清除sheet的内容
sht.contents()
获取sheet的名称
sht.name
删除sheet
sht.delete
3. range常用的api
引用当前活动工作表的单元格
rng=xw.Range('A1')
加入超链接
rng.add_hyperlink(r'[www.baidu.com','](https://link.jianshu.com/?t=http://www.baidu.com%27,%27)百度',‘提示:点击即链接到百度')
取得当前range的地址
rng.address
rng.get_address()
清除range的内容
rng.clear_contents()
清除格式和内容
rng.clear()
取得range的背景色,以元组形式返回RGB值
rng.color
设置range的颜色
rng.color=(255,255,255)
清除range的背景色
rng.color=None
获得range的第一列列标
rng.column
返回range中单元格的数据
rng.count
返回current_region
rng.current_region
返回ctrl + 方向
rng.end('down')
获取公式或者输入公式
rng.formula='=SUM(B1:B5)'
rng.formula_array
获得单元格的绝对地址
rng.get_address(row_absolute=True, column_absolute=True,include_sheetname=False, external=False)
rng.column_width
返回range的总宽度
rng.width
获得range的超链接
rng.hyperlink
获得range中右下角最后一个单元格
rng.last_cell
range平移
rng.offset(row_offset=0,column_offset=0)
range进行resize改变range的大小
rng.resize(row_size=None,column_size=None)
range的第一行行标
rng.row
行的高度,所有行一样高返回行高,不一样返回None
rng.row_height
返回range的总高度
rng.height
返回range的行数和列数
rng.shape
返回range所在的sheet
rng.sheet
返回range的所有行
rng.rows
range的第一行
rng.rows[0]
range的总行数
rng.rows.count
返回range的所有列
rng.columns
返回range的第一列
rng.columns[0]
返回range的列数
rng.columns.count
所有range的大小自适应
rng.autofit()
所有列宽度自适应
rng.columns.autofit()
所有行宽度自适应
rng.rows.autofit()
4. books 工作簿集合的api
新建工作簿
xw.books.add()
引用当前活动工作簿
xw.books.active
5. sheets 工作表的集合
新建工作表
xw.sheets.add(name=None,before=None,after=None)
引用当前活动sheet
xw.sheets.active
python xlwings 获取sheet名及个数
import xlwingsas xw
app=xw.App(visible=False,add_book=False)
app.display_alerts=False
app.screen_updating=False
filepath=r’c:\test.xlsx’
wb=app.books.open(filepath)
x = []# 创建空列表
num =len(wb.sheets)#获取sheet个数
for iin range(0,num):
if i>=0:
sht = wb.sheets[i]
x.append(sht.name)
i +=1 # 计数数量自加1
else:
print(num)
print(x)
下面是隐藏和显示工作表的方法
import xlwings as xw
def hid_sheet():
wb=xw.books['隐藏测试.xlsx']
for sheet in wb.sheets: #wb.sheets工作簿的所有工作表
#把名字不是Sheet1的工作表都隐藏
if sheet.name!='Sheet1':
sheet.api.visible=False
def unhid_sheet():
wb=xw.books['隐藏测试.xlsx']
for sheet in wb.sheets:
sheet.api.visible=True
if __name__ == '__main__':
#hid_sheet()
unhid_sheet()
# coding=utf-8
import xlwings as xw
# 设置程序不可见运行
app = xw.App(visible=False, add_book=False)
# =============== 第一部分,创建并写入数据 =====================
# 创建一个test2.xlsx表,并写入数据
# wb = app.books.add()
# ws = wb.sheets.active
# arr = []
# for col in range(1,4):
# arr_temp = []
# for row in range(1,4):
# arr_temp.append(col*10+row)
# arr.append(arr_temp)
# ws.range('A1:B3').value=arr
# wb.save('data/test2.xlsx')
# wb.close()
# app.quit()
# exit()
# ============== 第二部分,插入、删除行和列 ========================
# 导入已存的demo表格
load_wb = app.books.open('data/test2.xlsx')
# # 打开活动的工作薄的活动工作簿,或者指定的工作簿
load_ws = load_wb.sheets.active
# load_ws = load_wb.sheets['Sheet']
# 获取总行数(存在数据)
rows = load_ws.api.UsedRange.Rows.count
cols = load_ws.api.UsedRange.Columns.count
# print('该表格总共有:'+str(rows)+' 行')
# print('该表格总共有:'+str(cols)+' 列')
# exit()
# 1-①在第二行前插入2行(可理解为: 在第2-4行插入空白行)
# load_ws.api.rows('2:4').insert
# 1-②删除第2-4行
# load_ws.api.rows('2:4').delete
# 2-①在第二列前插入2列(这里处理的不是很好,其实是增加了对应区域的单元格,并未直接增加列)
# load_ws.range('B1:C'+str(cols)).api.insert
# 2-②删除第2-4列
# load_ws.range('B1:C'+str(cols)).api.delete
# ============== 第三部分,修改指定单元格的值 ========================
# load_ws.range('A1').value = 'x11'
# ============== 第四部分,合并单元格 ========================
# load_ws.range('A1:A2').api.merge
# ============== 第五部分,获取单元格横纵坐标index ========================
rng=xw.Range('B2')
# 返回当前格子的行值
# print(rng.row)
# 返回当前格子的列值
# print(rng.column)
# 返回和设置当前格子的高度和宽度
print(rng.width)
print(rng.height)
rng.row_height=40
rng.column_width=50
# 指定单元格的高度和宽度自适应
# rng.columns.autofit()
rng.rows.autofit()
print(rng.width)
print(rng.height)
# load_ws.range('A1:A2').api.height = 20
# ============== 第六部分,其它 ========================
# lst=load_ws.range('A1:A'+str(load_ws['A1048576'].end('up').row)).value #把excel单列值读取到列表中
# lst1=load_ws.range('A1:C'+str(load_ws['A1048576'].end('up').row)).value # 把excel连续两个列的值读取到列表中
# lst=load_ws.range('A1:A'+str(load_ws['A1048576'].end('up').row)).value #A列的值
# lst2=load_ws.range('C1:C'+str(load_ws['A1048576'].end('up').row)).value#C列的值
# lst3=list(zip(lst,lst2))#合并起来然后转为列表
# dicta=dict(lst3)#列表转为字典
# ============== 第七部分,Office操作文档 ========================
# https://docs.microsoft.com/en-us/office/vba/api/excel.range(object)
load_wb.save()
load_wb.close()
app.quit()
代码收录:
这篇文章主要介绍了Python+Xlwings 删除Excel的行和列的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
一、需求:
某公司管理的多个资管计划每天生成A表,业务人员需手工打开每个A表,将某些行、列删除后方可打印上报。
现拟采用程序代替手工操作。
二、分析:
1、应在原始文件的副本上操作,因此需拷贝文件夹内所有Excel至目标目录;
解答:使用shutil.copy()
2、需打开excel并删除指定的行和列;
解答:openpyxl不支持xls格式,xlwt无法删除行和列,最终选择xlwings;
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import os
import shutil
import xlwings as xw
current_dir = os.getcwd()
src_dir = os.path.join(current_dir, 'src_dir')
dst_dir = os.path.join(current_dir, 'dst_dir')
exist_list = ['YYYY', 'XXXX'] # 要保留行的A列关键字
def file_copy(source_dir, destination_dir):
os.chdir(source_dir)
for file in os.listdir(source_dir):
shutil.copy(file, destination_dir)
print('INFO ===>>> 文件拷贝完成!')
def excel_modifier(wk_dir):
os.chdir(wk_dir)
for file in os.listdir(wk_dir):
# 检查文件格式是否为xls
# print(type(os.path.splitext(file)[1]))
if os.path.splitext(file)[1] != '.xls':
print(file, '===>>>文件格式不正确,请检查!')
else:
print('开始处理===>>>', file)
# 创建app,打开工作表
app = xw.App(visible=False, add_book=False)
app.screen_updating = False
app.display_alerts = False
load_wb = app.books.open(file)
load_ws = load_wb.sheets.active
print('\t已打开工作表……')
# 获取总行数(列数固定不需要获取)
rows = load_ws.api.UsedRange.Rows.count
# cols = load_ws.api.UsedRange.Columns.count
# 获取需要处理的A列范围
a_range = load_ws.range('A1:A'+str(rows-4)) # 得到range对象
# 将range中每行对象存放到列表中并倒序
print('\t开始获取标志列……')
cell_list = []
for cell in a_range:
cell_list.append(cell)
cell_list.reverse()
# print(cell_list)
# 将表头拆分、重新合并,为插入的值腾地方
print('\t开始调整合并单元格……')
load_ws.range('H3:J3').api.unmerge() # 拆分单元格
load_ws.range('H3:I3').api.merge() # 合并单元格
load_ws.range('J3').value = 'xxx' # 插入值
# 设定将A列每个值与要保留列表比对,比对不上则删除整行
print('\t开始调整行和列……')
for cell in cell_list:
if cell.value is not None: # 单元格不为空则开始比对
find_flag = 0 # 匹配标志
for exist_value in exist_list:
if cell.value.find(exist_value) != -1:
find_flag = 1 # 匹配则将标志置为1
break # 一个单元格只要匹配就不再比对保留列表剩下的值
else:
continue # 匹配不上则继续
if find_flag == 0: # 没匹配上的删除整行
cell_to_del = cell.address
# print(cell_to_del)
load_ws.range(cell_to_del).api.EntireRow.Delete()
else: # 单元格为空直接删除
cell_to_del = cell.address
# print(cell_to_del)
load_ws.range(cell_to_del).api.EntireRow.Delete()
# 处理列,将指定列从大到小删除(避免先删除小列导致后续列号变动)
load_ws.api.columns('K').delete
load_ws.api.columns('G').delete
load_ws.api.columns('B').delete
# 美化处理后的Excel
print('\t开始美化表格……')
load_ws.range('A1:H24').columns.autofit()
# 处理完毕,保存、关闭、退出Excel
load_wb.save()
load_wb.close()
app.quit()
print('处理完毕===>>>', file, '\n\n')
if __name__ == '__main__':
file_copy(src_dir, dst_dir)
excel_modifier(dst_dir)
print('任务结束,请至dst_dir目录查看文件!\n\n')
os.system('pause')
在官方文档看不到的知识点:
# -*- coding: UTF-8 -*-
import xlwings as xw
wb = xw.Book() # 创建一个临时表格
sht = wb.sheets["sheet1"] # 创建sheet页
sht.range("A1").value = 1 # 给指定单元格赋值
sht.range("A1:C3").api.font.size = 15 # 设置单元格字体大小
sht.range("A1:C3").api.font.name = "微软雅黑" # 设置字体
sht.range("A1").api.font.bold = True # 设置单元格字体是否加粗
sht.range("A1").api.font.color = 0x0000FF # 设置字体颜色
print(sht.range("A1").api.font.name) # 返回指定单元格中字体的名字,默认为 宋体
sht.range("A1:C3").api.Borders(9).LineStyle = 1 # 划底部边框
sht.range("A1:C3").api.Borders(9).Weight = 3
sht.range("A1:C3").api.Borders(10).LineStyle = 1 # 划右部边框
sht.range("A1:C3").api.Borders(10).Weight = 3
sht.range("A1:C3").api.Borders(11).LineStyle = 1 # 划内部竖线
sht.range("A1:C3").api.Borders(11).Weight = 2
sht.range("A1:C3").api.Borders(12).LineStyle = 1 # 划内部横线
sht.range("A1:C3").api.Borders(12).Weight = 2
sht.range("A1:C3").api.HorizontalAlignment = -4108 # -4108 水平居中。 -4131 靠左,-4152 靠右
sht.range("A1:C3").api.VerticalAlignment = -4108 # -4108 垂直居中(默认)。 -4160 靠上,-4107 靠下, -4130 自动换行对齐。
sht.range("B1").value = 2
sht.range("C1").formula = "=SUM(A1:B1)" # 引用公式
sht.range("A1").columns.autofit() # 自动根据单元格中内容调整单元格的宽度
sht.range("A1").color = [0, 0, 255] # 设置单元格颜色
print(sht.range("A1").value) # 返回单元格内容
print(sht.range("A1").color) # 返回单元格颜色值
print(sht.range("C1").formula_array) # 返回单元格中的引用公式
sht.range('A2').value = [['hello 1', 'hello 2', 'hello 3'], [1.0, 2.0, 3.0]] # 批量填写数据
print(sht.range("A2").expand().value) # 输出批量输入内容
sht.range("A4:C4").merge() # 进行单元格合并
print(sht.range("A4").merge_area) # 返回合并单元格的对象,如果不在范围之内则返回具体的单元格
print(sht.range("A4:C4").merge_cells) # 返回真假
sht.range("A4").unmerge() # 取消合并单元格
设置区域格式的代码
一、关于整行整列数据读写的问题
一次读写整行和整列的方法,整行数据写入时可以简单将读取的赋值语句交换一下等号左右
两边的操作数据,但在写入整列数据时不能简单用该方式赋值,而是在列选择中
加上“options(transpose=True)”的方式,且无需使用expand方法,否则还是操作的行数据,
哪怕expand的参数为‘down’。具体请见如下:
import xlwings as excel
excelApp = excel.App(False, False)
excelFile = excelApp.books.add()
sheet = excelFile.sheets.add('test')
sheet.range(1, 1).expand('right').value = [1,2,3,4] #将第一行置为1,2,3,4
sheet.range(2, 1).expand('down').value = [11,12,13,14] #将第2行开始的第一列置为11,12,13,14
excelFile.save(r"c:\temp\csdn\test.xlsx")
excelFile.close()
excelApp.quit()
执行上述语句后,excel中的结果变成了:
将上述语句改为:
def test():
import xlwings as excel
excelApp = excel.App(False, False)
excelFile = excelApp.books.add()
sheet = excelFile.sheets.add('test')
sheet.range(1, 1).expand('right').value = [1,2,3,4] #将第一行置为1,2,3,4
sheet.range(2, 1).expand('down').options(transpose=True).value = [11,12,13,14] #将第2行开始的第一列置为11,12,13,14
excelFile.save(r"c:\temp\csdn\test.xlsx")
excelFile.close()
excelApp.quit()
上面语句也可以将:sheet.range(2, 1).expand('down').options(transpose=True).value = [11,12,13,14]
替换为:sheet.range(2, 1).options(transpose=True).value = [11,12,13,14]
效果相同,执行后excel内容截图:
二、多行多列数据读写的问题
如果在读取excel数据读取多列数据时,如果不知道读取的结果是1列还是多列,则在此需要进行特殊处理,这是因为读取一列数据时返回的是一个一维的列表,但读取超过2列数据时返回的是一个两维的列表,因此数据类型不同,可能会导致后续操作需要特别注意。对这种情况最好就在数据读取后判断是否二维列表还是一维列表,如果是一维列表,为了程序处理的统一性,可以转为二维列表。
下面就是一个判断返回值是否为二维列表的简单案例:
if not isinstance(urlReadInfoList[0],list): #是否是一维列表
urlReadInfoList=[[i]for i in urlReadInfoList] #转换成二维列表
写入可以按行列写入,但
三、一次性写入多行多列
使用如下语句可以一次写入多行多列数据:
def test():
import xlwings as excel
excelApp = excel.App(False, False)
excelFile = excelApp.books.add()
sheet = excelFile.sheets.add('test')
sheet.range(2, 2).expand('right').value = [[1,2,3,4] ,[11,12,13,14]]
#sheet.range(2, 1).options(transpose=True).value = #将第2行开始的第一列置为11,12,13,14
excelFile.save(r"c:\temp\csdn\test.xlsx")
excelFile.close()
excelApp.quit()
将上述语句的expand(‘right’)改为expand(‘down’)和不带expand效果相同,结果如下:
如果将上述语句改为:
def test():
import xlwings as excel
excelApp = excel.App(False, False)
excelFile = excelApp.books.add()
sheet = excelFile.sheets.add('test')
sheet.range(2, 2).options(transpose=True).value = [[1,2,3,4] ,[11,12,13,14]]
excelFile.save(r"c:\temp\csdn\test.xlsx")
excelFile.close()
excelApp.quit()
执行行数test,行和列的数据就会交换,变成如下结果:
四、设置字体颜色和填充色
设置字体颜色和填充色需要用到api和color等属性,参考如下语句:
def test():
import xlwings as excel
excelApp = excel.App(False, False)
excelFile = excelApp.books.add()
sheet = excelFile.sheets.add('test')
sheet.range(1, 1).options(transpose=True).value = [[1,2,3,4] ,[11,12,13,14]]
sheet.range(1, 1).expand('right').api.Font.Color = 0xffffff #设置字体为白色
sheet.range(1, 1).expand('right').color = (0, 0, 255) #设置填充色为蓝色
excelFile.save(r"c:\temp\csdn\test.xlsx")
excelFile.close()
excelApp.quit()
颜色的表示方法有三种,包括颜色索引号、RGB的16进制表示法以及RGB的三元组表示法,其中的颜色索引号请参考下面引用的博文。RGB的16进制表示法以及RGB的三元组表示法在数值的排序上有区别,三元组表示法是按RGB的顺序来设置颜色的如(0,0,255)表示蓝色,而16进制则是反序,如蓝色的值为0xFF0000。
五、设置对齐方式
对齐方式的设置使用数据单元的api.VerticalAlignment 属性,如下语句:sheet.range(1, 1).expand('right').api.VerticalAlignment = -4130,设置为数据自动换行。相关取值及含义参考如下语句的说明:
sheet.range(1, 1).expand('right').api.HorizontalAlignment = -4108
# -4108 水平居中。 -4131 靠左,-4152 靠右。
sheet.range(1, 1).expand('right').api.VerticalAlignment = -4130
# -4108 垂直居中(默认)。 -4160 靠上,-4107 靠下, -4130 自动换行对齐。
六、设置宽度和高度
宽度和高度通过数据单元的column_width和row_height属性进行调整,不过老猿测试确认列宽的单位是以字符为单位,行高的单位是以像素为单位:
def test():
import xlwings as excel
excelApp = excel.App(False, False)
excelFile = excelApp.books.add()
sheet = excelFile.sheets.add('test')
sheet.range(1, 1).options(transpose=True).value = [[1,2,3,4] ,[11,12,13,14]]
sheet.range(1, 1).expand('right').api.Font.Color = 0xffffff
sheet.range(1, 1).expand('right').color = (0, 0, 255)
sheet.range('A1').row_height = 20 #行高设置为20像素
sheet.range('A1').column_width = 2 #列宽设置为2个字符
excelFile.save(r"c:\temp\csdn\test.xlsx")
excelFile.close()
excelApp.quit()
xlwings 其他的一些单元格读取写入操作网上很多,
下面就写些如何设置单元格的 字体对齐,字体大小、边框, 合并单元格, 这些设置。
import xlwings as xw
app = xw.App(visible=True, add_book=False)
wb = app.books.add()
sht = wb.sheets.active
b3 = sht.range('b3')
"""设置单元格大小"""
sht.autofit() # 自动调整单元格大小。
sht.range(1,4).column_width = 5 # 设置第4列 列宽。(1,4)为第1行第4列的单元格
sht.range(1,4).row_height = 20 # 设置第1行 行高
"""设置单元格 字体格式"""
b3.color = 255,200,255 # 设置单元格的填充颜色
b3.api.Font.ColorIndex = 3 # 设置字体的颜色,具体颜色索引见下方。
b3.api.Font.Size = 24 # 设置字体的大小。
b3.api.Font.Bold = True # 设置为粗体。
b3.api.HorizontalAlignment = -4108 # -4108 水平居中。 -4131 靠左,-4152 靠右。
b3.api.VerticalAlignment = -4130 # -4108 水平居中(默认)。 -4160 靠上,-4107 靠下, -4130 自动换行对齐。
b3.api.NumberFormat = "0.00" # 设置单元格的数字格式。
"""设置边框"""
# Borders(9) 底部边框,LineStyle = 1 直线。
b3.api.Borders(9).LineStyle = 1
b3.api.Borders(9).Weight = 3 # 设置边框粗细。
# Borders(7) 左边框,LineStyle = 2 虚线。
b3.api.Borders(7).LineStyle = 2
b3.api.Borders(7).Weight = 3
# Borders(8) 顶部框,LineStyle = 5 双点划线。
b3.api.Borders(8).LineStyle = 5
b3.api.Borders(8).Weight = 3
# Borders(10) 右边框,LineStyle = 4 点划线。
b3.api.Borders(10).LineStyle = 4
b3.api.Borders(10).Weight = 3
# Borders(5) 单元格内从左上角 到 右下角。
b3.api.Borders(5).LineStyle = 1
b3.api.Borders(5).Weight = 3
# Borders(6) 单元格内从左下角 到 右上角。
b3.api.Borders(6).LineStyle = 1
b3.api.Borders(6).Weight = 3
"""如果是一个区域的单元格,内部边框设置如下"""
# # Borders(11) 内部垂直边线。
# b3.api.Borders(11).LineStyle = 1
# b3.api.Borders(11).Weight = 3
# # Borders(12) 内部水平边线。
# b3.api.Borders(12).LineStyle = 1
# b3.api.Borders(12).Weight = 3
"""合并拆分单元格"""
sht.range('C8:D8').api.merge() # 合并单元格 C8 到 D8
sht.range('C8:D8').api.unmerge() # 拆分单元格。
"""插入、读取公式"""
sht.range('d1').formula = '=sum(e1+f1)' # 插入公式
print(sht.range('d1').formula)
wb.save()
#wb.close()
#app.quit()
年前学习xlwings时断断续续产出的存货,现在整理出来分享给需要的小伙伴们。
1 .新建保存重命名表、插入删除行列、复制行列,批量写入数据
import xlwings as xw
wb = xw.Book()
#新建一个工作表
sht = wb.sheets[0]
#shee1
sheet_name = 'NEWSHEET'
sht.name = sheet_name
#更改第一个sheet名字
col_a = [1,2,3,4,5,6,7]
sht.range('A1:A7').options(transpose=True).value = col_a
#整列赋值
sht.api.Columns(1).Insert()
#在第一列前插入一列
sht.api.Rows(1).Insert()
#在第一行前插入一行
sht.range('A3:A4').api.EntireRow.Delete()
#删除3,4行
sht.api.Columns(2).Copy(sht.api.Columns(1))
#复制第二列到第一列,可以带格式复制
sht.range('B1').api.EntireColumn.Delete()
#删除第二列B列
wb.save(r'F:\PythonData\xlwings\NewData.xlsx')
xw.App().quit()
#退出整个excel,不写的话打开excel会显示被其他人使用
2 .获取有数据的所有行数和列数
used_range
Used Range of Sheet.
Returns:
Return type: xw.Range
last_cell
Returns the bottom right cell of the specified range. Read-only.
Returns:
Return type: Range
import xlwings as xw
wb = xw.Book(r'F:\xlwings\OriginalData.xlsx')
sht = wb.sheets[0]
info = sht.used_range
nrows = info.last_cell.row
print(nrows)
ncolumns = info.last_cell.column
print(ncolumns)
3 .读取一整个sheet到pandas.DataFrame
import xlwings as xw
import pandas as pd
from pandas import Series,DataFrame
wb = app.books.add()
sht_All = wb.sheets[0]
info = sht_All.used_range
nrows = info.last_cell.row
def GetDataFrame(Sheets,N,M):
index1 = Sheets.range((1,1),(1,15)).value
index2 = Series(index1)
Data = Sheets.range((2,1),(N,M)).value
Data = pd.DataFrame(Data,columns=index2)
return Data
m = GetDataFrame(sht_All,nrows,15)
4 .保存与另存为
使用xlwings处理excel有时会需要在原表格上进行更改,当然可以选择提取数据再进行相关操作,也可以操作之后另存为。
另存为的方法如下:
import xlwings as xw
wb = xw.Book(r'F:\xlwings\OriginalData.xlsx')
wb1 = xw.books.open(r'F:\xlwings\OriginalData01.xlsx')
#打开文件
wb.save()
#保存原文件
wb1.save(r'F:\xlwings\PresentData01.xlsx')
#另存为PresentData01.xlsx
5 .调用api:设置excel对齐方式,框线,背景颜色,字体加粗等
我们先在excel把自己想要的格式设置出来:
‘One’:加粗,左对齐靠下
‘Two’:倾斜,居中靠下
‘Three’:下划线,左对齐靠上
‘Four’:左对齐居中
‘Five’:右对齐靠下
全框线,粉色
import xlwings as xw
wb = xw.Book(r'F:\PythonData\xlwings\Style.xlsx')
sht = wb.sheets[0]
sht_color = sht.range((1,1)).color
print(sht_color)
#(255, 153, 255)
sht.range((3,1)).color = (255, 153, 255)
#A3背景颜色为粉色
sht_BoldA = sht.range((1,1)).api.Font.Bold
print(sht_BoldA)
#True
sht_BoldB = sht.range((1,2)).api.Font.Bold
print(sht_BoldB)
#False
sht.range((3,1)).value = 'A3'
sht.range((3,1)).api.Font.Bold = True
sht_Fontstyle = sht.range((1,2)).api.Font.FontStyle
print(sht_Fontstyle)
sht.range((3,2)).value = 'B3'
sht.range((3,2)).api.Font.FontStyle = "倾斜"
#设置为斜体
sht_Underline = sht.range((1,3)).api.Font.Underline
print(sht_Underline)
#2,为下划线
sht.range((3,3)).value = 'C3'
sht.range((3,3)).api.Font.Underline = 2
#设置下划线
sht_style = sht.range((1,1),(1,5)).api.Borders.LineStyle
print(sht_style)
sht.range((3,1),(3,3)).api.Borders.LineStyle = 1
#设置全框线
sht_HA_A1 = sht.range((1,1)).api.HorizontalAlignment
print(sht_HA_A1)
#水平左对齐
sht_HA_A2 = sht.range((1,2)).api.HorizontalAlignment
print(sht_HA_A2)
#水平居中
#-4108
sht_HA_A5 = sht.range((1,5)).api.HorizontalAlignment
print(sht_HA_A5)
#水平右对齐
#-4152
sht_VA_A3 = sht.range((1,3)).api.VerticalAlignment
print(sht_VA_A3)
#垂直靠上
#-4160
sht_VA_A4 = sht.range((1,4)).api.VerticalAlignment
print(sht_VA_A4)
#垂直居中
#-4108
sht_VA_A5 = sht.range((1,5)).api.VerticalAlignment
print(sht_VA_A5)
#垂直靠下
#-4107
wb.save()
xw.App().quit()
range('A1').api.NumberFormat = "@" #设置为文本格式
range('A2').api.NumberFormat = "0.0" #设置为小数格式
range('A3').api.NumberFormat = "yyyy-mm-dd" #设置为"-"连接的日期格式
range('A4').api.NumberFormat = "0%" #设置为百分比
前面介绍了利用python的xlwings库对excel进行新建、打开及对工作表、单元格区域等操作,本篇这里介绍利用xlwings对excel进行字体(font)、边框(border)、合并(merge)单元格等excel格式的设置,让生成的表格更加漂亮。
先生成一个excel工作薄(book),获得当前活动的工作表(sheet):
import xlwings as xw
app = xw.App(visible=True, add_book=False)
wb = app.books.add()
sht = wb.sheets.active
cell = sht.range('c3')
xlwings设置excel单元格大小(行高与列宽):
"""设置单元格大小"""
sht.autofit() # 自动调整单元格大小。
sht.range('a1:d5').column_width = 5 # 设置第1-4列的列宽。
sht.range(1,4).row_height = 20 # 设置第1行 行高。
xlwings设置excel单元格字体(font)格式:
"""设置单元格 字体格式"""
cell.color = 255,200,255 # 设置单元格的填充颜色
cell.api.Font.ColorIndex = 3 # 设置字体的颜色,具体颜色索引见下方。
cell.api.Font.Size = 24 # 设置字体的大小。
cell.api.Font.Bold = True # 设置为粗体。
cell.api.NumberFormat = "0.00" # 设置单元格的数字格式。
xlwings设置excel单元格对齐方式:
"""设置单元格的对齐方式"""