
作者:星安果
來源:AirPython
前面談到python 處理 Excel 文件最常見的兩種方式,即:xlrd/xlwt、openpyxl。其中,xlrd/xlwt 這一組合,xlrd 可以負(fù)責(zé)讀取數(shù)據(jù),而 xlwt 則負(fù)責(zé)寫入數(shù)據(jù),缺點(diǎn)是不支持 xlsx。openpyxl 同時(shí)支持對 Excel 文檔的讀取、寫入操作,缺點(diǎn)是不支持 xls。本篇文章將繼續(xù)聊聊python 操作 Excel 文檔的其他幾種方式。
xlsxwriter
xlsxwriter 主要用于將數(shù)據(jù)、圖表寫入到 Excel 文件中,可以配置使用較小的內(nèi)存快速寫入數(shù)據(jù)。
它的缺點(diǎn)是:無法讀取、修改已有的 Excel 文件;如果需要讀取修改 Excel 文件,只能搭配其他依賴庫使用,比如:xlrd。
首先安裝 xlsxwriter 的依賴包:
# 安裝依賴包 pip3 install xlsxwriter
xlsxwriter 提供了 Workbook(filename) 方法,用于創(chuàng)建一個(gè)工作簿對象。使用工作簿對象的 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
接著,就可以往某個(gè) Sheet 單元格中寫入數(shù)據(jù)了。如果需要定制單元格的樣式,比如:字體大小、字體、顏色、背景、是否加粗等,可以使用工作簿對象的 add_format() 方法創(chuàng)建一個(gè)樣式。
def create_format_styles(wb, format_stuyles): """ 創(chuàng)建一個(gè)樣式,包含:字體大小、字體、顏色、背景、是否加粗等 :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)建標(biāo)題字體樣式 title_font_style = create_format_styles(self.wb, self.title_style)
Sheet 對象的 write(...) 函數(shù)用于向單元格中寫入數(shù)據(jù),參數(shù)包含:行索引、列索引、值、字體樣式等。需要注意的是,默認(rèn) xlsxwriter 的行索引、列索引都是從 0 開始,即: 0 代表第一行。
寫入數(shù)據(jù)的同時(shí)配置單元格樣式的寫法如下:
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: # 注意:默認(rèn)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ò)圖片為例。首先,定義一個(gè)圖片展示可選參數(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) # 默認(rèn)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)閉,文件會(huì)自動(dòng)保存到本地。
def teardown(self): # 寫入文件,并關(guān)閉文件 self.wb.close()
xlsxwriter 還支持插入圖表,比如:條形圖、柱狀圖、雷達(dá)圖等,受限于篇幅,這部分內(nèi)容就不展開說明了。
其他方式
還有一種比較常見的方式是:xlwings。xlwings 是一款開源免費(fèi)的依賴庫,同時(shí)支持 Excel 文件的讀取、寫入、修改。它功能非常強(qiáng)大,還可以和 Matplotlib、Numpy 和 Pandas 無縫連接,支持讀寫 Numpy、Pandas 數(shù)據(jù)類型;同時(shí),xlwings 可以直接調(diào)用 Excel 文件中 VBA 程序。
需要注意的是,xlwings 依賴于 Microsoft Excel 軟件,所以使用 WPS 的用戶建議直接使用 openpyxl。
另外,還有一個(gè)操作 Excel 比較強(qiáng)大的方式,即:Pywin32。其中,Pywin32 相當(dāng)于調(diào)用 Win 下的系統(tǒng) API 來操作 Excel 文件。
優(yōu)點(diǎn)是:可以處理復(fù)雜圖表的數(shù)據(jù)表;
缺點(diǎn)也非常明顯,包含:速度慢、占用 CPU 高,僅支持 Win 系統(tǒng)。
最后
綜合發(fā)現(xiàn),xlrd/xlwt、openpyxl、xlsxwriter 基本上可以滿足大部分的日常 Excel 文檔操作。
——熱門課程推薦:
想學(xué)習(xí)PYTHON數(shù)據(jù)分析與金融數(shù)字化轉(zhuǎn)型精英訓(xùn)練營,您可以點(diǎn)擊>>>“人才轉(zhuǎn)型”了解課程詳情;
想從事業(yè)務(wù)型數(shù)據(jù)分析師,您可以點(diǎn)擊>>>“數(shù)據(jù)分析師”了解課程詳情;
想從事大數(shù)據(jù)分析師,您可以點(diǎn)擊>>>“大數(shù)據(jù)就業(yè)”了解課程詳情;
想成為人工智能工程師,您可以點(diǎn)擊>>>“人工智能就業(yè)”了解課程詳情;
想了解Python數(shù)據(jù)分析,您可以點(diǎn)擊>>>“Python數(shù)據(jù)分析師”了解課程詳情;
想咨詢互聯(lián)網(wǎng)運(yùn)營,你可以點(diǎn)擊>>>“互聯(lián)網(wǎng)運(yùn)營就業(yè)班”了解課程詳情;
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對策略? 長短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場調(diào)研是企業(yè)洞察市場動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03