Python不改變Excel單元格樣式方式—xls和xlsx兩種格式
Python不改變Excel單元格樣式—xls和xlsx兩種格式
因?yàn)閤ls和xlsx兩種格式,xlsx是被加密了傳統(tǒng)的方式讀取修改不了
- 下面是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
#修改表內(nèi)容
def update_sheet(sheet,sheet_copy,style_list):
if sheet.name != '模板':
# 得到這個(gè)表單自己寫的內(nèi)容的個(gè)數(shù)(因?yàn)槊總€(gè)人表格行數(shù)個(gè)數(shù)都不同,所以沒法定位自己寫了幾個(gè))
# rows = sheet.nrows - 11
# 得到一個(gè)自己寫的列表
print(f"表單名:{sheet.name}", end=" ")
print(f"行數(shù):{sheet.nrows}", end=" ")
print(f"列數(shù):{sheet.ncols}", end=" ")
# print(f"自己寫的內(nèi)容個(gè)數(shù):{rows}", end=" ")
# 得到一個(gè)單元格的索引位置的格式
style = style_list[sheet.cell_xf_index(4, 8)]
print("工時(shí)內(nèi)容分別為:",end="")
#根據(jù)觀察最多是寫了5個(gè)工時(shí)內(nèi)容
for i in range(0,5):
# 得到這一單元格的內(nèi)容
value = sheet.cell_value(4 + i, 8)
if value != "":
print(value,end=",")
# 按照上面的格式修改單元格
sheet_copy.write(4 + i, 6, value, style)
print(" 工時(shí)日志修改成功!")
#通過地址定位到表
def select_sheet(addr,date):
try:
rb = xlrd.open_workbook(addr, formatting_info=True)
# 參考xlutils.copy庫內(nèi)的用法 參考xlutils.filter內(nèi)的參數(shù)定義style_list(相當(dāng)于拆分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)
# 復(fù)制出來的表 (通過名字查找)
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
#得到當(dāng)前時(shí)間起一周前的時(shí)間表名
def get_date_week():
#得到今天的時(shí)間
today = datetime.date.today()
#將當(dāng)前日期一周的時(shí)間放到list中
week_time = [str(today - datetime.timedelta(days =7 - w)) for w in range(1, 8)]
#因?yàn)楦袷絾栴} 需要替換掉 "-"
day_time = []
for day in week_time:
replace = day.replace("-", "")
day_time.append(replace)
print("當(dāng)前一周的表單名為:",day_time)
return day_time
if __name__ == '__main__':
print("======請將所有.xls格式的工時(shí)日志文件放到'D:\工時(shí)日志'下=======")
print()
# 1、存放全部excel的目錄地址
addr = r'D:\\工時(shí)日志\\'
#2、得到addr目錄下所有的文件
work_time = get_all_word(addr)
print('"D:\工時(shí)日志"目錄下的文件有:',work_time)
#3、得到當(dāng)前一周的表名
week_time = get_date_week()
print()
#4、遍歷每個(gè)表
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工時(shí)
def update(wb,time):
try:
sheet = wb[time]
if sheet.title != '模板':
#得到這個(gè)表單自己寫的內(nèi)容的個(gè)數(shù)(總長度減去固定的表格長度就是自己添加的個(gè)數(shù))
rows = sheet.max_row - 11
#得到一個(gè)自己寫的列表
print(f"名:{sheet.title}",end=" ")
print(f"行:{sheet.max_row}",end=" ")
print(f"列:{sheet.max_column}",end=" ")
for i in range(0,5): #通過遍歷個(gè)數(shù)得到索引到每個(gè)位置進(jìn)行讀取和修改
xl_cell = sheet.cell(row=5+i, column=9).value
sheet.cell(row=5+i, column=7,value=xl_cell)
print(f"工時(shí)內(nèi)容:{xl_cell}",end=",")
print()
except:
print("表不存在")
#加載excel文件并修改設(shè)置時(shí)間
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:\\工時(shí)日志\\'
#將當(dāng)前目錄下的文件名放到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:\工時(shí)日志\工作簿1.xlsx')python寫數(shù)據(jù)到excel,不改變原有樣式
問題\場景\需求
python 讀取excel之后,格式就復(fù)原了,怎么讓格式不變
解決\目標(biāo)
目標(biāo):python寫數(shù)據(jù)到excel,不改變原有樣式
解決:在打開excel時(shí),加入該參數(shù) formatting_info=True
from xlrd import open_workbook r_xls = open_workbook(fileName,formatting_info=True) # 讀取excel文件 row = r_xls.sheets()[sheet].nrows # 獲取已有的行數(shù) excel.save(fileName) # 保存
def table_data_list(self):
"""獲取table數(shù)據(jù),返回一個(gè)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):
"""導(dǎo)出excel入口函數(shù)"""
data_array = self.table_data_list()
context = dict(self._context or {})
wiz_obj = self.env['hd.export.export.data.wizard']
filename = '計(jì)劃編制-%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復(fù)制打開的文件,并保留原格式
open_mb_file_cp = copy.copy(workbook1)
# 3、使用下標(biāo)定位的方式定位到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())總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python輸入一個(gè)水仙花數(shù)(三位數(shù)) 輸出百位十位個(gè)位實(shí)例
這篇文章主要介紹了python輸入一個(gè)水仙花數(shù)(三位數(shù)) 輸出百位十位個(gè)位實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
python實(shí)現(xiàn)超市商品銷售管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)超市商品銷售管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
Django 使用easy_thumbnails壓縮上傳的圖片方法
今天小編就為大家分享一篇Django 使用easy_thumbnails壓縮上傳的圖片方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python Sqlite3以字典形式返回查詢結(jié)果的實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄狿ython Sqlite3以字典形式返回查詢結(jié)果的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10
python將類似json的數(shù)據(jù)存儲(chǔ)到MySQL中的實(shí)例
今天小編就為大家分享一篇python將類似json的數(shù)據(jù)存儲(chǔ)到MySQL中的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Selenium基于PIL實(shí)現(xiàn)拼接滾動(dòng)截圖
這篇文章主要介紹了Selenium基于PIL實(shí)現(xiàn)拼接滾動(dòng)截圖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Python實(shí)現(xiàn)讀取及寫入csv文件的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)讀取及寫入csv文件的方法,涉及Python針對csv格式文件的讀取、遍歷、寫入等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
導(dǎo)入tensorflow:ImportError: libcublas.so.9.0 報(bào)錯(cuò)
這篇文章主要介紹了導(dǎo)入tensorflow:ImportError: libcublas.so.9.0 報(bào)錯(cuò),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
詳解python架構(gòu)?PyNeuraLogic超越Transformers
這篇文章主要為大家介紹了python使用?PyNeuraLogic超越Transformers示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

