一、python之xlutils的Copy模塊
xlrd庫僅用於讀取excel文件中的數據;
xlwt庫則用於將數據寫入excel文件;
但是對於已有的excel文件,想要追加或者修改,即編輯功能的時候,這兩個庫則沒有辦法完成。
xlutils庫也僅僅是通過復制一個副本進行操作后保存一個新文件,xlutils庫就像是xlrd庫和xlwt庫之間的一座橋梁,因此,xlutils庫是依賴於xlrd和xlwt兩個庫的。這三個庫既能滿足操作Excel的基本需求,當然大數據分析還是需要pandas庫。
xlutils模塊的功能是作為xlrd和xlwt的橋梁,解決了xlrd中book對象無法編輯的問題。通過copy模塊將xlrd.Book對象轉換為xlwt.Workbook對象,從而實現了原始excel文件的編輯功能。
1、xlutils 實現拷貝原文件
import xlrd from xlutils.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'] 魔降風雲變人名單 <xlrd.sheet.Sheet object at 0x029EC7F0> 4
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 ----------------------------結果: <xlwt.Worksheet.Worksheet object at 0x02A18CB0> <xlwt.Workbook.Workbook object at 0x02A18AF0> 魔降風雲變人名單
4、拷貝后直接修改文件內容:
import xlrd import xlwt from xlutils.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、實際應用
1)(表格函數1:改)讀取單元格索引並修改單元格的兩個函數
import xlrd from xlutils.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))) return rindex,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)
2)(表格函數2:增)往工作表中追加多行數據
import xlrd from xlutils.copy import copy fpath='mcw_test.xlsx' value=[["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)
3)(表格函數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
4)(表格函數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']
5)(表格函數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)