
作者:星安果
來源:AirPython
前面談到python 處理 Excel 文件最常見的兩種方式,即:xlrd/xlwt、openpyxl。其中,xlrd/xlwt 這一組合,xlrd 可以負責讀取數(shù)據(jù),而 xlwt 則負責寫入數(shù)據(jù),缺點是不支持 xlsx。openpyxl 同時支持對 Excel 文檔的讀取、寫入操作,缺點是不支持 xls。本篇文章將繼續(xù)聊聊python 操作 Excel 文檔的其他幾種方式。
xlsxwriter
xlsxwriter 主要用于將數(shù)據(jù)、圖表寫入到 Excel 文件中,可以配置使用較小的內(nèi)存快速寫入數(shù)據(jù)。
它的缺點是:無法讀取、修改已有的 Excel 文件;如果需要讀取修改 Excel 文件,只能搭配其他依賴庫使用,比如:xlrd。
首先安裝 xlsxwriter 的依賴包:
# 安裝依賴包 pip3 install xlsxwriter
xlsxwriter 提供了 Workbook(filename) 方法,用于創(chuàng)建一個工作簿對象。使用工作簿對象的 add_worksheet(sheet_name) 函數(shù),就可以在工作簿中創(chuàng)建 Sheet 了。
def create_workbook_and_worksheet(filename, worksheet_names): """ 創(chuàng)建工作簿和Sheet :param filename: 文件名稱 :param worksheet_names: sheet名稱列表 :return: """ wb = xlsxwriter.Workbook(filename) sheets = [] # 新增sheet for worksheet_name in worksheet_names: sheets.append(wb.add_worksheet(worksheet_name)) return wb, sheets
接著,就可以往某個 Sheet 單元格中寫入數(shù)據(jù)了。如果需要定制單元格的樣式,比如:字體大小、字體、顏色、背景、是否加粗等,可以使用工作簿對象的 add_format() 方法創(chuàng)建一個樣式。
def create_format_styles(wb, format_stuyles): """ 創(chuàng)建一個樣式,包含:字體大小、字體、顏色、背景、是否加粗等 :param wb: :param format_stuyles: :return: """ return wb.add_format(format_stuyles) # 單元格字體樣式 self.title_style = {'bold': True, 'bg_color': '#B0C4DE', 'font_size': 10,'font_name': 'Microsoft yahei'} # 創(chuàng)建標題字體樣式 title_font_style = create_format_styles(self.wb, self.title_style)
Sheet 對象的 write(...) 函數(shù)用于向單元格中寫入數(shù)據(jù),參數(shù)包含:行索引、列索引、值、字體樣式等。需要注意的是,默認 xlsxwriter 的行索引、列索引都是從 0 開始,即: 0 代表第一行。
寫入數(shù)據(jù)的同時配置單元格樣式的寫法如下:
def write_to_cell(sheet, row_index, column_index, value, format_styles=None): """ 往單元格中寫入數(shù)據(jù) :param row_index: 行索引,1:第一行 :param column_index: 列索引,1:第一列 :param format_styles 字體樣式 :return: """ if row_index < 1 or column_index < 1: print('參數(shù)輸入不正確,寫入失??!') else: # 注意:默認xlsxwriter的行索引、列索引從0開始 sheet.write(row_index - 1, column_index - 1, value, format_styles) # 往worksheet中寫入數(shù)據(jù) # 第一行 write_to_cell(self.current_sheet, 1, 1, "姓名", title_font_style) write_to_cell(self.current_sheet, 1, 2, "年齡", title_font_style) # 第二行 write_to_cell(self.current_sheet, 2, 1, 'xingag') write_to_cell(self.current_sheet, 2, 2, 23)
xlsxwriter 同樣支持在單元格中插入圖片,包含:本地圖片和網(wǎng)絡(luò)圖片。
使用的方法是:insert_image();
參數(shù)包含:單元格行索引(索引從 0 開始)、單元格列索引、圖片文件、可選參數(shù)(圖片位置、縮放、url 超鏈接、image_data 圖片字節(jié)流等)。
以插入一張網(wǎng)絡(luò)圖片為例。首先,定義一個圖片展示可選參數(shù),指定圖片的縮放比、url 超鏈接。
def create_image_options (x_offset=0, y_offset=0, x_scale=1, y_scale=1, url=None, tip=None, image_data=None, positioning=None): """ 插入圖片的參數(shù)配置 包含:偏移量、縮放比、網(wǎng)絡(luò)圖片鏈接、超鏈接、懸停提示燈 :param x_offset: :param y_offset: :param x_scale: :param y_scale: :param url: :param tip: :param image_data: :param positioning: :return: """ image_options = { 'x_offset': x_offset, 'y_offset': y_offset, 'x_scale': x_scale, 'y_scale': y_scale, 'url': url, 'tip': tip, 'image_data': image_data, 'positioning': positioning, } return image_options image_options = create_image_options (x_scale=0.5, y_scale=0.5, url='https://www.jianshu.com/u/f3b476549169')
接著,將網(wǎng)絡(luò)圖片轉(zhuǎn)為字節(jié)流:
from io import BytesIO import ssl def get_image_data_from_network(url): """ 獲取網(wǎng)絡(luò)圖片字節(jié)流 :param url: 圖片地址 :return: """ ssl._create_default_https_context = ssl._create_unverified_context # 獲取網(wǎng)絡(luò)圖片的字節(jié)流 image_data = BytesIO(urlopen(url).read()) return image_data
最后,將圖片插入到單元格中:
def insert_network_image(sheet, row_index, column_index, url, filepath, image_options=None): """ 插入網(wǎng)絡(luò)圖片 :param sheet: :param row_index: :param column_index: :param url: :param filepath: :param image_options: :return: """ if row_index < 1 or column_index < 1: return "參數(shù)輸入有誤,插入失?。? # 獲取圖片字節(jié)流 image_data = get_image_data_from_network(url) if image_options: image_options['image_data'] = image_data print(image_options) sheet.insert_image(row_index - 1, column_index - 1, filepath, image_options) insert_network_image(self.current_sheet, 1, 1, url, '1.png', image_options4)
使用 set_column() 方法可以設(shè)置列寬,和 openpyxl 類似,有 2 種使用方式,分別是:字符串索引、列索引數(shù)字索引。
def set_column_width(sheet, index_start, index_end, width): """ 設(shè)置列寬 :param sheet: :param index_start: 開始位置,從1開始 :param index_end: 結(jié)束位置 :param width: 寬度 :return: """ # 方式二選一 # self.current_sheet.set_column('A:C', width) # 默認0代表第一列 sheet.set_column(index_start - 1, index_end - 1, width) # 設(shè)置列寬度 # 設(shè)置第1列到第3列的寬度為:100 set_column_width(self.current_sheet, 1, 3, 100)
行高使用 set_row() 方法,傳入行索引和高度即可。
def set_row_height(sheet, row_index, height): """ 設(shè)置行高 :param sheet: :param row_index: 行索引,從1開始 :param height: :return: """ sheet.set_row(row_index - 1, height) # 設(shè)置行高 set_row_height(self.current_sheet, 1, 50) set_row_height(self.current_sheet, 2, 100)
寫入數(shù)據(jù)完畢之后,將工作簿關(guān)閉,文件會自動保存到本地。
def teardown(self): # 寫入文件,并關(guān)閉文件 self.wb.close()
xlsxwriter 還支持插入圖表,比如:條形圖、柱狀圖、雷達圖等,受限于篇幅,這部分內(nèi)容就不展開說明了。
其他方式
還有一種比較常見的方式是:xlwings。xlwings 是一款開源免費的依賴庫,同時支持 Excel 文件的讀取、寫入、修改。它功能非常強大,還可以和 Matplotlib、Numpy 和 Pandas 無縫連接,支持讀寫 Numpy、Pandas 數(shù)據(jù)類型;同時,xlwings 可以直接調(diào)用 Excel 文件中 VBA 程序。
需要注意的是,xlwings 依賴于 Microsoft Excel 軟件,所以使用 WPS 的用戶建議直接使用 openpyxl。
另外,還有一個操作 Excel 比較強大的方式,即:Pywin32。其中,Pywin32 相當于調(diào)用 Win 下的系統(tǒng) API 來操作 Excel 文件。
優(yōu)點是:可以處理復雜圖表的數(shù)據(jù)表;
缺點也非常明顯,包含:速度慢、占用 CPU 高,僅支持 Win 系統(tǒng)。
最后
綜合發(fā)現(xiàn),xlrd/xlwt、openpyxl、xlsxwriter 基本上可以滿足大部分的日常 Excel 文檔操作。
——熱門課程推薦:
想學習PYTHON數(shù)據(jù)分析與金融數(shù)字化轉(zhuǎn)型精英訓練營,您可以點擊>>>“人才轉(zhuǎn)型”了解課程詳情;
想從事業(yè)務(wù)型數(shù)據(jù)分析師,您可以點擊>>>“數(shù)據(jù)分析師”了解課程詳情;
想從事大數(shù)據(jù)分析師,您可以點擊>>>“大數(shù)據(jù)就業(yè)”了解課程詳情;
想成為人工智能工程師,您可以點擊>>>“人工智能就業(yè)”了解課程詳情;
想了解Python數(shù)據(jù)分析,您可以點擊>>>“Python數(shù)據(jù)分析師”了解課程詳情;
想咨詢互聯(lián)網(wǎng)運營,你可以點擊>>>“互聯(lián)網(wǎng)運營就業(yè)班”了解課程詳情;
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實踐的落地者與價值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價值,最終要在 “實踐” 中體現(xiàn) —— 脫離業(yè)務(wù)場景的分 ...
2025-09-10機器學習解決實際問題的核心關(guān)鍵:從業(yè)務(wù)到落地的全流程解析 在人工智能技術(shù)落地的浪潮中,機器學習作為核心工具,已廣泛應(yīng)用于 ...
2025-09-09SPSS 編碼狀態(tài)區(qū)域中 Unicode 的功能與價值解析 在 SPSS(Statistical Product and Service Solutions,統(tǒng)計產(chǎn)品與服務(wù)解決方案 ...
2025-09-09