幹貨--Excel的表格數據的一般處理和常用python模塊。
寫在前面:
本文章的主要目的在於:
- 介紹了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")
其中還有一個重要參數:formatting_info,該參數默認為False,當打開時會保留xls文件的格式和樣式信息。在row_values中有體現。在xlutils中用的更多。
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)
其他的打開方式
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)]
這裏詭異的是:其中的數字表示的以文件左上角為0,0的坐標上的數值。使用需註意。
最後:xlrd比較古老,本來只支持xls格式的Excel文件,現在也能讀取xlsx文件的數據,但是不能使用formatting_info功能。
寫入模塊: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文件需要的參數上面不是很多,但是往往在樣式設計上要求較高。
內容居中:
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模塊用的較少,掌握不多,不敢多寫。
幹貨--Excel的表格數據的一般處理和常用python模塊。