https://www.cnblogs.com/yangmingxianshen/p/9176461.html
在python中操作execl進行數據讀寫的時候,可以使用xlrd進行文件的讀取,使用xlwt將數據寫入execl中。
1.xlrd
xlwt用來讀取execl中的數據,常見的用法如下。
(1)打開execl文件並獲取所有的sheet
>>> import xlrd >>> workbook = xlrd.open_workbook(r'D:\Program Files\Notepad++\Student.xlsx') >>> print workbook.sheet_names() [u'Sheet1', u'Sheet2', u'Sheet3']
(2)根據下標獲取sheet名稱
>>> sheet2_name=workbook.sheet_names()[1] >>> print sheet2_name Sheet2
(3)根據sheet索引或者名稱獲取sheet內容,同時獲取sheet名稱、行數、列數
>>> sheet2 = workbook.sheet_by_index(1) >>> print sheet2.name,sheet2.nrows,sheet2.ncols Sheet2 6 5 >>> sheet2 = workbook.sheet_by_name('Sheet2') >>> print sheet2.name,sheet2.nrows,sheet2.ncols Sheet2 6 5
(4)根據sheet名稱獲取整行和整列的值
>>> sheet2 = workbook.sheet_by_name('Sheet2') >>> rows = sheet2.row_values(3) >>> cols = sheet2.col_values(2) >>> print rows [u'lisi2', 19.0, 41462.0, u'basketball', u'friend2'] #標紅部分為日期2013/7/7,實際卻顯示為浮點數。后面有描述如何糾正 >>> print cols [u'\u51fa\u751f\u65e5\u671f', 42129.0, 41796.0, 41462.0, 40941.0, u''] # 問題同上
(5)獲取指定單元格的內容
>>> print sheet2.cell(1,0).value.encode('utf-8') xiaoming2 >>> print sheet2.cell_value(1,0).encode('utf-8') xiaoming2 >>> print sheet2.row(1)[0].value.encode('utf-8') xiaoming2
(6)獲取單元格內容的數據類型
>>> print sheet2.cell(1,0).ctype #第2行第1列:xiaoming2 為string類型 1 >>> print sheet2.cell(1,1).ctype #第2行第2列:12 為number類型 2 >>> print sheet2.cell(1,2).ctype #第2行第3列:2015/5/5 為date類型 3
(7)獲取單元格內容為日期類型的方式
使用xlrd的xldate_as_tuple處理為date格式,先判斷表格的ctype=3時xlrd才能執行操作,如下:
>>> from datetime import datetime,date >>> sheet2.cell(1,2).ctype 3 >>> sheet2.cell(1,2).value 42129.0 >>> xlrd.xldate_as_tuple(sheet2.cell_value(1,2),workbook.datemode) (2015, 5, 5, 0, 0, 0) >>> date_value = xlrd.xldate_as_tuple(sheet2.cell_value(1,2),workbook.datemode) >>> date(*date_value[:3]) datetime.date(2015, 5, 5) >>> date(*date_value[:3]).strftime('%Y/%m/%d') '2015/05/05'
那么如果是在腳本中需要獲取並顯示單元格內容為日期類型的,可以先做一個判斷。判斷ctype是否等於3,如果等於3,則用時間格式處理:
if (sheet.cell(row,col).ctype == 3): date_value = xlrd.xldate_as_tuple(sheet.cell_value(row,col),book.datemode) date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
(8)獲取合並單元格的內容
>>> sheet2.cell(1,4).value #第4列的第2行和第3行是合並單元格 u'friend' >>> sheet2.cell(2,4).value u'' >>> sheet2.cell(5,1).value #第6行的第2和第3第4列是合並單元格,這里我們只獲取到第6行第2列的值而第3列第4列獲取的內容為空,如何處理? u'None' >>> sheet2.cell(5,2).value u'' >>> sheet2.cell(5,3).value u''
從實驗結果可以看出來,第6行的第2和第3第4列是合並單元格,但這里我們只獲取到第6行第2列的值而第3列第4列獲取的內容為空,理論上來說合並的
單元格內容應該是一樣的,但是現在只有合並的第一個單元格可以獲取到值,其他為空,如何處理? 再用一種更直觀的方式顯示
>>> sheet2.row_values(5) [u'zhaoliu2', u'None', u'', u'', u''] #標紅的部分為合並單元格 >>> sheet2.col_values(4) [u'\u5173\u7cfb', u'friend', u'', u'friend2', u'', u''] #標紅的部分為合並單元格,注意這里是兩個合並單元格
可以利用merged_cells方法進行處理,處理的方法是只能獲取合並單元格的第一個cell的行列索引,才能讀到值,讀錯了就是空值。即合並行單元格讀取
行的第一個索引,合並列單元格讀取列的第一個索引。這里,需要在讀取文件的時候添加個參數,將formatting_info參數設置為True,默認是False,否
則可能調用merged_cells方法獲取到的是空值。
>>> workbook = xlrd.open_workbook(r'D:\Program Files\Notepad++\Student.xlsx',formatting_info=True) >>> sheet2 = workbook.sheet_by_name('sheet2') >>> sheet2.merged_cells [(1, 3, 4, 5), (3, 5, 4, 5), (5, 6, 1, 5)]
merged_cells返回的這四個參數的含義是:(row,row_range,col,col_range),其中[row,row_range)包括row,不包括row_range,col也是一樣,下標從0開
始。即(1, 3, 4, 5)的含義是:第2到3行(不包括第4行)合並,(5, 6, 1, 5)的含義是:第2到5列合並。利用這個,可以分別獲取合並的三個單元格的內容:
>>> print sheet2.cell_value(1,4) #(1, 3, 4, 5) friend >>> print sheet2.cell_value(3,4) #(3, 5, 4, 5) friend2 >>> print sheet2.cell_value(5,1) #(5, 6, 1, 5) None
2.xlwt
xlwt用來往execl中寫入數據,功能還是比較豐富的。
先來看一個比較簡單的例子。
import xlwt # 創建一個workbook 設置編碼 workbook = xlwt.Workbook(encoding = 'utf-8') # 創建一個worksheet worksheet = workbook.add_sheet('My Worksheet') # 寫入excel # 參數對應 行, 列, 值 worksheet.write(1,0, label = 'this is test') # 保存 workbook.save('Excel_test.xls')
運行之后,就會在當前目錄之下生成一個叫做“Excel_test.xls”的文件。
當然你還可以做一些樣式上面的更改。
(1)設置字體的樣式
import xlwt workbook = xlwt.Workbook(encoding = 'ascii') worksheet = workbook.add_sheet('My Worksheet') style = xlwt.XFStyle() # 初始化樣式 font = xlwt.Font() # 為樣式創建字體 font.name = 'Times New Roman' font.bold = True # 黑體 font.underline = True # 下划線 font.italic = True # 斜體字 style.font = font # 設定樣式 worksheet.write(0, 0, 'Unformatted value') # 不帶樣式的寫入 worksheet.write(1, 0, 'Formatted value', style) # 帶樣式的寫入 workbook.save('formatting.xls') # 保存文件
(2)設置單元格寬度
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') worksheet.write(0, 0,'My Cell Contents') # 設置單元格寬度 worksheet.col(0).width = 3333 workbook.save('cell_width.xls')
(3)輸出一個日期到單元格
import xlwt import datetime workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') style = xlwt.XFStyle() #設置日期的格式 style.num_format_str = 'M/D/YY' # Other options: D-MMM-YY, D-MMM, MMM-YY, h:mm, h:mm:ss, h:mm, h:mm:ss, M/D/YY h:mm, mm:ss, [h]:mm:ss, mm:ss.0 worksheet.write(0, 0, datetime.datetime.now(), style) workbook.save('Excel_Workbook.xls')
(4)向單元格添加一個公式
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') worksheet.write(0, 0, 5) # Outputs 5 worksheet.write(0, 1, 2) # Outputs 2 worksheet.write(1, 0, xlwt.Formula('A1*B1')) # Should output "10" (A1[5] * A2[2]) worksheet.write(1, 1, xlwt.Formula('SUM(A1,B1)')) # Should output "7" (A1[5] + A2[2]) workbook.save('Excel_Workbook.xls')
(5)向單元格添加一個超鏈接
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') worksheet.write(0, 0, xlwt.Formula('HYPERLINK("http://www.google.com";"Google")')) # Outputs the text "Google" linking to http://www.google.com workbook.save('Excel_Workbook.xls')
(6)合並列和行
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') worksheet.write_merge(0, 0, 0, 3, 'First Merge') # Merges row 0's columns 0 through 3. 合並第一行的0到3列 font = xlwt.Font() # Create Font #創建一個樣式 font.bold = True # Set font to Bold style = xlwt.XFStyle() # Create Style style.font = font # Add Bold Font to Style worksheet.write_merge(1, 2, 0, 3, 'Second Merge', style) # 合並1到2行的0列到3列 workbook.save('Excel_Workbook.xls')
(7)設置單元格內容的對齊方式
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') alignment = xlwt.Alignment() # Create Alignment alignment.horz = xlwt.Alignment.HORZ_CENTER # May be: HORZ_GENERAL, HORZ_LEFT, HORZ_CENTER, HORZ_RIGHT, HORZ_FILLED, HORZ_JUSTIFIED, HORZ_CENTER_ACROSS_SEL, HORZ_DISTRIBUTED alignment.vert = xlwt.Alignment.VERT_CENTER # May be: VERT_TOP, VERT_CENTER, VERT_BOTTOM, VERT_JUSTIFIED, VERT_DISTRIBUTED style = xlwt.XFStyle() # Create Style style.alignment = alignment # Add Alignment to Style worksheet.write(0, 0, 'Cell Contents', style) workbook.save('Excel_Workbook.xls')
(8)為單元格添加邊框
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') borders = xlwt.Borders() # Create Borders borders.left = xlwt.Borders.DASHED DASHED虛線 NO_LINE沒有 THIN實線 # May be: NO_LINE, THIN, MEDIUM, DASHED, DOTTED, THICK, DOUBLE, HAIR, MEDIUM_DASHED, THIN_DASH_DOTTED, MEDIUM_DASH_DOTTED, THIN_DASH_DOT_DOTTED, MEDIUM_DASH_DOT_DOTTED, SLANTED_MEDIUM_DASH_DOTTED, or 0x00 through 0x0D. borders.right = xlwt.Borders.DASHED borders.top = xlwt.Borders.DASHED borders.bottom = xlwt.Borders.DASHED borders.left_colour = 0x40 borders.right_colour = 0x40 borders.top_colour = 0x40 borders.bottom_colour = 0x40 style = xlwt.XFStyle() # Create Style style.borders = borders # Add Borders to Style worksheet.write(0, 0, 'Cell Contents', style) workbook.save('Excel_Workbook.xls')
(9)為單元格設置背景色
import xlwt workbook = xlwt.Workbook() worksheet = workbook.add_sheet('My Sheet') pattern = xlwt.Pattern() # Create the Pattern pattern.pattern = xlwt.Pattern.SOLID_PATTERN # May be: NO_PATTERN, SOLID_PATTERN, or 0x00 through 0x12 pattern.pattern_fore_colour = 5 # May be: 8 through 63. 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow , almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray, the list goes on... style = xlwt.XFStyle() # Create the Pattern style.pattern = pattern # Add Pattern to Style worksheet.write(0, 0, 'Cell Contents', style) workbook.save('Excel_Workbook.xls')