前言
- 在python中,对excel文件的读写个人觉得比较好的是pandas,甚至比较很容易的上手!
- 不过,pandas的to_excel却不能根据自己想要样式去设置(搜索大量资料也是没有找到能用pandas进行excel样式的设置!若有小伙伴知道,望告知!)
- 所以这里我就不用pandas进行操作了!(后期文章再更新。。。)
- 使用另外的方法来实现(xlrd,xlwt,xlsxwriter)
正序
- xlrd是来对excel文件进行读取的,因为我们很多时候不单单操作一个文件,更是需要对很多excel文件进行数据汇总(多个文件的汇总,需要的是表头一致!!!),所以我们需要先获取指定目录下的excel文件的文件名!(话不多说,上代码!)
import os,xlrd,xlwt
import datetime
dateT = datetime.datetime.now()
# 当前日期
dateTstr = dateT.strftime("%Y%m%d")
dateTstr01 = dateT.strftime("%Y-%m-%d")
# 昨天日期
yesterday = (datetime.date.today() + datetime.timedelta(days = -1)).strftime("%Y-%m-%d")
# 获取目标文件夹下的子目录
dir_list = []
list_test = []
path = os.listdir('D:\\总数据')
# 找出所有xlsx的excel文件
for i in path:
if '.xlsx' in i:
list_test.append(i)
print(list_test)
print("在默认文件夹下有%d个文档哦" % len(list_test))
运行结果:(请填入有excel文件的目录!)
- 接下来,对excel的读取;
# 下面是将所有文件读数据到三维列表cell[][][]中(不包含表头)
for i in range(ge):
fname = list_test[i]
bk = xlrd.open_workbook("D:\\总数据\\"+ fname)
try:
sh = bk.sheet_by_name("Sheet1")
except:
print("在文件%s中没有找到Sheet1" % fname)
# nrows代表行数
nrows = sh.nrows
print(nrows)
matrix[i] = [0] * (nrows - 1)
# ncols代表列数
ncols = sh.ncols
print(ncols)
# 储存数据,方便后期写入
for m in range(nrows - 1):
matrix[i][m] = ["0"] * ncols
for j in range(1, nrows):
for k in range(0, ncols):
matrix[i][j - 1][k] = sh.cell(j, k).value
注意
- 顺利的,将多个文件的数据都获取了下来,写入就是一个汇总过程,需要规定上两个表格的同样的表头!(很容易错位的)
- xlwt的写入是通过获取多层列表里的数据来进行添加的,所以说这也是我觉得不错的一点!
- 将配置信息存入变量;后经过多层写入进行汇总保存;
汇总的完整代码 供上(不谢!)
import os,xlrd,xlwt
import datetime
dateT = datetime.datetime.now()
# 当前日期
dateTstr = dateT.strftime("%Y%m%d")
dateTstr01 = dateT.strftime("%Y-%m-%d")
# 昨天日期
yesterday = (datetime.date.today() + datetime.timedelta(days = -1)).strftime("%Y-%m-%d")
# 获取目标文件夹下的子目录
dir_list = []
list_test = []
path = os.listdir('D:\\总数据')
# 找出所有xlsx的excel文件
for i in path:
if '.xlsx' in i:
list_test.append(i)
print(list_test)
print("在默认文件夹下有%d个文档哦" % len(list_test))
# 实现读写数据
ge = len(list_test)
matrix = [None] * ge
# 下面是将所有文件读数据到三维列表cell[][][]中(不包含表头)
for i in range(ge):
fname = list_test[i]
bk = xlrd.open_workbook("D:\\总数据\\"+ fname)
try:
sh = bk.sheet_by_name("Sheet1")
except:
print("在文件%s中没有找到Sheet1" % fname)
# nrows代表行数
nrows = sh.nrows
print(nrows)
matrix[i] = [0] * (nrows - 1)
# ncols代表列数
ncols = sh.ncols
print(ncols)
# 储存数据,方便后期编写
for m in range(nrows - 1):
matrix[i][m] = ["0"] * ncols
for j in range(1, nrows):
for k in range(0, ncols):
matrix[i][j - 1][k] = sh.cell(j, k).value
# 下面这些变量需要您根据自己的具体情况选择
# 添加表头
biaotou = ['数据1','数据2']
# 在哪里搜索多个表格
filelocation = "D:\\总数据\\"
# 当前文件夹下搜索的文件名后缀
fileform = "xlsx"
# 将合并后的表格存放到的位置
filedestination = "D:\\总数据\\"
# 合并后的表格命名为file
file = "汇总表"
# 下面是写数据到新的表格test.xls中哦
filename = xlwt.Workbook()
# 设置新表的名称
sheet = filename.add_sheet("汇总")
# 下面是把表头写上
for i in range(0, len(biaotou)):
sheet.write(0, i, biaotou[i])
# 求和前面的文件一共写了多少行
zh = 1
for i in range(ge):
for j in range(len(matrix[i])):
for k in range(len(matrix[i][j])):
sheet.write(zh, k, matrix[i][j][k])
zh = zh + 1
print("我已经将%d个文件合并成1个文件,并命名为%s.xls" % (ge, file))
filename.save(filedestination + file + ".xls")
-
生成效果:
目前我们已经对多个文件进行了汇总操作,但是对最终呈现的效果需要进一步要求,为表格内容进行样式设置;
- 简单来说,通过xlrd获取列表数据,再用xlsxwriter带着样式写入excel表格;
- 上完整代码,已做详细注释;
# 读取指定目录的Excel文件
workfile = xlrd.open_workbook("D:\\总数据\\汇总表.xls")
table = workfile.sheet_by_name(u'汇总')#通过名称获取
t1 = table.row_values(0)#获取第一行的值,以列表形式返回
t2 = table.col_values(0)#获取第一列的值,以列表
# 形式返回
print(t2)
# 获取excel文件的行数与列数
nrows = table.nrows#行数
ncols = table.ncols#列数
workbook = xlsxwriter.Workbook("D:\\总数据\\汇总表.xls") # 创建一个excel文件
worksheet = workbook.add_worksheet(u'汇总') # 在文件中创建一个名为TEST的sheet,不加名字默认为sheet1
'''
ItemStyle = workbook.add_format({
'font_size':10, #字体大小
'bold':1, #是否粗体
'bg_color':'#101010', #表格背景颜色
'font_color':'#FEFEFE', #字体颜色
'align':'center', #对齐方式,left,center,rigth,top,vcenter,bottom,vjustify
'top':2, #上边框,后面参数是线条宽度
'left':2, #左边框
'right':2, #右边框
'bottom':2 #底边框
'text_wrap':1 #自动换行,可在文本中加 '\n'来控制换行的位置
'num_format':'yyyy-mm-dd' #设定格式为日期格式,如:2017-07-01
})
'''
# 设置一个加粗的格式对象,左右居中,上下居中,单元格宽度,字体大小
bold = workbook.add_format({'bold': False, 'align': 'center', 'valign': 'vcenter', 'border':1, 'font_size':11})
# 设置一个加粗的格式对象,左右居中,上下居中,单元格宽度,字体大小,背景颜色
bold_test = workbook.add_format({'bold': True, 'align': 'center', 'valign': 'vcenter','border':1, 'font_size':11,'bg_color':'#D9D9D9'})
# 设置表头样式
t = table.row_values(0)
for e,data_t in enumerate(t):
# 设置行高
worksheet.set_row(0, 20, bold_test)
# 写入excel
worksheet.write(0, int(e), data_t, bold_test)
# 设置表头以下的表格样式
for i in range(1,int(nrows)):
t1 = table.row_values(i) # 获取第i行的值,以列表形式返回
print(t1)
for j,data in enumerate(t1):# 输出循环次数
# 设置行高
worksheet.set_row(int(i), 20, bold)
# 写excel
worksheet.write(int(i) , int(j), data, bold) # 使用行列的时候第一行起始为i,所以i,j代表着第i+1行的第j+1列
# 设置列宽(A到B列)
worksheet.set_column('A:B', 20)
workbook.close()
print('————excel设置成功————')
- 联合上段汇总代码亦可直接运行,注意的是替换路径!
- 其中很多参数可以根据自己想要的效果进行设置
-
效果:
个人小话
- 说实话已经很久没有更新文章了,现在也该要把这习惯重新捡起来,好处就是巩固了自己又能利于他人(趁着我现在还有这种心态#捂脸哭#)!
“你以后想成为什么样的人? ”
“什么意思,难道我以后就不能成为我自己了吗? ”
——阿甘正传
- 愿世界和平(手动微笑)