1. 前言
前面談到 Python 處理 Excel 文件最常見的兩種方式,即:xlrd/xlwt、openpyxl
其中,
xlrd/xlwt 這一組合,xlrd 可以負責讀取數據,而 xlwt 則負責寫入數據,缺點是不支持 xlsx
openpyxl 同時支持對 Excel 文檔的讀取、寫入操作,缺點是不支持 xls
本篇文章將繼續聊聊 Python 操作 Excel 文檔的其他幾種方式
2. xlsxwriter
xlsxwriter 主要用於將數據、圖表寫入到 Excel 文件中,可以配置使用較小的內存快速寫入數據
它的缺點是:無法讀取、修改已有的 Excel 文件;如果需要讀取修改 Excel 文件,只能搭配其他依賴庫使用,比如:xlrd
首先安裝 xlsxwriter 的依賴包
# 安裝依賴包
pip3 install xlsxwriter
xlsxwriter 提供了 Workbook(filename) 方法,用於創建一個工作簿對象
使用工作簿對象的 add_worksheet(sheet_name) 函數,就可以在工作簿中創建 Sheet 了
def create_workbook_and_worksheet(filename, worksheet_names):
"""
創建工作簿和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 單元格中寫入數據了
如果需要定制單元格的樣式,比如:字體大小、字體、顏色、背景、是否加粗等,可以使用工作簿對象的 add_format() 方法創建一個樣式
def create_format_styles(wb, format_stuyles):
"""
創建一個樣式,包含:字體大小、字體、顏色、背景、是否加粗等
: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'}
# 創建標題字體樣式
title_font_style = create_format_styles(self.wb, self.title_style)
Sheet 對象的 write(...) 函數用於向單元格中寫入數據,參數包含:行索引、列索引、值、字體樣式等
需要注意的是,默認 xlsxwriter 的行索引、列索引都是從 0 開始,即: 0 代表第一行
寫入數據的同時配置單元格樣式的寫法如下:
def write_to_cell(sheet, row_index, column_index, value, format_styles=None):
"""
往單元格中寫入數據
:param row_index: 行索引,1:第一行
:param column_index: 列索引,1:第一列
:param format_styles 字體樣式
:return:
"""
if row_index < 1 or column_index < 1:
print('參數輸入不正確,寫入失敗!')
else:
# 注意:默認xlsxwriter的行索引、列索引從0開始
sheet.write(row_index - 1, column_index - 1, value, format_styles)
# 往worksheet中寫入數據
# 第一行
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 同樣支持在單元格中插入圖片,包含:本地圖片和網絡圖片
使用的方法是:insert_image()
參數包含:單元格行索引(索引從 0 開始)、單元格列索引、圖片文件、可選參數(圖片位置、縮放、url 超鏈接、image_data 圖片字節流等)
以插入一張網絡圖片為例
首先,定義一個圖片展示可選參數,指定圖片的縮放比、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):
"""
插入圖片的參數配置
包含:偏移量、縮放比、網絡圖片鏈接、超鏈接、懸停提示燈
: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')
接着,將網絡圖片轉為字節流
from io import BytesIO
import ssl
def get_image_data_from_network(url):
"""
獲取網絡圖片字節流
:param url: 圖片地址
:return:
"""
ssl._create_default_https_context = ssl._create_unverified_context
# 獲取網絡圖片的字節流
image_data = BytesIO(urlopen(url).read())
return image_data
最后,將圖片插入到單元格中
def insert_network_image(sheet, row_index, column_index, url, filepath, image_options=None):
"""
插入網絡圖片
: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 "參數輸入有誤,插入失敗!"
# 獲取圖片字節流
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() 方法可以設置列寬
和 openpyxl 類似,有 2 種使用方式,分別是:字符串索引、列索引數字索引
def set_column_width(sheet, index_start, index_end, width):
"""
設置列寬
:param sheet:
:param index_start: 開始位置,從1開始
:param index_end: 結束位置
:param width: 寬度
:return:
"""
# 方式二選一
# self.current_sheet.set_column('A:C', width)
# 默認0代表第一列
sheet.set_column(index_start - 1, index_end - 1, width)
# 設置列寬度
# 設置第1列到第3列的寬度為:100
set_column_width(self.current_sheet, 1, 3, 100)
行高使用 set_row() 方法,傳入行索引和高度即可
def set_row_height(sheet, row_index, height):
"""
設置行高
:param sheet:
:param row_index: 行索引,從1開始
:param height:
:return:
"""
sheet.set_row(row_index - 1, height)
# 設置行高
set_row_height(self.current_sheet, 1, 50)
set_row_height(self.current_sheet, 2, 100)
寫入數據完畢之后,將工作簿關閉,文件會自動保存到本地
def teardown(self):
# 寫入文件,並關閉文件
self.wb.close()
xlsxwriter 還支持插入圖表,比如:條形圖、柱狀圖、雷達圖等,受限於篇幅,這部分內容就不展開說明了
3. 其他方式
還有一種比較常見的方式是:xlwings
xlwings 是一款開源免費的依賴庫,同時支持 Excel 文件的讀取、寫入、修改
它功能非常強大,還可以和 Matplotlib、Numpy 和 Pandas 無縫連接,支持讀寫 Numpy、Pandas 數據類型;同時,xlwings 可以直接調用 Excel 文件中 VBA 程序
需要注意的是,xlwings 依賴於 Microsoft Excel 軟件,所以使用 WPS 的用戶建議直接使用 openpyxl
官方文檔:
https://docs.xlwings.org/zh_CN/latest/quickstart.html
另外,還有一個操作 Excel 比較強大的方式,即:Pywin32
其中,
Pywin32 相當於調用 Win 下的系統 API 來操作 Excel 文件
優點是:可以處理復雜圖表的數據表
缺點也非常明顯,包含:速度慢、占用 CPU 高,僅支持 Win 系統
4. 最后
綜合發現,xlrd/xlwt、openpyxl、xlsxwriter 基本上可以滿足大部分的日常 Excel 文檔操作
要獲取全部源碼,關注公眾號「 AirPython 」,后台回復「 excel 」即可獲得全部源碼
如果你覺得文章還不錯,請大家 點贊、分享、留言下,因為這將是我持續輸出更多優質文章的最強動力!
推薦閱讀