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方法在以列爲單位遍歷文件時,先遍歷第一列,可能遍歷到第一千萬行時,內存就已經不夠了spa

 

遍歷整個文件的全部行和列excel

能夠遍歷整個worksheet中的數據code

好比一個worksheet中數據,最大座標跨度爲,最大行數爲999,最大列爲AA,則遍歷的範圍將是A1:AA999blog

至關於在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,該屬性只返回單元格的值it

#該方法僅遍歷單元格的值
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名字
相關文章
相關標籤/搜索