python的xlutils模块_xlutils模块使用
1、xlutils?實現拷貝原文件
原表格:
import xlrdfromxlutils.copy import copy
workbook= xlrd.open_workbook('mcw_test.xlsx') # 打開工作簿
new_workbook=copy(workbook) # 將xlrd對象拷貝轉化為xlwt對象
new_workbook.save("mcw_test.xlsx") # 保存工作簿
新工作簿的工作表內容一樣,sheet2有點數據也復制出來了,只是格式沒有復制過來:
2、拷貝前獲取原工作簿信息
workbook = xlrd.open_workbook('mcw_test.xlsx') # 打開工作簿
sheets=workbook.sheet_names() # 獲取工作簿中的所有工作表名字,形成列表元素
worksheet= workbook.sheet_by_name(sheets[0]) # 通過sheets[0]工作表名稱獲取工作簿中所有工作表中的的第一個工作表
rows_old=worksheet.nrows # 獲取第一個工作表中已存在的數據的行數
print(sheets,sheets[0],worksheet,worksheet.nrows )-------------------------------------結果:
['魔降風云變人名單', 'Sheet2', 'Sheet3'] 魔降風云變人名單 4
3、拷貝后獲得新工作簿的信息:
workbook = xlrd.open_workbook('mcw_test.xlsx') # 打開工作簿
new_workbook = copy(workbook) # 將xlrd對象拷貝轉化為xlwt對象
new_worksheet = new_workbook.get_sheet(0) # 獲取轉化后工作簿中的第一個工作表對象
print(new_worksheet,new_workbook,new_worksheet.name) #有時間整理下工作表對象的方法,工作表可以.name
----------------------------結果:
魔降風云變人名單
4、拷貝后直接修改文件內容:
import xlrd
import xlwtfromxlutils.copy import copy
# 打開想要更改的excel文件
old_excel= xlrd.open_workbook('mcw_test.xlsx', formatting_info=True)
# 將操作文件對象拷貝,變成可寫的workbook對象
new_excel=copy(old_excel)
# 獲得第一個sheet的對象
ws= new_excel.get_sheet(0)
# 寫入數據
ws.write(0, 0, '第一行,第一列')
ws.write(0, 1, '第一行,第二列')
ws.write(0, 2, '第一行,第三列')
ws.write(1, 0, '第二行,第一列')
ws.write(1, 1, '第二行,第二列')
ws.write(1, 2, '第二行,第三列')
# 另存為excel文件,并將文件命名,可以重新命名,應該也可以覆蓋掉
new_excel.save('new_mcw_test.xlsx')
5、讀取文件,根據標題行和姓名列獲取所有單元格索引坐標。
#我要修改小郭吹雪的愛好為喝水
#需求分析:我需要知道"小郭吹雪的行號"和“愛好”的列號。我要修改的內容就是行號和列號所對應的單元格。代碼修改就可以用行列索引
import xlrd
import xlwt
from xlutils.copy import copy
workbook = xlrd.open_workbook('mcw_test.xlsx') # 打開工作簿
Data_sheet = workbook.sheets()[0]
row1 = Data_sheet.row_values(0) #取出第一行
dic_col_s={str(i):row1[i] for i in range(0,len(row1))} #將第一行的每個元素加個序數標記,標記列表索引,讓列表索引和標題對應,由標題則可以從字典獲取列號,即列表索引+1,這里需要的是索引
col2=Data_sheet.col_values(1) #取出第二列,
dic_row_s={str(i):col2[i] for i in range(0,len(col2))} #將第二列的每個元素加個序數標記,標記為第二列的列表索引。讓名字和列表索引對應,就可以在字典中由名字得行號,即列表索引+1。這里需要的是這個索引
print(dic_row_s)
print(dic_col_s)
mtitle="愛好" #需要修改哪個標題
mname="小郭吹雪" #需要修改哪個人的
rindex="".join([i for i in dic_row_s if dic_row_s[i]==mname]) #獲取要修改的標題所在行的索引
cindex="".join([i for i in dic_col_s if dic_col_s[i]==mtitle]) #獲取要修改的那個人所在的列索引
print(rindex,cindex) #獲得要修改的單元格的行索引和列索引
------------------結果:
{'0': '姓名', '1': '小馬過河', '2': '小郭吹雪', '3': '櫻花小月'}
{'0': 'id', '1': '姓名', '2': '性別', '3': '愛好', '4': '畢業時間'}
2 3
#由上4、拷貝后直接修改文件內容可知。只要獲得行列索引,則可以將對應的單元格原值覆蓋掉,即為修改。這里根據要求獲得所需的行列索引
#漏洞分析:如果需要修改一個人的多個列值,那么是執行多次上述查找的代碼嗎?可以用裝飾器做個次數的傳參么?有時間研究.
可看下圖,由索引可知,我要修改的是第三行第四列,睡覺改為喝水。索引得出正確
6、4,5結合成標題6的內容。實現了對已有文件的某個單元格,與之同行的另一個單元格的修改
#------------------------------開始獲取需要修改的索引坐標-------------------------import xlrd
import xlwtfromxlutils.copy import copy
#------------------開始修改----------------------------# def recindex():
workbook= xlrd.open_workbook('mcw_test.xlsx') # 打開工作簿
Data_sheet= workbook.sheets()[0]
row1= Data_sheet.row_values(0) #取出第一行
dic_col_s={str(i):row1[i] for i in range(0,len(row1))} #將第一行的每個元素加個序數標記,標記列表索引,讓列表索引和標題對應,由標題則可以從字典獲取列號,即列表索引+1,這里需要的是索引
col2=Data_sheet.col_values(1) #取出第二列,
dic_row_s={str(i):col2[i] for i in range(0,len(col2))} #將第二列的每個元素加個序數標記,標記為第二列的列表索引。讓名字和列表索引對應,就可以在字典中由名字得行號,即列表索引+1。這里需要的是這個索引
mtitle="愛好"#需要修改哪個標題
mname="小郭吹雪"#需要修改哪個人的
rindex="".join([i for i in dic_row_s if dic_row_s[i]==mname]) #獲取要修改的標題所在行的索引
cindex="".join([i for i in dic_col_s if dic_col_s[i]==mtitle]) #獲取要修改的那個人所在的列索引
rindex=list(rindex)
rindex="".join(rindex)
rindex=int(rindex)
cindex=list(cindex)
cindex="".join(cindex)
cindex=int(cindex)
# print(rindex,cindex)
#returnrindex,cindex
# rindex,cindex=recindex()
# print(rindex,cindex) #獲得要修改的單元格的行索引和列索引
# rindex=2# cindex=3# 打開想要更改的excel文件
old_excel= xlrd.open_workbook('mcw_test.xlsx', formatting_info=True)
# 將操作文件對象拷貝,變成可寫的workbook對象
new_excel=copy(old_excel)
# 獲得第一個sheet的對象
ws= new_excel.get_sheet(0)
# 寫入數據
ws.write(rindex,cindex,'喝水') #修改第3行第4列
# 另存為excel文件,并將文件命名,可以重新命名,應該也可以覆蓋掉
new_excel.save('mcw_test.xlsx')
#------------------修改接收并保存---------------------
#上述代碼我想說的點。
1)一是我用了那個手動創建的文件做的Excel文件進行修改,但是報錯了。后來用了之前重寫過得文件就好了,即下面這個沒有漂亮格式的文件
2)而是我竟然遇到了一個問題,id查看xlrd讀文件接收的變量rindex和cindex一樣地址的,后面就不能對文件進行修改。于是我用列表轉化,再用int轉化,知道內存地址改變了才能不報錯的往下執行修改操作。思考,為啥xlrd讀出來的不能在下面進行格式化呢?xlrd似乎沒有打開然后關閉的方法
3)有時間把上面的寫成修改Excel的函數,
報錯信息:
Traceback (most recent call last):
File"C:\mcw\temp\xlrd_sty.py", line 25, in old_excel= xlrd.open_workbook('mcw_test.xlsx', formatting_info=True)
File"C:\mcw\venv\lib\site-packages\xlrd\__init__.py", line 138, inopen_workbook
ragged_rows=ragged_rows,
File"C:\mcw\venv\lib\site-packages\xlrd\xlsx.py", line 798, inopen_workbook_2007_xml
raise NotImplementedError("formatting_info=True not yet implemented")
NotImplementedError: formatting_info=True not yet implemented
7、(表格函數1:改)讀取單元格索引并修改單元格的兩個函數
import xlrdfromxlutils.copy import copy
fpath='mcw_test.xlsx'mname="小郭吹雪"mtitle="愛好"modifycontent="睡覺"def recindex(path,mname,mtitile):'''定位單元格,返回單元格行列索引供modify_cell函數使用
:param path: Excel文件路徑
:param mname: 要修改的名字
:param mtitile: 要修改的標題
:return: 單元格的行列索引號。rindex:行,cindex:列索引''' workbook =xlrd.open_workbook(path)
Data_sheet= workbook.sheets()[0]
row1= Data_sheet.row_values(0)
dic_col_s={str(i):row1[i] for i in range(0,len(row1))}
col2=Data_sheet.col_values(1)
dic_row_s={str(i):col2[i] for i in range(0,len(col2))}
rindex="".join([i for i in dic_row_s if dic_row_s[i]==mname])
cindex="".join([i for i in dic_col_s if dic_col_s[i]==mtitle])
rindex=int("".join(list(rindex)))
cindex=int("".join(list(cindex)))returnrindex,cindex
def modify_cell(path,rindex,cindex,modifycontent):"""修改文件指定單元格內容,由recindex函數返回值獲取rindex和cindex參數
:param path: 要修改的Excel文件路徑
:param rindex:recindex返回值元組第一個元素,行索引
:param cindex:recindex返回值元組第二個元素,列索引
:param modifycontent: 要修改的單元格新的內容
:return:""" old_excel = xlrd.open_workbook(path, formatting_info=True)
new_excel=copy(old_excel)
ws= new_excel.get_sheet(0)
ws.write(rindex,cindex, modifycontent)
new_excel.save(path)
val=recindex(fpath,mname,mtitle)
modify_cell(fpath,val[0],val[1],modifycontent)
8、(表格函數2:增)往工作表中追加多行數據
import xlrdfromxlutils.copy import copy
fpath='mcw_test.xlsx'valueli=[["3","明明如月","女","聽歌","2030.07.01"],
["4","志剛志強","男","學習","2019.07.01"],]
def write_excel_xls_append(path, value):
index=len(value) # 獲取需要寫入數據的行數
workbook=xlrd.open_workbook(path) # 打開工作簿
sheets=workbook.sheet_names() # 獲取工作簿中的所有表格
worksheet= workbook.sheet_by_name(sheets[0]) # 獲取工作簿中所有表格中的的第一個表格
rows_old=worksheet.nrows # 獲取表格中已存在的數據的行數
new_workbook=copy(workbook) # 將xlrd對象拷貝轉化為xlwt對象
new_worksheet= new_workbook.get_sheet(0) # 獲取轉化后工作簿中的第一個表格for i in range(0, index):for j in range(0, len(value[i])):
new_worksheet.write(i+rows_old, j, value[i][j]) # 追加寫入數據,注意是從i+rows_old行開始寫入
new_workbook.save(path) # 保存工作簿
print("xls/xlsx格式表格【追加】寫入數據成功!")
write_excel_xls_append(fpath,valueli)
刪除備注后的代碼:
import xlrdfromxlutils.copy import copy
fpath='mcw_test.xlsx'valueli=[["3","明明如月","女","聽歌","2030.07.01"],
["4","志剛志強","男","學習","2019.07.01"],]
def write_excel_xls_append(path, value):"""在excel第一個工作表中追加一行或多行數據
:param path: 要修改的Excel文件路徑
:param value: 要添加的內容,每行都是列表元素,如示例:[["3","明明如月","女","聽歌","2030.07.01"],
["4","志剛志強","男","學習","2019.07.01"],]""" index =len(value)
workbook=xlrd.open_workbook(path)
sheets=workbook.sheet_names()
worksheet= workbook.sheet_by_name(sheets[0])
rows_old=worksheet.nrows
new_workbook=copy(workbook)
new_worksheet= new_workbook.get_sheet(0)for i in range(0, index):for j in range(0, len(value[i])):
new_worksheet.write(i+rows_old, j, value[i][j])
new_workbook.save(path)
print("xls/xlsx格式表格【追加】寫入數據成功!")
write_excel_xls_append(fpath,valueli)
9、(表格函數3:查1)顯示文件的每行內容,制表符分隔每列
import xlrd
fpath="mcw_test.xlsx"def read_excel_xls(path):
workbook=xlrd.open_workbook(path) # 打開工作簿
sheets=workbook.sheet_names() # 獲取工作簿中的所有表格
worksheet= workbook.sheet_by_name(sheets[0]) # 獲取工作簿中所有表格中的的第一個表格for i in range(0, worksheet.nrows):for j in range(0, worksheet.ncols):
print(worksheet.cell_value(i, j),"\t", end="") # 逐行逐列讀取數據#分隔符加空格實現對其點的
print()
read_excel_xls(fpath)-----------------------------------結果:
id 姓名 性別 愛好 畢業時間2.0 小馬過河 男 跑步 2017.07.01
5.0 小郭吹雪 男 睡覺 2016.07.01
1.0 櫻花小月 女 吃飯 2018.07.01
3 明明如月 女 聽歌 2030.07.01
4 志剛志強 男 學習 2019.07.01
10、(表格函數4:查2)以列表形式顯示文件的每行內容
import xlrd
fpath="mcw_test.xlsx"def read_excel_xls(path):"""打印所有行的內容,每行內容以列表形式展示
:param path: 要查看的Excel文件路徑""" workbook =xlrd.open_workbook(path) # 打開工作簿
sheets=workbook.sheet_names() # 獲取工作簿中的所有表格
worksheet= workbook.sheet_by_name(sheets[0]) # 獲取工作簿中所有表格中的的第一個表格
rows= worksheet.row_values(0)for i in range(0, worksheet.nrows):
rows=worksheet.row_values(i) # 逐行逐列讀取數據#分隔符加空格實現對其點的
print(rows)
read_excel_xls(fpath)------------------------------------結果:
['id', '姓名', '性別', '愛好', '畢業時間']
[2.0, '小馬過河', '男', '跑步', '2017.07.01']
[5.0, '小郭吹雪', '男', '睡覺', '2016.07.01']
[1.0, '櫻花小月', '女', '吃飯', '2018.07.01']
['3', '明明如月', '女', '聽歌', '2030.07.01']
['4', '志剛志強', '男', '學習', '2019.07.01']
11、(表格函數5:建)新建表格并寫入數據
import xlwt
fpath='修仙學院人名單.xlsx'sheet_name="小馬過河工作表"valueli=[['id', '姓名', '性別', '愛好', '畢業時間'],
["3","明明如月","女","聽歌","2030.07.01"],
["4","志剛志強","男","學習","2019.07.01"],]
def write_excel_xls(path, sheet_name, value):
index=len(value) # 獲取需要寫入數據的行數
workbook=xlwt.Workbook() # 新建一個工作簿
sheet=workbook.add_sheet(sheet_name) # 在工作簿中新建一個表格for i in range(0, index):for j in range(0, len(value[i])):
sheet.write(i, j, value[i][j]) # 像表格中寫入數據(對應的行和列)
workbook.save(path) # 保存工作簿
print("xls/xlsx格式表格寫入數據成功!")
write_excel_xls(fpath,sheet_name,valueli)
12、(表格函數6:刪)未寫,待增添
參考:
1)https://www.jianshu.com/p/a8391a2b8c6c
2)https://blog.csdn.net/blog_user_zk/article/details/75334566
總結
以上是生活随笔為你收集整理的python的xlutils模块_xlutils模块使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉树外部节点_leetcode 102
- 下一篇: python mapreduce函数_M