1. 程式人生 > >Python讀寫EXCEL檔案常用方法大全

Python讀寫EXCEL檔案常用方法大全

##前言 python讀寫excel的方式有很多,不同的模組在讀寫的講法上稍有區別,這裡我主要介紹幾個常用的方式。 * 用xlrd和xlwt進行excel讀寫; * 用openpyxl進行excel讀寫; * 用pandas進行excel讀寫; 參考: https://www.python-excel.org/ https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html#pandas.read_excel https://www.jianshu.com/p/19219542bf23 ##資料準備 為了方便演示,我這裡新建了一個data.xls和data.xlsx檔案,第一個工作表sheet1區域“A1:E5”的內容如下,用於測試讀寫excel的程式碼: ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201218143436193-1221406152.png) ##xlrd和xlwt xlrd是一個庫,用於從Excel檔案中以.xls格式讀取資料和格式化資訊 xlwt是一個庫,用於將資料和格式化資訊寫入較舊的Excel檔案(例如:.xls)。 ###示例 ``` pip install xlrd pip install xlwt ``` ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201218143943275-1583030811.png) 我們開始來讀取檔案的內容 ``` import xlrd import os file_path = os.path.dirname(os.path.abspath(__file__)) base_path = os.path.join(file_path, 'data.xlsx') book = xlrd.open_workbook(base_path) sheet1 = book.sheets()[0] nrows = sheet1.nrows print('表格總行數', nrows) ncols = sheet1.ncols print('表格總列數', ncols) row3_values = sheet1.row_values(2) print('第3行值', row3_values) col3_values = sheet1.col_values(2) print('第3列值', col3_values) cell_3_3 = sheet1.cell(2, 2).value print('第3行第3列的單元格的值:', cell_3_3) ``` ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201218205354003-1752928566.png) 接下來我們來進行寫入,寫入可以進行的操作太多了,我這裡只列舉了常用的的操作。 ``` import xlwt import datetime # 建立一個workbook 設定編碼 workbook = xlwt.Workbook(encoding='utf-8') # 建立一個worksheet worksheet = workbook.add_sheet('Worksheet') # 寫入excel引數對應 行, 列, 值 worksheet.write(0, 0, label='測試') # 設定單元格寬度 worksheet.col(0).width = 3333 # 設定單元格高度 tall_style = xlwt.easyxf('font:height 520;') worksheet.row(0).set_style(tall_style) # 設定對齊方式 alignment = xlwt.Alignment() # Create Alignment # May be: HORZ_GENERAL, HORZ_LEFT, HORZ_CENTER, HORZ_RIGHT, HORZ_FILLED, HORZ_JUSTIFIED, HORZ_CENTER_ACROSS_SEL, HORZ_DISTRIBUTED alignment.horz = xlwt.Alignment.HORZ_CENTER # May be: VERT_TOP, VERT_CENTER, VERT_BOTTOM, VERT_JUSTIFIED, VERT_DISTRIBUTED alignment.vert = xlwt.Alignment.VERT_CENTER style = xlwt.XFStyle() # Create Style style.alignment = alignment # Add Alignment to Style worksheet.write(2, 0, '居中', style) # 寫入帶顏色背景的資料 pattern = xlwt.Pattern() # Create the Pattern # May be: NO_PATTERN, SOLID_PATTERN, or 0x00 through 0x12 pattern.pattern = xlwt.Pattern.SOLID_PATTERN 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, 1, '顏色', style) # 寫入日期 style = xlwt.XFStyle() # 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 style.num_format_str = 'M/D/YY' worksheet.write(0, 2, datetime.datetime.now(), style) # 寫入公式 worksheet.write(0, 3, 5) # Outputs 5 worksheet.write(0, 4, 2) # Outputs 2 # Should output "10" (A1[5] * A2[2]) worksheet.write(1, 3, xlwt.Formula('D1*E1')) # Should output "7" (A1[5] + A2[2]) worksheet.write(1, 4, xlwt.Formula('SUM(D1,E1)')) # 寫入超連結 worksheet.write(1, 0, xlwt.Formula('HYPERLINK("http://www.baidu.com";"百度一下")')) # 儲存 workbook.save('Excel_test.xls') ``` 需要注意的是最好在當前路徑下通過命令列執行,否則無法生成檔案。 ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201218215057917-1247576735.png) ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201218215146046-1837181270.png) ##openpyxl openpyxl是一個Python庫,用於讀取/寫入Excel 2010 xlsx/xlsm/xltx/xltm檔案。 安裝包 ``` pip install openpyx ``` 安裝完成可以開始進行讀取資料 ``` import openpyxl import os file_path = os.path.dirname(os.path.abspath(__file__)) base_path = os.path.join(file_path, 'data.xlsx') workbook = openpyxl.load_workbook(base_path) worksheet = workbook.get_sheet_by_name('Sheet1') row3=[item.value for item in list(worksheet.rows)[2]] print('第3行值',row3) col3=[item.value for item in list(worksheet.columns)[2]] print('第3行值',col3) cell_2_3=worksheet.cell(row=2,column=3).value print('第2行第3列值',cell_2_3) max_row=worksheet.max_row print('最大行',max_row) ``` ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201218221428377-765335747.png) 現在我們來開始寫入資料 ``` import openpyxl import datetime from openpyxl.styles import Font, colors, Alignment #例項化 workbook = openpyxl.Workbook() # 啟用 worksheet sheet=workbook.active #寫入資料 sheet['A1']='python' sheet['B1']='javascript' #寫入時間 sheet['A2'] = datetime.datetime.now().strftime("%Y-%m-%d") # 第2行行高 sheet.row_dimensions[2].height = 40 # B列列寬 sheet.column_dimensions['B'].width = 30 # 設定A1中的資料垂直居中和水平居中 sheet['A1'].alignment = Alignment(horizontal='center', vertical='center') # 下面的程式碼指定了等線24號,加粗斜體,字型顏色黃色。直接使用cell的font屬性,將Font物件賦值給它。 bold_itatic_24_font = Font(name='等線', size=24, italic=True, color='00FFBB00', bold=True) sheet['B1'].font = bold_itatic_24_font # 合併單元格, 往左上角寫入資料即可 sheet.merge_cells('A2:B2') # 合併一行中的幾個單元格 # 拆分單元格 # sheet.unmerge_cells('A2:B2') #儲存 workbook.save('new.xlsx') ``` ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201218230027342-1468577012.png) ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201218230052963-1206153945.png) ##pandas pandas支援xls, xlsx, xlsm, xlsb, odf, ods和odt副檔名從本地檔案系統或URL讀取。支援讀取單個工作表或工作表列表的選項。 首先依然是安裝包 ``` pip install pandas ``` 語法: pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None, squeeze=False,dtype=None, engine=None, converters=None, true_values=None, false_values=None, skiprows=None, nrows=None, na_values=None, parse_dates=False, date_parser=None, thousands=None, comment=None, skipfooter=0, convert_float=True, **kwds) * io,Excel的儲存路徑 * sheet_name,要讀取的工作表名稱 * header, 用哪一行作列名 * names, 自定義最終的列名 * index_col, 用作索引的列 * usecols,需要讀取哪些列 * squeeze,當資料僅包含一列 * converters ,強制規定列資料型別 * skiprows,跳過特定行 * nrows ,需要讀取的行數 * skipfooter , 跳過末尾n行 ``` import pandas as pd import os file_path = os.path.dirname(os.path.abspath(__file__)) base_path = os.path.join(file_path, 'data.xlsx') df = pd.read_excel(base_path) print(df) ``` ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201218234534858-1447531711.png) 寫入資料 語法: DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None) 引數說明: * excel_writer:檔案路徑或現有的ExcelWriter * sheet_name:將包含資料檔案的工作表的名稱 * na_rep:缺失的資料表示 * float_format:格式化浮點數的字串。例如float_format = " %。2f"格式為0.1234到0.12。 * columns:列 * header:寫出列名。如果給定一個字串列表,則假定它是列名的別名。 * index:寫入行名稱(索引) * index_label:如果需要,索引列的列標籤。如果未指定,並且標頭和索引為真,則使用索引名。如果DataFrame使用多索引,應該給出一個序列。 * startrow:左上角的單元格行轉儲資料幀。 * startcol:左上角單元格列轉儲資料幀。 * engine:編寫要使用的引擎“ openpyxl”或“ xlsxwriter”。 您還可以通過選項io.excel.xlsx.writer,io.excel.xls.writer和io.excel.xlsm.writer進行設定。 * merge_cells:將多索引和層次結構行寫入合併單元格。 * encoding:對生成的excel檔案進行編碼。僅對xlwt有必要,其他編寫器本身支援unicode。 * inf_rep:表示無窮大。 * verbose:在錯誤日誌中顯示更多資訊。 * freeze_panes:指定要凍結的最底部的行和最右邊的列 ``` from pandas import DataFrame data = {'name': ['張三', '李四', '王五'],'age': [11, 12, 13],'sex': ['男', '女', '男']} df = DataFrame(data) df.to_excel('file.xlsx') ``` ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201219002104090-1199874386.png) ![](https://img2020.cnblogs.com/blog/1510016/202012/1510016-20201219002118866-1720191