workbook數據相關操作


訪問單個單元格

c = ws['A4'] #返回單元格A4,如果單元格不存在,則會自動創建
ws['A4'] = 4  #為單元格A4賦值為4
    
d = ws.cell(row=4, column=2, value=10)  #給單元格B4賦值為10

  當一個worksheet在內存中創建時,是不包含任何單元格的,只有當第一次訪問時才會被創建
  當通過cell()函數訪問大批量單元格時,這些單元格雖然沒有被賦值,但這些單元格卻已在內存中創建

for x in range(1,101):
    for y in range(1,101):
        ws.cell(row=x, column=y) #會在內存中創建100*100個單元格

 

訪問多個單元格

cell_range = ws['A1':'C2']  #訪問從A1到C2的所有單元格

colC = ws['C']  #訪問C列的所有單元格
col_range = ws['C:D']  #訪問C列和D列的所有單元格

row10 = ws[10]  #訪問第10行的所有單元格
row_range = ws[5:10]  #訪問第5行到第10行的所有單元格

#使用Worksheet.iter_rows()方法以行為單位,遍歷多個單元格
for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
    for cell in row:
        print(cell)
'''
輸出:
<Cell Sheet1.A1>
<Cell Sheet1.B1>
<Cell Sheet1.C1>
<Cell Sheet1.A2>
<Cell Sheet1.B2>
<Cell Sheet1.C2>
'''

#使用Worksheet.iter_cols()方法以列為單位,遍歷多個單元格
for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
    for cell in col:
        print(cell)
'''
輸出:
<Cell Sheet1.A1>
<Cell Sheet1.A2>
<Cell Sheet1.B1>
<Cell Sheet1.B2>
<Cell Sheet1.C1>
<Cell Sheet1.C2>
'''

  出於性能方面的考慮,Worksheet.iter_cols()在read-only模式下是不可用的
  我認為這可能是因為內存的大小是有限的,由於無法事先預估文件的大小,假如文件有一億行數據
  則iter_cols方法在以列為單位遍歷文件時,先遍歷第一列,可能遍歷到第一千萬行時,內存就已經不夠了

 

遍歷整個文件的所有行和列

可以遍歷整個worksheet中的數據

比如一個worksheet中數據,最大坐標跨度為,最大行數為999,最大列為AA,則遍歷的范圍將是A1:AA999

相當於在excel的worksheet中,進行ctrl+A的操作

ws['C9'] = 'hello world'
tuple(ws.rows) #獲取A1到C9的所有單元格,以行為單位
'''
輸出:
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
(<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
(<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
(<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
(<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
(<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
'''

tuple(ws.columns) #獲取A1到C9的所有單元格,以列為單位
'''
輸出:
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
<Cell Sheet.A4>,
<Cell Sheet.A5>,
<Cell Sheet.A6>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
<Cell Sheet.C2>,
<Cell Sheet.C3>,
<Cell Sheet.C4>,
<Cell Sheet.C5>,
<Cell Sheet.C6>,
<Cell Sheet.C7>,
<Cell Sheet.C8>,
<Cell Sheet.C9>))
'''

  出於性能方面的考慮,Worksheet.columns在read-only模式下是不可用的

 

單元格值處理
如果只想處理單元格的值,可使用屬性Worksheet.values,該屬性只返回單元格的值

#該方法僅遍歷單元格的值
for row in ws.values:
   for value in row:
     print(value) 

#Worksheet.iter_rows()和Worksheet.iter_cols()方法也可通過制定參數的方式只獲取單元格的值
for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
    print(row)
'''
輸出:
(None, None, None)
(None, None, None)
'''

 

數據存儲

c = ws['A4']
c.value = 'hello, world' #給單元格A4賦值

 

保存文件
使用save()函數是最簡單和最安全的方式

wb = Workbook()
wb.save('balances.xlsx')

注意:
  1) 該方式保存的文件會在沒有警告的情況下覆蓋原來的同名文件,因此要小心
  2) 文件的擴展名不一定非要xlsx,但是如果不是的話,可能會導致office打不開

 

保存成流

如果將文件保存成流,比如當使用Pyramid, Flask or Django等應用程序時,你可以簡單提供一個NamedTemporaryFile()函數

from tempfile import NamedTemporaryFile
from openpyxl import Workbook

wb = Workbook()
with NamedTemporaryFile() as tmp:
    wb.save(tmp.name)
    tmp.seek(0)
    stream = tmp.read()
    
#加載一個文檔,通過指定屬性template為True,就可將workbook保存成template 
wb = load_workbook('document.xlsx')
wb.template = True 
wb.save('document_template.xltx')

#加載一個模板文件,通過指定屬性template為False,就可將workbook保存成文檔
wb = load_workbook('document_template.xltx')
wb.template = False 
wb.save('document.xlsx', as_template=False)

  應該監視數據屬性和文檔擴展名,以便在模板中保存文檔,或者在文檔中保存模板,
  否則結果表引擎將無法打開文檔

  以下幾種情況會保存失敗

wb = load_workbook('document.xlsx')
wb.save('new_document.xlsm') #需保存成擴展名為xlsx,否則excel無法打開

wb = load_workbook('document.xlsm')
wb.save('new_document.xlsm') #需指定屬性keep_vba=True,否則excel無法打開

wb = load_workbook('document.xltm', keep_vba=True)
wb.save('new_document.xlsm') # 如果需要一個模板, 則需要指定擴展名為*.xltm

 

加載文件

同時也可以使用openpyxl.load_workbook()打開一個文件

from openpyxl import load_workbook #加載文件需要導入load_workbook類

wb2 = load_workbook('test.xlsx')
print(wb2.sheetnames)  #輸出:['Sheet2', 'New Title', 'Sheet1'],輸出該workbook的worksheet名字

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM