python批量处理excel——给指定单元格填充颜色

一、需求及解决思路
1.需求描述
要求批量处理excel文件,每个excel中包含多个sheet页,表与表之间sheet一样、表样一样,但填表的内容不同,要求批量填充指定单元格颜色(本实验用标准颜色:红色)
在这里插入图片描述
在这里插入图片描述
2.解决思路
S1:尝试对一个文件实现指定单元格填充
S2:尝试批量处理文件
二、准备工作
1.工具选择
开发工具:Jupter(安装anaconda后选择自带的Jupter)
其他工具:Excel
2.其他文件准备
(1)需要标注的单元格坐标
列举每个sheet页中需要标记的单元格坐标
(2)源文件
在这里插入图片描述

(3)处理源文件后
在这里插入图片描述

三、效果展示
在这里插入图片描述
每个excel对应的该sheet页,均如上图所示
四、具体实现
1.源文件是xlsx文件,xlrd无法操作,要转化成xls或csv的格式

"""
xlsx 转 xls
"""
# -*- coding:utf-8 -*-
import os
import win32com.client as win32

# 输入目录
inputdir = r'C:\Users\zhang.fan\Desktop\小学'
# 输出目录
outputdir = r'C:\Users\zhang.fan\Desktop\小学\小学xls'
if not os.path.exists(outputdir):
    os.mkdir(outputdir)

# 三个参数:父目录;所有文件夹名(不含路径);所有文件名
for parent, dirnames, filenames in os.walk(inputdir):
    for fn in filenames:
        if fn.split('.')[-1] == "xlsx":
            filedir = os.path.join(parent, fn)
            print(filedir)
            excel = win32.gencache.EnsureDispatch('Excel.Application')
            wb = excel.Workbooks.Open(filedir)
            # xlsx: FileFormat=51
            # xls:  FileFormat=56
            wb.SaveAs((os.path.join(outputdir, fn.replace('xlsx', 'xls'))), FileFormat=56)
            wb.Close()
            excel.Application.Quit()

2.批量填充单元格

# 小学 指定行列,批量标记文件
def main():
    filename = os.listdir(r'C:/Users/zhang.fan/Desktop/小学/小学xls')
    print("*****读取成功*****")
    print(len(filename))
    styleBlueBkg = xlwt.easyxf('pattern: pattern solid, fore_colour red;')  # 红色
    
    
    for i in range(len(filename)):
        try:
            file_name = 'C:/Users/zhang.fan/Desktop/小学/小学xls/' + filename[i]
            # print(file_name)
            
            
            rb = xlrd.open_workbook(file_name, formatting_info = True)
            wb = copy(rb)
            
            ro1 = rb.sheets()[5]           
            ws1 = wb.get_sheet(5)   
            #指定修改的列
            alter_list = [(6,1),(6,2),(6,3),(6,4),(6,5),(6,6),(6,7),(6,8),(6,9),(6,10),(17,3),(16,6),(17,6),(18,9),(18,10)]
            for j in range(len(alter_list)):
                row,col = alter_list[j]
                # print(col,row)
                # ws11.write(row,col,ro1.cell(row, col).value,style)
                ws1.write(row,col,ro1.cell(row, col).value,styleBlueBkg)           
            print("sheet5***颜色标记成功***")
            
            ro2 = rb.sheets()[6]
            # wb = copy(rb)
            ws2 = wb.get_sheet(6)
            #指定修改的列
            alter_list = [(8,3),(9,3),(10,3),(11,3),(12,3),(13,3),(14,3),(16,3),(18,3),(36,3),(38,3),(39,3),(40,3),(41,3),(42,3),(43,3)]
            for j in range(len(alter_list)):
                row,col = alter_list[j]
                ws2.write(row,col,ro2.cell(row, col).value,styleBlueBkg)
            print("sheet6***颜色标记成功***")
            
            """
			列举两个,其他省略
			"""
            
            # save_name = 'C:/Users/zhang.fan/Desktop/newtest/'+ filename[i]
            save_name = 'C:/Users/zhang.fan/Desktop/newdata/小学/{}'.format(filename[i])
            print(save_name)
            wb.save(save_name)
            print('***文件处理成功***')
        except Exception as e:
            pass
        continue
        
        
if __name__ == "__main__":
    main()

五、踩坑合集
1.读取的数据没有保留原文档格式,解决方法:添加参数formatting_info = True,默认是False

rb = xlrd.open_workbook(file_name, formatting_info = True)

2.若源文件是xlsx,使用save_name = 'C:/Users/zhang.fan/Desktop/newtest/'+ filename[i]
save后因扩展是.xlsx而无法打开文件,解决方法:在save时使用format更改文件后缀为xls
3.指定sheet时可以用sheetname指定
4.
六、改进
1.列举每个sheet页中需要标记的单元格坐标很繁琐,曾经尝试根据模板中已经标记好的颜色,自动解析出对应坐标,然后喂进代码,但尝试失败,按道理应该是可以
在这里插入图片描述

2.标记好的单元格颜色都是xlwt中能识别的标准色,视觉上给人的冲击感太强,不太美观,可以自定义颜色,目前没有做尝试

3.标记好的单元格默认连同边框一起填充,曾经尝试先填充颜色再加上边框(或先加边框再填充颜色),效果并不理想,cell总是会用最后一项操作覆盖之前的操作,目前不确定能不能对同一个单元格进行颜色填充和加边框的操作
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39416070/article/details/119671929