如何用 Python 快速設(shè)置 Excel 表格邊框

Pandas 百問百答第 001 篇。

本篇是呆鳥原創(chuàng)系列Pandas 百問百答的第一篇,本系列的特點(diǎn)如下:

  1. 目標(biāo)受眾: Python 數(shù)據(jù)分析小白、從 Excel 處理數(shù)據(jù)轉(zhuǎn)向用 Pandas 處理數(shù)據(jù)的新手
  2. 為什么要出個系列:目的很簡單,就是為了解決新手小白在用 Pandas 處理數(shù)據(jù)時的實(shí)際問題
  3. 特點(diǎn): 每次只解決一兩個實(shí)際問題,碰到什么問題,就寫什么問題
  4. 建議:內(nèi)容不多,一定要上手實(shí)際試一下,呆鳥會給大家提供用到的 ipynb 文件與數(shù)據(jù)文件。
  5. 歡迎反饋:呆鳥的公號沒有留言功能,也沒有公號群,不過可以通過文章末尾的點(diǎn)擊原文鏈接進(jìn)入簡書文章,給呆鳥留言,另外,推薦大家加嚴(yán)小樣兒的微信號,嚴(yán)小樣兒是位非常熱心專業(yè)的群主,呆鳥也在他的群里廝混,有什么問題,可以在群里交流,除了呆鳥,還可以與很多數(shù)據(jù)分析大咖交流、學(xué)習(xí)。
嚴(yán)小樣兒的微信

呆鳥云:本篇雖然是 Pandas 百問百答系列的開篇,但其實(shí)用的并不是 Pandas,而是 xlwings,但講的是如何處理 Pandas 輸出的 Excel 文件,為啥呢? 因?yàn)?,很多?shù)據(jù)分析結(jié)果的用戶,比如,部門領(lǐng)導(dǎo)、業(yè)務(wù)人員他們不會用 Python、Jupyter、Pandas,除非你有 BI 系統(tǒng),否則大部分人都是看 Excel 的,但 Pandas 的 to_excel 函數(shù)輸出的 xlsx 文件是不帶格式的。

給領(lǐng)導(dǎo)或同事看 Excel,總不能一點(diǎn)格式都不設(shè)置吧,這也有點(diǎn)太 low 了,呆鳥就習(xí)慣把字體設(shè)為微軟雅黑、字號設(shè)為 10,根據(jù)內(nèi)容自適應(yīng)列寬、短的文字列設(shè)置為居中,數(shù)字設(shè)置成帶千分號的,當(dāng)然還有百分比和日期格式也要設(shè)置,但本篇介紹的是如何快速設(shè)置邊框。

這里特別要說一下,別小看這個技巧,呆鳥可是研究了好久才解決,openpyxl、xlwings、xlsxwriter,這幾個支持庫呆鳥找了一溜夠也沒找到快速設(shè)置邊框的方法,之前只好用 for 循環(huán),速度超級慢,讓人沒法接受,不過好在通過一番研究找到了這個快速設(shè)置邊框的方式,現(xiàn)在分享給大家,當(dāng)然,如果有朋友有更好的方式,或者也有類似的方式,還請不吝賜教,至于聯(lián)系方式,簡書也可以,去嚴(yán)小樣兒的群里也可以。

文歸正傳,下面就來看下這個功能是怎么實(shí)現(xiàn)的。假設(shè)這是一家叫小蜜蜂的超市,這家超市剛剛開業(yè),只有蘋果、梨、葡萄這三樣產(chǎn)品,領(lǐng)導(dǎo)想看下銷售情況,直接用 Pandas 輸出是 Excel 這樣的:

大家可以看到,這個表有幾個問題:

  1. 邊框不完整,只有部分單元格有邊框
  2. 字體不美觀,宋體不如微軟雅黑看著好看
  3. 列寬不合適,有的列過寬,有的列窄了,比如日期列,都看不見日期了
  4. 居中未設(shè)置,比如產(chǎn)品列該居中,但居左了。

如果不經(jīng)常處理格式也就罷了,但如果一天幾十上百個表,還手動調(diào)整就很頭疼了,今天就給大家解決第一個問題,快速設(shè)置 Excel 文件邊框。

  1. 安裝 xlwings

直接安裝用 pip install xlwings,用 anaconda 的,已經(jīng)內(nèi)置了,見下圖。

  1. 導(dǎo)入 xlwings
import xlwings as xw
  1. 打開 Excel 文件
# 打開存好的 Excel
app = xw.App() # 設(shè)置應(yīng)用
wb = xw.Book('data/小蜜蜂超市銷售報表.xlsx') # 打開文件
ws = wb.sheets['Sheet1']  # 選擇表格

注意:要養(yǎng)成良好的習(xí)慣,數(shù)據(jù)文件與程序文件要分開存儲,一般數(shù)據(jù)文件存儲在 data 子目錄里。

  1. 獲取表格行列
last_column = ws.range(1, 1).end('right').get_address(0, 0)[0] # 獲取最后一列
last_row = ws.range(1, 1).end('down').row # 獲取最后一行

a_range = f'A1:{last_column}{last_row}'  # 生成表格的數(shù)據(jù)范圍 

這里 a_range 輸出的范圍是 A1:D6,即數(shù)據(jù)表的整個內(nèi)容。

  1. 設(shè)置 a_range,也就是 A1:D6 的表格邊框
# 設(shè)置邊框
ws.range(a_range).api.Borders(8).LineStyle = 1  # 上邊框
ws.range(a_range).api.Borders(9).LineStyle = 1  # 下邊框
ws.range(a_range).api.Borders(7).LineStyle = 1  # 左邊框
ws.range(a_range).api.Borders(10).LineStyle = 1  # 右邊框
ws.range(a_range).api.Borders(12).LineStyle = 1  # 內(nèi)橫邊框
ws.range(a_range).api.Borders(11).LineStyle = 1  # 內(nèi)縱邊框

說明:

Borders() 里的參數(shù),詳見下表。

邊框位置 說明
xlEdgeTop 8 上邊框
xlEdgeBottom 9 下邊框
xlEdgeLeft 7 左邊框
xlEdgeRight 10 右邊框
xlInsideHorizontal 12 內(nèi)橫邊框
xlInsideVertical 11 內(nèi)縱邊框

LineStyle = 1,這里的 1 指的是邊框?yàn)閷?shí)線。

邊框樣式 說明
Transparent 0 透明
Solid 1 實(shí)線
Dashes 2 虛線
Double solid 8 雙實(shí)線

看看下圖,是不是已經(jīng)有邊框了。

到這里還不算完,還要關(guān)閉 Excel,保存 xlsx 文件。

# 保存并關(guān)閉 Excel
wb.save('data/小蜜蜂超市銷售報表.xlsx')
wb.close()
app.quit()

到此,設(shè)置邊框的操作就完成了,完整的 ipynb 文件,請找嚴(yán)小樣兒加群后找我要。

其它的操作,下期再介紹。

建議大家安裝 anaconda,呆鳥文章示例都是用 anaconda 內(nèi)置的 Jupyter NoteBook 編寫與分享的,有了 Jupyter,學(xué)起來方便。

還有每次分享的內(nèi)容不多,大家一定要上手試試,只是看代碼,不敲代碼,永遠(yuǎn)也學(xué)不會的。

Pandas 上手實(shí)戰(zhàn)系列

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容