python中处理excel的库很多,例如:xlrd、xlwt、xlswriter、xlwings。openpyxl、pandas等。
但运用中发现pandas、xlwt等库读取excel数据操作后保存的文件,数据类型变了(基本都是常规),为了保持数据类型或者说文件格式不变,采用xlwings进行相关操作。(在服务器上线,不适合用xlwings,因需打开excel系统进行交互,可用openpyxl)
Xlrd:xlrd支持.xls、.xlsx Excel文件的读,并不支持.xls、.xlsx 文件的写。
Xlwt:xlwt仅支持.xls文件的写。 Xlsxwriter:xlswriter支持.xlsx文件的写,另外此模块还支持VBA操作。
Win32com:win32com支持Excel的.xlsx和.xls,安装pypiwin32即可使用该库,该模块现在只支持Windows系统。
Openpyxl:openpyxl支持Excel2010多种文件的操作,read_only和write_only两个参数值得注意,该模块对VBA的支持不好,不支持.xls文件的操作。
Xlwings:xlwings实现了Excel中调用Python,python中调用Excel的骚操作,支持.xls文件的读,支持.xlsx文件的读写,支持VBA的操作,另外还支持和Numpy、Pandas结合进行操作,在很大程度上扩展了应用。
Pandas :pandas不用多说了,数据分析领域最为重要的库,支持.xls和.xlsx读写。
import xlwings as xw #pip install xlwings
app = xw.App(visible=True, add_book=False) #创建App
# visible参数控制创建文件时可见的属性
app.display_alerts=False #警告提示,不显示Excel消息框
app.screen_updating=False #关闭屏幕更新,可加快宏的执行速度
wb = app.books.open(r'test.xlsx') #打开已有excel
sheet = wb.sheets["sheet1"] #选中sheet1
#或者sheet =wb.sheets[1]
rows = sheet.api.UsedRange.Rows.count #总行数
cols = sheet.api.UsedRange.columns.count #总列数
#因为库中没有直接获取表头列名的操作,所以遍历第一行,取指定列所在单元格位置
rng = sheet[0,:cols] #取第一行
for cell in rng:
if cell.value =='简称':
print(cell.address) #值是简称,就返回单元格位置
a = cell.address
b = a[1:2] #返回的值是$A$1,截取列的位置,即我们只需要A
c = b+'2:'+b+str(rows) #整列的范围
a_range = sheet.range(str(c)) # 得到range对象,就是简称所在的列
# 将range中每行对象存放到列表中并倒序(倒序是因为删除行后,后面的行位置都-1,从后向前删除就不会存在这个问题了)
cell_list = []
for cell in a_range:
cell_list.append(cell)
cell_list.reverse()
#删除行操作
for cell in cell_list:
print(cell.value)
if cell.value != 'LIMENGYAO':
cell_to_del = cell.address
sheet.range(cell_to_del).api.EntireRow.Delete()
wb.save('test2.xls')
wb.close()
app.quit()