python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python不改变Excel单元格样式

Python不改变Excel单元格样式方式—xls和xlsx两种格式

作者:KaiKai-G

这篇文章主要介绍了Python不改变Excel单元格样式方式—xls和xlsx两种格式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Python不改变Excel单元格样式—xls和xlsx两种格式

因为xls和xlsx两种格式,xlsx是被加密了传统的方式读取修改不了

# -*- 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("全部修改完成!")
# -*- 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())

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文