Python第三方庫之openpyxl(2)


Python第三方庫之openpyxl(2)

簡單的使用

寫一個工作簿

>>> from openpyxl import Workbook
>>> from openpyxl.compat import range
>>> from openpyxl.utils import get_column_letter
>>>
>>> wb = Workbook()
>>>
>>> dest_filename = 'empty_book.xlsx'
>>>
>>> ws1 = wb.active
>>> ws1.title = "range names"
>>>
>>> for row in range(1, 40):
...     ws1.append(range(600))
>>>
>>> ws2 = wb.create_sheet(title="Pi")
>>>
>>> ws2['F5'] = 3.14
>>>
>>> ws3 = wb.create_sheet(title="Data")
>>> for row in range(10, 20):
...     for col in range(27, 54):
...         _ = ws3.cell(column=col, row=row, value="{0}".format(get_column_letter(col)))
>>> print(ws3['AA10'].value)
AA
>>> wb.save(filename = dest_filename)
View Code

讀一個現有的工作簿

>>> from openpyxl import load_workbook
>>> wb = load_workbook(filename = 'empty_book.xlsx')
>>> sheet_ranges = wb['range names']
>>> print(sheet_ranges['D18'].value)
3

注意:在loadworkbook中有幾個可以使用的標志

1.guess_types 在讀取單元時啟用或禁用(默認)類型推斷

2.data_only 控制帶有公式的單元格是否有公式(默認)或上次Excel讀取表的值

3.keep_vba 控制任何可視的基本元素是否被保留(默認)。如果它們被保存了它們仍然是不可編輯的

注意:openpyxl目前沒有在Excel文件中讀取所有可能的項目,因此如果打開並保存相同的名稱,那么圖像和圖表將從現有文件中丟失

使用數字格式

>>> import datetime
>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> # 使用Python datetime設置日期
>>> ws['A1'] = datetime.datetime(2010, 7, 21)
>>>
>>> ws['A1'].number_format
'yyyy-mm-dd h:mm:ss'
>>> # 您可以在具體情況下啟用類型推斷
>>> wb.guess_types = True
>>> # 使用字符串和%符號設置百分比
>>> ws['B1'] = '3.14%'
>>> wb.guess_types = False
>>> ws['B1'].value
0.031400000000000004
>>>
>>> ws['B1'].number_format
'0%'

使用公式

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> # 添加一個簡單的公式
>>> ws["A1"] = "=SUM(1, 1)"
>>> wb.save("formula.xlsx")

注意:你必須使用英文名作為一個函數,函數參數必須用逗號隔開,而不是其他的標點符號,比如分號

openpyxl從來沒有計算過公式但是可以檢查公式的名稱

>>> from openpyxl.utils import FORMULAE
>>> "HEX2DEC" in FORMULAE
True

合並/ 分割單元格

>>> from openpyxl.workbook import Workbook
>>>
>>> wb = Workbook()
>>> ws = wb.active
>>>
>>> ws.merge_cells('A2:D2')
>>> ws.unmerge_cells('A2:D2')
>>>
>>> # 相當於
>>> ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
>>> ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)

插入圖像

>>> from openpyxl import Workbook
>>> from openpyxl.drawing.image import Image
>>>
>>> wb = Workbook()
>>> ws = wb.active
>>> ws['A1'] = 'You should see three logos below'
>>> # 制作一個圖片
>>> img = Image('logo.png')
>>> # 在單元格旁邊添加工作表和錨
>>> ws.add_image(img, 'A1')
>>> wb.save('logo.xlsx')

折疊列

>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> ws = wb.create_sheet()
>>> ws.column_dimensions.group('A','D', hidden=True)
>>> wb.save('group.xlsx')

與pandas和NumPy一起工作

NumPy支持

openpyxl已經為NumPy類型的浮點數、整數和布爾型提供了支持。使用pandas的時間戳類型支持DateTimes

Working with Pandas Dataframes

openpyxl.utils.dataframe.dataframe_to_rows()函數提供了一個簡單的方式來處理Pandas Dataframes

from openpyxl.utils.dataframe import dataframe_to_rows
wb = Workbook()
ws = wb.active

for r in dataframe_to_rows(df, index=True, header=True):
    ws.append(r)

雖然pandas本身支持轉換為Excel,但這為客戶端代碼提供了額外的靈活性,包括將dataframes直接傳輸到文件的能力。

將一個dataframe轉換為高亮顯示標題和索引的工作表

wb = Workbook()
ws = wb.active

for r in dataframe_to_rows(df, index=True, header=True):
    ws.append(r)

for cell in ws['A'] + ws[1]:
    cell.style = 'Pandas'

wb.save("pandas_openpyxl.xlsx")

或者,如果你只想轉換數據你可以使用write-only模式

from openpyxl.cell.cell import WriteOnlyCell
wb = Workbook(write_only=True)
ws = wb.create_sheet()

cell = WriteOnlyCell(ws)
cell.style = 'Pandas'

 def format_first_row(row, cell):

    for c in row:
        cell.value = c
        yield cell

rows = dataframe_to_rows(df)
first_row = format_first_row(next(rows), cell)
ws.append(first_row)

for row in rows:
    row = list(row)
    cell.value = row[0]
    row[0] = cell
    ws.append(row)

wb.save("openpyxl_stream.xlsx")
View Code

這段代碼和標准的工作簿同樣適用

將工作表轉換為Dataframe

要將工作表轉換為Dataframe,您可以使用values屬性。如果工作表沒有標題或索引,這很容易

df = DataFrame(ws.values)

如果工作表確實有標題或索引,比如由pandas創建的,那么就需要做更多的工作

data = ws.values
cols = next(data)[1:]
data = list(data)
idx = [r[0] for r in data]
data = (islice(r, 1, None) for r in data)
df = DataFrame(data, index=idx, columns=cols)

 


免責聲明!

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



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