小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

OpenPyXl的使用

 達(dá)坂城大豆 2017-12-09


在剛開始使用openpyxl的時(shí)候,不需要直接在文件系統(tǒng)中創(chuàng)建一個(gè)文件,僅僅需要導(dǎo)入Workbook類并開始使用它:

>>> from openpyxl import Workbook>>> wb = Workbook()

一個(gè)workbook總是會創(chuàng)建至少一個(gè)worksheet(工作表),可以通過openpyxl.workbook.Workbook.active()這個(gè)屬性去獲?。?/p>

>>> ws = wb.active

這個(gè)函數(shù)使用_active_sheet_index這個(gè)屬性,默認(rèn)設(shè)置的值是0,除非你指定一個(gè)值,否則總是獲取到第一個(gè)worksheet。

你可以使用openpyxl.workbook.Workbook.create_sheet()來創(chuàng)建一個(gè)新的worksheet:

>>> ws1 = wb.create_sheet('Mysheet') # insert at the end (default)# or>>> ws2 = wb.create_sheet('Mysheet', 0) # insert at first position

當(dāng)創(chuàng)建腳標(biāo)的時(shí)候會自動創(chuàng)建一個(gè)名字,按照(Sheet, Sheet1, Sheet2, ...)這個(gè)列表名創(chuàng)建,你可以使用tiitle屬性來修改這個(gè)名字:

>>> ws.title = 'New Title'

一旦給了一個(gè)worksheet名字,就可以通過一個(gè)key去獲取這個(gè)worksheet:

>>> ws3 = wb['New Title']

你可以使用openpyxl.workbook.Workbook.sheetnames()這個(gè)屬性獲取所有的腳標(biāo)的名字:

>>> print(wb.sheetnames)['Sheet2', 'New Title', 'Sheet1']

可以迭代所有的腳標(biāo):

>>> for sheet in wb:... print(sheet.title)

可以使用openpyxl.workbook.Workbook.copy_worksheet()這個(gè)屬性復(fù)制一個(gè)worksheet:

>>> source = wb.active>>> target = wb.copy_worksheet(source)

注意:只有cells 和 styles能夠被復(fù)制,不能在workbooks之間復(fù)制worksheets,你可以在一個(gè)workbook中復(fù)制worksheets

玩數(shù)據(jù)

獲取一個(gè)cell

現(xiàn)在我們已經(jīng)知道怎么訪問一個(gè)worksheet,我們可以開始修改cell的內(nèi)容了。(一個(gè)cell就是一個(gè)單元格)
cell可以直接通過key來獲?。?/p>

>>> c = ws['A4']

這將會返回一個(gè)cell或創(chuàng)建一個(gè)不存在的cell。cell 的值可以直接被賦值:

>>> ws['A4'] = 4

也可以使用另外一個(gè)方法openpyxl.worksheet.Worksheet.cell():

>>> d = ws.cell(row=4, column=2, value=10)

Note:當(dāng)在內(nèi)存當(dāng)中創(chuàng)建一個(gè)worksheet的時(shí)候,它沒有包含任何cell,當(dāng)它們第一次被訪問的時(shí)候被創(chuàng)建

Warning:因?yàn)閑xcel表的滾動特性,滾動出來的cell也會被創(chuàng)建出來,即使沒有訪問那些cell,例如:

>>> for i in range(1,101):... for j in range(1,101):... ws.cell(row=i, column=j)

這將會創(chuàng)建100*100個(gè)空的cell

訪問多個(gè)cell

使用切片可以訪問多個(gè)cell

>>> cell_range = ws['A1':'C2']

行和列能夠被輕松的獲取到:

>>> colC = ws['C']>>> col_range = ws['C:D']>>> row10 = ws[10]>>> row_range = ws[5:10]

也可以使用openpyxl.worksheet.Worksheet.iter_rows()這個(gè)方法:

>>> for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):... for cell in row:... print(cell)

