Python不改变Excel单元格样式方式—xls和xlsx两种格式
作者:KaiKai-G
这篇文章主要介绍了Python不改变Excel单元格样式方式—xls和xlsx两种格式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Python不改变Excel单元格样式—xls和xlsx两种格式
因为xls和xlsx两种格式,xlsx是被加密了传统的方式读取修改不了
- 下面是xls格式读取修改
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: test_excel # Description: # Author: GLK # Date: 2021/7/7 # ------------------------------------------------------------------------------- import xlrd import os import datetime from xlutils.filter import process, XLRDReader, XLWTWriter #修改表内容 def update_sheet(sheet,sheet_copy,style_list): if sheet.name != '模板': # 得到这个表单自己写的内容的个数(因为每个人表格行数个数都不同,所以没法定位自己写了几个) # rows = sheet.nrows - 11 # 得到一个自己写的列表 print(f"表单名:{sheet.name}", end=" ") print(f"行数:{sheet.nrows}", end=" ") print(f"列数:{sheet.ncols}", end=" ") # print(f"自己写的内容个数:{rows}", end=" ") # 得到一个单元格的索引位置的格式 style = style_list[sheet.cell_xf_index(4, 8)] print("工时内容分别为:",end="") #根据观察最多是写了5个工时内容 for i in range(0,5): # 得到这一单元格的内容 value = sheet.cell_value(4 + i, 8) if value != "": print(value,end=",") # 按照上面的格式修改单元格 sheet_copy.write(4 + i, 6, value, style) print(" 工时日志修改成功!") #通过地址定位到表 def select_sheet(addr,date): try: rb = xlrd.open_workbook(addr, formatting_info=True) # 参考xlutils.copy库内的用法 参考xlutils.filter内的参数定义style_list(相当于拆分copy方法) w = XLWTWriter() process(XLRDReader(rb, addr), w) wb = w.output[0][1] style_list = w.style_list try: # 原本的表 (通过名字查找) sheet = rb.sheet_by_name(date) # 复制出来的表 (通过名字查找) sheet_copy = wb.get_sheet(date) except: print("表名不存在,可能是周六日") #修改表 update_sheet(sheet,sheet_copy,style_list) wb.save(addr) except: print("非xls格式的文件") #读取目录下所有的文件名放到result中 def get_all_word(cwd): work_time = [] get_dir = os.listdir(cwd) for i in get_dir: sub_dir = os.path.join(cwd,i) if os.path.isdir(sub_dir): get_all_word(sub_dir) else: work_time.append(i) return work_time #得到当前时间起一周前的时间表名 def get_date_week(): #得到今天的时间 today = datetime.date.today() #将当前日期一周的时间放到list中 week_time = [str(today - datetime.timedelta(days =7 - w)) for w in range(1, 8)] #因为格式问题 需要替换掉 "-" day_time = [] for day in week_time: replace = day.replace("-", "") day_time.append(replace) print("当前一周的表单名为:",day_time) return day_time if __name__ == '__main__': print("======请将所有.xls格式的工时日志文件放到'D:\工时日志'下=======") print() # 1、存放全部excel的目录地址 addr = r'D:\\工时日志\\' #2、得到addr目录下所有的文件 work_time = get_all_word(addr) print('"D:\工时日志"目录下的文件有:',work_time) #3、得到当前一周的表名 week_time = get_date_week() print() #4、遍历每个表 for date in week_time: for work_t in work_time: # 拼接 addr_work = addr + work_t print("正在修改的文件为:",work_t,end=" ") #传入地址和要修改的表名 select_sheet(addr_work, date) print("#############################") print("全部修改完成!")
- xlsx
# -*- coding: utf-8 -*-# #------------------------------------------------------------------------------- # Name: test_excel # Description: # Author: GLK # Date: 2021/7/6 #------------------------------------------------------------------------------- import openpyxl import os #读取并修改excel工时 def update(wb,time): try: sheet = wb[time] if sheet.title != '模板': #得到这个表单自己写的内容的个数(总长度减去固定的表格长度就是自己添加的个数) rows = sheet.max_row - 11 #得到一个自己写的列表 print(f"名:{sheet.title}",end=" ") print(f"行:{sheet.max_row}",end=" ") print(f"列:{sheet.max_column}",end=" ") for i in range(0,5): #通过遍历个数得到索引到每个位置进行读取和修改 xl_cell = sheet.cell(row=5+i, column=9).value sheet.cell(row=5+i, column=7,value=xl_cell) print(f"工时内容:{xl_cell}",end=",") print() except: print("表不存在") #加载excel文件并修改设置时间 def excel_work(addr_work,date): # 加载 excel 文件 print(addr_work) try: wb = openpyxl.load_workbook(addr_work) update(wb,date) wb.save(addr_work) except: print("不是.xlsx格式") #读取目录下所有的文件名放到work_time中 def get_all_word(cwd): work_time = [] get_dir = os.listdir(cwd) for i in get_dir: sub_dir = os.path.join(cwd,i) if os.path.isdir(sub_dir): get_all_word(sub_dir) else: work_time.append(i) return work_time if __name__ == '__main__': #存放全部excel的目录地址 addr = r'D:\\工时日志\\' #将当前目录下的文件名放到list中 work_time = get_all_word(addr) print(work_time) date = input("请输入需要修改的日期:") for work_t in work_time: #拼接 addr_work = addr + work_t excel_work(addr_work,date) # active = wb.active # print(active) # # # 得到sheet对象 # sheet = wb['20210701'] # # sheet['A1'] = '修改' # sheet['C%d'%(5)] = 'aaaaaaaaaaa' # # ## 指定不同的文件名,可以另存为别的文件 # wb.save(r'D:\工时日志\工作簿1.xlsx')
python写数据到excel,不改变原有样式
问题\场景\需求
python 读取excel之后,格式就复原了,怎么让格式不变
解决\目标
目标:python写数据到excel,不改变原有样式
解决:在打开excel时,加入该参数 formatting_info=True
from xlrd import open_workbook r_xls = open_workbook(fileName,formatting_info=True) # 读取excel文件 row = r_xls.sheets()[sheet].nrows # 获取已有的行数 excel.save(fileName) # 保存
def table_data_list(self): """获取table数据,返回一个json""" par_ids_list, sec_ids_list, dep_ids_list, job_list, major_list = [], [], [], [], [] en_master_qty_list, en_un_qty_list, ex_master_qty_list, ex_un_qty_list, notes_list = [], [], [], [], [] count_num = 0 if self: for line in self.line_ids: major_name = line.major_ids.mapped('name') par_ids_list.append(line.parent_company_id.name) sec_ids_list.append(line.secondary_company_id.name) dep_ids_list.append(line.department_name) job_list.append(line.job) major_list.append(','.join(major_name)) en_master_qty_list.append(line.en_master_qty) en_un_qty_list.append(line.en_undergraduate_qty) ex_master_qty_list.append(line.ex_master_qty) ex_un_qty_list.append(line.ex_undergraduate_qty) notes_list.append(line.notes) count_num += 1 data_array = { 'id': self.id, 'tab_name': self.name, 'count_num': count_num, 'sec_ids_list': sec_ids_list, 'par_ids_list': par_ids_list, 'dep_ids_list': dep_ids_list, 'job_list': job_list, 'major_list': major_list, 'en_master_qty_list': en_master_qty_list, 'en_un_qty_list': en_un_qty_list, 'ex_master_qty_list': ex_master_qty_list, 'ex_un_qty_list': ex_un_qty_list, 'notes_list': notes_list, } return data_array def btn_excl_method(self): """导出excel入口函数""" data_array = self.table_data_list() context = dict(self._context or {}) wiz_obj = self.env['hd.export.export.data.wizard'] filename = '计划编制-%s' % (datetime.datetime.today()) wiz_id = wiz_obj.sudo().create({ 'file_data': self.file_data_excel(data_array) }) value = dict( type='ir.actions.act_url', target='self', url='/web/content?model=%s&id=%s&field=file_data&download=true&filename=%s.xls' % ( 'hd.export.export.data.wizard', wiz_id.id, filename), ) return value def file_data_excel(self, data_array): # 1、使用xlrd打开Excel workbook1 = open_workbook( "E:\\HD_Settled\\dtcloud360\\appstore\\dtcloud_hd_graduate\\static\\src\\download\\hd.graduate.application.line.xlsx") # 2、使用xlutils模块的copy复制打开的文件,并保留原格式 open_mb_file_cp = copy.copy(workbook1) # 3、使用下标定位的方式定位到Excel工作簿里的工作表 worksheet = open_mb_file_cp.get_sheet(0) count_num = data_array['count_num'] if count_num > 0: for row in range(1, count_num + 1): rews = row - 1 worksheet.write(row, 0, data_array['sec_ids_list'][rews] or '') worksheet.write(row, 1, data_array['par_ids_list'][rews] or '') worksheet.write(row, 2, data_array['dep_ids_list'][rews] or '') worksheet.write(row, 3, data_array['job_list'][rews] or '') worksheet.write(row, 4, data_array['major_list'][rews] or '') worksheet.write(row, 5, data_array['en_master_qty_list'][rews]) worksheet.write(row, 6, data_array['en_un_qty_list'][rews]) worksheet.write(row, 7, data_array['ex_master_qty_list'][rews]) worksheet.write(row, 8, data_array['ex_un_qty_list'][rews]) worksheet.write(row, 9, data_array['notes_list'][rews] or '') buffer = BytesIO() open_mb_file_cp.save(buffer) return base64.encodebytes(buffer.getvalue())
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。