对多个excel文件的汇总与样式写入(xlrd,xlwt,xlsxwriter)

前言

  • python中,对excel文件的读写个人觉得比较好的是pandas,甚至比较很容易的上手!
  • 不过,pandasto_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")
  • 生成效果:


    工作簿1
工作簿2
汇总表

目前我们已经对多个文件进行了汇总操作,但是对最终呈现的效果需要进一步要求,为表格内容进行样式设置;

  • 简单来说,通过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设置成功————')
  • 联合上段汇总代码亦可直接运行,注意的是替换路径!
  • 其中很多参数可以根据自己想要的效果进行设置
  • 效果:


    最终效果

个人小话

  • 说实话已经很久没有更新文章了,现在也该要把这习惯重新捡起来,好处就是巩固了自己又能利于他人(趁着我现在还有这种心态#捂脸哭#)!

“你以后想成为什么样的人? ”
“什么意思,难道我以后就不能成为我自己了吗? ”
——阿甘正传

  • 愿世界和平(手动微笑)
进化图
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容