相似的方法openpyxl.worksheet.Worksheet.iter_cols()也可以:

>>> for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):... for cell in col:... print(cell)

如果你想迭代一個(gè)文件的所有行或列,可以使用openpyxl.worksheet.Worksheet.rows()這個(gè)屬性:

>>> ws = wb.active>>> ws['C9'] = 'hello world'>>> tuple(ws.rows)((, , ),(, , ),(, , ),(, , ),(, , ),(, , ),(, , ),(, , ),(, , ))

或者openpyxl.worksheet.Worksheet.columns()這個(gè)屬性:

>>> tuple(ws.columns)((,,,,,,...,,),(,,,,,,,,))

數(shù)據(jù)存儲

一旦我們有了一個(gè)openpyxl.cell.Cell,我們就可以給它賦值:

>>> c.value = 'hello, world'>>> print(c.value)'hello, world'>>> d.value = 3.14>>> print(d.value)3.14

也能使用類型和格式推斷:

>>> wb = Workbook(guess_types=True)>>> c.value = '12%'>>> print(c.value)0.12>>> import datetime>>> d.value = datetime.datetime.now()>>> print d.valuedatetime.datetime(2010, 9, 10, 22, 25, 18)>>> c.value = '31.50'>>> print(c.value)31.5
保存到文件

最簡單和快速的保存一個(gè)workbook方法是使用openpyxl.workbook.Workbook模塊的openpyxl.workbook.Workbook.save()這個(gè)方法:

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

Warning:這個(gè)方法將會在沒有警告提示下覆蓋已經(jīng)有的內(nèi)容
可以使用template=True將一個(gè)workbook保存成一個(gè)模版:

>>> wb = load_workbook('document.xlsx')>>> wb.template = True>>> wb.save('document_template.xltx')

或者設(shè)置這個(gè)屬性為false(默認(rèn))來保存為一個(gè)文件:

>>> wb = load_workbook('document_template.xltx')>>> wb.template = False>>> wb.save('document.xlsx', as_template=False)

*Warning:當(dāng)保存文檔的時(shí)候在模版文檔中你應(yīng)該注意文檔的擴(kuò)展名(后綴名)和數(shù)據(jù)描述,否則可能會導(dǎo)致文檔不能被再次打開,如下錯誤式例:

>>> wb = load_workbook('document.xlsx')>>> # 應(yīng)該保存成擴(kuò)展名為*.xlsx>>> wb.save('new_document.xlsm')>>> # Excel軟件不能再次打開此文件>>>>>> # 或者>>>>>> # 應(yīng)該指定屬性keep_vba=True>>> wb = load_workbook('document.xlsm')>>> wb.save('new_document.xlsm')>>> # Excel軟件不能再次打開此文件>>>>>> # 或者>>>>>> wb = load_workbook('document.xltm', keep_vba=True)>>> # 如果我們需要一個(gè)模版文件,就必須指定擴(kuò)展名為 *.xltm.>>> wb.save('new_document.xlsm')>>> # Excel軟件不能再次打開此文件

加載一個(gè)文件

類似于寫文件,可以導(dǎo)入openpyxl.load_workbook()來打開一個(gè)已經(jīng)存在的workbook:

>>> from openpyxl import load_workbook>>> wb2 = load_workbook('test.xlsx')>>> print wb2.get_sheet_names()['Sheet2', 'New Title', 'Sheet1']

基本教程已經(jīng)完了。接下來是一些使用例子:


寫一個(gè)workbook

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

讀取一個(gè)已經(jīng)存在的文件

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

警告:openpyxl不能讀取Excle中所有的對象,當(dāng)打開和保存相同名字的文件的時(shí)候,圖片和圖表將會丟失

使用數(shù)字格式:

