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')

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值