本实例可以实现Python操作Excel数据表,并将其保存在已经存在的一张模板数据表中。
1.利用Python操作Excel数据表需要导入xlrd的文件包,也可以使用Pandas直接读取,本例使用最原始的方法xlrd来实现。
2.将Excel表中的数据写入到另一个已经存在的模板文件中时,需要导入xlutils.copy的文件包,将工作表copy出来之后,再实现对其写入操作。
3.由于xlrd包将Excel文件保存为xlsx文件格式时,打开EXCEL文件时会出现文件被损坏等问题,这是由于xlrd包支持EXCEL 2007版之下的xls文件格式,对于xlsx文件的兼容性并不好。
4.为了解决保存为xlsx文件格式无法打开的问题,引入了pandas包,可以利用pandas读取的xlsx文件格式保存,便解决了无法打开的问题。
5.利用pandas包将读取到的xlsx文件保存时,如果不将index列隐藏,会多出一列Index标识列,可以通过index=false,将其隐去。
import xlrd
import time
from xlutils.copy import copy
import pandas as pd
workbook=xlrd.open_workbook(r'原始文件路径.xlsx') #打开文件
myoldMBWorkbook =xlrd.open_workbook(r'标准模版文件路径.xlsx') #模板文件
# 根据sheet索引(sheet索引从0开始)或者名称获取sheet内容
sheet1 = workbook.sheet_by_index(0) # 原始文件的第一张表
sheet2 = workbook.sheet_by_index(1) # 原始文件的第二张表
sheet3 = myoldMBWorkbook.sheet_by_index(0) # sheet3代表模板表
myMBWorkbook=copy(myoldMBWorkbook) # copy模板表
myMBsheet=myMBWorkbook.get_sheet(0) # 模板表
# 按行进行数据的收集与合并
b_cn=sheet1.ncols # 获取原始文件的第一张表所有的列数
b_rn=sheet1.nrows # 获取原始文件的第一张表所有的行数
m_rn=sheet3.nrows # 获取模板表所有的行数
#写入原始文件的第一张表信息
for i in range(b_rn-1): # 遍历所有的行数
RDB=sheet1.cell_value(i+1, 0) #获取报警车辆第i行,第1列的数据
Che_P=sheet1.cell_value(i+1, 1) #获取报警车辆第i行,第2列的数据
BaoJMC=sheet1.cell_value(i+1, 8) #获取报警车辆第i行,第9列的数据
BaoJDJ=sheet1.cell_value(i+1, 7) #获取报警车辆第i行,第8列的数据
BaoJCS = sheet1.cell_value(i + 1, 6) # 获取报警车辆第i行,第7列的数据
BaoJSJ=time.strftime("%Y%m%d") #当前的日期
KeHDZ = sheet1.cell_value(i + 1, 3)+'-'+sheet1.cell_value(i + 1, 9)+'-'+sheet1.cell_value(i + 1, 2)
FuZR= sheet1.cell_value(i + 1, 11)
#将数据写入到模板当中
myMBsheet.write(m_rn+i,1, RDB)
myMBsheet.write( m_rn+i, 2, Che_P)
myMBsheet.write(m_rn+i, 4, BaoJMC)
myMBsheet.write(m_rn+i, 5, BaoJDJ)
myMBsheet.write( m_rn+i, 6, BaoJSJ)
myMBsheet.write(m_rn+i, 7, BaoJCS)
myMBsheet.write( m_rn+i, 9, KeHDZ)
# 保存
myMBWorkbook.save('原始文件路径-'+ time.strftime("%Y%m%d")+'.xlsx')
df=pd.read_excel('原始文件路径\crm-请求导入模版-'+ time.strftime("%Y%m%d")+'.xlsx')
df.to_excel('原始文件路径\crm-请求导入模版-'+ time.strftime("%Y%m%d")+'.xlsx', index=False)
完整代码如上,亲测有效,如有不同方法的见解欢迎转载评论。