>>> import datetime>>> from openpyxl import Workbook>>> wb = Workbook()>>> ws = wb.active>>> # set date using a Python datetime>>> ws['A1'] = datetime.datetime(2010, 7, 21)>>>>>> ws['A1'].number_format'yyyy-mm-dd h:mm:ss'>>> # You can enable type inference on a case-by-case basis>>> wb.guess_types = True>>> # set percentage using a string followed by the percent sign>>> ws['B1'] = '3.14%'>>> wb.guess_types = False>>> ws['B1'].value0.031400000000000004>>>>>> ws['B1'].number_format'0%'

使用公式:

>>> from openpyxl import Workbook>>> wb = Workbook()>>> ws = wb.active>>> # add a simple formula>>> ws['A1'] = '=SUM(1, 1)'>>> wb.save('formula.xlsx')

警告:公式必須使用英文名,并且公式的參數(shù)必須使用逗號分隔,不能使用其他的符號如分號

openpyxl從不評估公式,但是可以檢查公式的名字:

>>> from openpyxl.utils import FORMULAE>>> 'HEX2DEC' in FORMULAETrue

如果你想使用一個(gè)不知道的公式,這可能是因?yàn)槟闶褂玫墓剑瑳]有包括在初始規(guī)范。 這樣的公式必須以xlfn作為前綴。

合并/取消合并單元格:

>>> from openpyxl.workbook import Workbook>>>>>> wb = Workbook()>>> ws = wb.active>>>>>> ws.merge_cells('A1:B1')>>> ws.unmerge_cells('A1:B1')>>>>>> # or>>> ws.merge_cells(start_row=2,start_column=1,end_row=2,end_column=4)>>> ws.unmerge_cells(start_row=2,start_column=1,end_row=2,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'>>> # create an image>>> img = Image('logo.png')>>> # add to worksheet and anchor next to cells>>> 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

openpyxl可以配合使用PandasNumPy這兩個(gè)很受歡迎的庫

NumPy Support
openpyxl已內(nèi)置支持NumPy類型float,integer和boolean。 DateTimes支持使用Pandas的時(shí)間戳類型。

openpyxl.utils.dataframe.dataframe_to_rows()方法提供簡單的方式使用Pandas 的Dataframes:

from openpyxl import Workbookfrom openpyxl.utils.dataframe import dataframe_to_rowswb = Workbook()ws = wb.activefor r in dataframe_to_rows(df, index=True, header=True): ws.append(r)

要將數(shù)據(jù)框轉(zhuǎn)換為突出顯示的標(biāo)題和索引:

wb = Workbook()ws = wb.activefor 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')

如果你只是想轉(zhuǎn)換數(shù)據(jù),可以使用只寫模式:

from openpyxl.cell.cell import WriteOnlyCellwb = 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 cellrows = 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')

將工作表轉(zhuǎn)換為Dataframe

要將工作表轉(zhuǎn)換為Dataframe,您可以使用values屬性。 如果工作表沒有標(biāo)題或索引,這很容易:

df = DataFrame(ws.values)

如果工作表有標(biāo)題或索引,例如Pandas創(chuàng)建的那個(gè),那么需要做更多的工作:

data = ws.valuescols = 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)

使用過濾和排序

要添加過濾器,請定義范圍,然后添加列和排序條件:

from openpyxl import Workbookwb = Workbook()ws = wb.activedata = [ ['Fruit', 'Quantity'], ['Kiwi', 3], ['Grape', 15], ['Apple', 3], ['Peach', 3], ['Pomegranate', 3], ['Pear', 3], ['Tangerine', 3], ['Blueberry', 3], ['Mango', 3], ['Watermelon', 3], ['Blackberry', 3], ['Orange', 3], ['Raspberry', 3], ['Banana', 3]]for r in data: ws.append(r)ws.auto_filter.ref = 'A1:B15'ws.auto_filter.add_filter_column(0, ['Kiwi', 'Apple', 'Mango'])ws.auto_filter.add_sort_condition('B2:B15')wb.save('filtered.xlsx')

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多