xlutils模塊使用

 

 python經常使用模塊目錄html

 

一、xlutils 實現拷貝原文件

原表格:python

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有點數據也複製出來了,只是格式沒有複製過來:app

二、拷貝前獲取原工做簿信息

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> 魔降風雲變人名單

 

四、拷貝後直接修改文件內容:

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

 五、讀取文件,根據標題行和姓名列獲取全部單元格索引座標。

#我要修改小郭吹雪的愛好爲喝水
#需求分析:我須要知道"小郭吹雪的行號"和「愛好」的列號。我要修改的內容就是行號和列號所對應的單元格。代碼修改就能夠用行列索引
 
 
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,5結合成標題6的內容。實現了對已有文件的某個單元格,與之同行的另外一個單元格的修改

 
#------------------------------開始獲取須要修改的索引座標-------------------------
import xlrd
import xlwt
from xlutils.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)
    # return rindex,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')
# ------------------修改接收並保存---------------------

#上述代碼我想說的點。post

 1)一是我用了那個手動建立的文件作的Excel文件進行修改,可是報錯了。後來用了以前重寫過得文件就行了,即下面這個沒有漂亮格式的文件學習

 2)而是我居然遇到了一個問題,id查看xlrd讀文件接收的變量rindex和cindex同樣地址的,後面就不能對文件進行修改。因而我用列表轉化,再用int轉化,知道內存地址改變了才能不報錯的往下執行修改操做。思考,爲啥xlrd讀出來的不能在下面進行格式化呢?xlrd彷佛沒有打開而後關閉的方法spa

3)有時間把上面的寫成修改Excel的函數,.net

報錯信息:
Traceback (most recent call last):
  File "C:\mcw\temp\xlrd_sty.py", line 25, in <module>
    old_excel = xlrd.open_workbook('mcw_test.xlsx', formatting_info=True)
  File "C:\mcw\venv\lib\site-packages\xlrd\__init__.py", line 138, in open_workbook
    ragged_rows=ragged_rows,
  File "C:\mcw\venv\lib\site-packages\xlrd\xlsx.py", line 798, in open_workbook_2007_xml
    raise NotImplementedError("formatting_info=True not yet implemented")
NotImplementedError: formatting_info=True not yet implemented

 七、(表格函數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:增)往工做表中追加多行數據

import xlrd
from xlutils.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)

 刪除備註後的代碼:excel

import xlrd
from xlutils.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)

 九、(表格函數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:查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:建)新建表格並寫入數據

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)

十二、(表格函數6:刪)未寫,待增添







 參考:code

1)https://www.jianshu.com/p/a8391a2b8c6c2)https://blog.csdn.net/blog_user_zk/article/details/75334566

相關文章
相關標籤/搜索