乾貨--Excel的表格數據的通常處理和經常使用python模塊。

寫在前面:

本文章的主要目的在於:html

  • 介紹了python經常使用的Excel處理模塊:xlwt,xlrd,xllutils,openpyxl,pywin32的使用和應用場景。
  • 本文只針對於Excel表中經常使用的表格數據的處理,其餘複雜操做如公式,柱狀圖等其餘數據沒有涉及。
  • 大佬的肩膀:http://www.gocalf.com/blog/python-read-write-excel.html#excel

讀取模塊1:xlrd

官方quick start(急於求成有時候頗有用)

import xlrd
book = xlrd.open_workbook("myfile.xls")                                            # 打開文件
print("The number of worksheets is {0}".format(book.nsheets))         # nsheets 是Excel中有多少個sheet
print("Worksheet name(s): {0}".format(book.sheet_names()))            # sheets的名字
sh = book.sheet_by_index(0)                                                             # 拿到第一個sheet ** 注意xlrd中開始都是從0
print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))                    # 本sheet的名字,行數,列數
print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))        # d30單元格中的值
for rx in range(sh.nrows):                
    print(sh.row(rx))                                                                            # 遍歷每一行,打印每個值。每一個row是一個列表

 

詳細參數和功能

wb = xlrd.open_workbook("myfile.xls")        python

其中還有一個重要參數:formatting_info,該參數默認爲False,當打開時會保留xls文件的格式和樣式信息。在row_values中有體現。在xlutils中用的更多。api

file_contents:第二種打開方式。顧名思義是文件的二進制流,最大的用處在於服務端接收到文件後無需轉存直接進行讀取操做。例子:函數

wb = xlrd.open_workbook(file_contents=f.read(), formatting_info=True)                                 # f是打開的文件句柄
wb = xlrd.open_workbook(file_contents=request.FILE.get('file', ''), formatting_info=True)      # 模擬視圖函數字體

sh = book.sheet_by_index(0)ui

其餘的打開方式

ws = wb.get_sheet(0)
ws = wb.sheet_by_name('sheet1')
ws = wb.get_sheets()[0]
ws = wb._sheet_list[0]               # 當以file_content方式打開上邊的方式都會報錯,由於已經把全部sheets load進來了。
ws.row_values(row_num)         #另外一個經常使用的遍歷方式,得到某一行的單元格數據。

ws.merged_cells

merged_cells是一個列表來展現全部被合併的單元格。好比:[(0, 1, 0, 3), (1, 2, 0, 3)]spa

這裏詭異的是:其中的數字表示的以文件左上角爲0,0的座標上的數值。使用需注意。設計

最後:xlrd比較古老,原本只支持xls格式的Excel文件,如今也能讀取xlsx文件的數據,可是不能使用formatting_info功能。excel

寫入模塊:xlwt

 quick start

import xlwt
wb = xlwt.Workbook()                                    
ws = wb.add_sheet('sheet1')                                   # sheet1 是第一個sheet的名稱
ws.write(0, 0, 'test', style1)                                       # 在第0行的第0列寫入  其中的style1是下面介紹的樣式
ws.write_merge(1, 2, 0, 25, u'合併單元格', style1)   # 將第一行中的25列個單元格合併寫入
wb.save('test2.xls')
# wb.save('test.xlsx')                                                 # 能夠生成xlsx文件

樣式設計

寫一個Excel文件須要的參數上面不是不少,可是每每在樣式設計上要求較高。code

內容居中:

alignment = xlwt.Alignment()                                      # 初始化一個居中對象
alignment.horz = xlwt.Alignment.HORZ_CENTER    # 水平和左右的居中
alignment.vert = xlwt.Alignment.VERT_CENTER

邊框:

borders = xlwt.Borders()
borders.left = 1                                                         # 邊框的寬度
borders.right = 1
borders.top = 1
borders.bottom = 1
borders.bottom_colour = 0x3A                                 # 具體的顏色設計可百度255中顏色的十六進制的表示

單元格底色:

pattern = xlwt.Pattern()
pattern.pattern = Pattern.SOLID_PATTERN            # 設置其模式爲實型
pattern.pattern_fore_colour = 22                              # 這裏的22位灰

字體

fn1 = xlwt.Font()
fn1.bold = False                                                        # 加粗
fn1.name = u'宋體'                                                    # 字體
fn1.height = 280                                                        # 大小  字體的大小會影響到行高


單元格大小設置

hang1 = ws.col(0)                                                      # 拿到一列並設置寬度
hang1.width = 256 * 20
tall_style = xlwt.easyxf('font:height 400;')

hang_sale = ws.row(0)                                              # 拿到一行設置高度
hang_sale.set_style(tall_style)

合成style

將上述的樣式封裝成一個style。

style1 = xlwt.XFStyle()

style1.font = fn1                                                         # 同理其餘的樣式以這種方式設置

修改模塊:xlutils

在Excel表格的模塊中本質上都不支持的Excel的直接修改,都是先讀取後寫入的形式來實現。故在修改的過程當中會出現諸多的bug,好比樣式的丟失。

from xlutils.copy import copy
rb = open_workbook('test.xls)
wb = copy(rb)

以後的操做便於xlwt別無差異了。可是在修改的時候通常都不想主動的修改Excel的樣式。這裏,xlrd中的formatting_info參數便很關鍵了。即便如此,在個人實踐中仍存在某些單元格的邊框的樣式自動丟失的狀況,有待解決!

總結:上述的三兄弟是比較經常使用的Excel處理模塊,如果沒有過高的需求通常足夠用了。可是這三兄弟目前只是更加針對xls文件,其實在格式轉化xlsx文件的時候無能爲力。要是遇到像xlsx文件的修改等需求的時候,xlutils會將xlsx源文件輸出成爲沒有任何格式的xlsx文件。因此下面介紹openpyxl模塊是隻使用於xlsx。(xls讀都讀不了)

xlsx模塊openpyxl

book = openpyxl.load_workbook('2.xlsx')
ws = book.worksheets[0]
aa = ws.rows
print next(aa)[0].value                             # 也能夠用等於進行設置值
book.save('test.xlsx')

openpyxl的用法大體和xl三兄弟一致,可是在功能上要多一些,因此效率上要差一些。在只進行讀取操做的時候能夠加上read_only的參數。

pywin32模塊

如開頭連接給出的對比同樣,功能最完善的天然是Windows的api了。畢竟這個東西就是人家出的。可是缺點也是最明顯的:

1.沒法跨平臺,只適用Windows系統,還得有Excel程序。

2.過程當中佔用Excel程序,不注意會形成和wps等程序的衝突。

3.十分緩慢

from win32com.client import Dispatch, DispatchEx
xlApp = Dispatch('Excel.Application')                    # 會在打開Excel的基礎上進行,沒有就打開
xlBook = xlApp.Workbooks.Open(r'C:\Users\PycharmProjects\windOFapi\1242.xlsx', )       # 這裏要寫全路徑,不然加載到Windows系統中報錯
sht = xlBook.Worksheets('sheet1')
req = sht.Cells(4, 3).value
print req

下面的兩個openpyxl和pywin32模塊用的較少,掌握很少,不敢多寫。

相關文章
相關標籤/搜索