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())总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
