Python XlsxWriter 快速指南



Python XlsxWriter - 概述

XlsxWriter 是一個 Python 模組,用於建立 Excel 2007 (XLSX) 格式的電子表格檔案,它使用開放 XML 標準。XlsxWriter 模組由 John McNamara 開發。其最早版本 (0.0.1) 於 2013 年釋出。最新版本 3.0.2 於 2021 年 11 月釋出。最新版本需要 Python 3.4 或更高版本。

XlsxWriter 功能

XlsxWriter 的一些重要功能包括:

  • XlsxWriter 建立的檔案與 Excel XLSX 檔案 100% 相容。

  • XlsxWriter 提供完整的格式化功能,例如合併單元格、定義名稱、條件格式等。

  • XlsxWriter 允許以程式設計方式在 XLSX 檔案中插入圖表。

  • 可以使用 XlsxWriter 設定自動篩選器。

  • XlsxWriter 支援資料驗證和下拉列表。

  • 使用 XlsxWriter,可以插入 PNG/JPEG/GIF/BMP/WMF/EMF 圖片。

  • 使用 XlsxWriter,可以將 Excel 電子表格與 Pandas 庫整合。

  • XlsxWriter 還支援新增宏。

  • XlsxWriter 具有記憶體最佳化模式,用於寫入大型檔案。

Python XlsxWriter - 環境設定

使用 PIP 安裝 XlsxWriter

安裝 XlsxWriter 最簡單且推薦的方法是使用 PIP 安裝程式。使用以下命令安裝 XlsxWriter(最好在虛擬環境中)。

pip3 install xlsxwriter

從 Tarball 安裝

另一種選擇是從其原始碼安裝 XlsxWriter,該原始碼託管在 https://github.com/jmcnamara/XlsxWriter/。下載最新的原始碼 tarball 並使用以下命令安裝庫:

$ curl -O -L http://github.com/jmcnamara/XlsxWriter/archive/main.tar.gz

$ tar zxvf main.tar.gz
$ cd XlsxWriter-main/
$ python setup.py install

從 GitHub 克隆

您也可以克隆 GitHub 儲存庫並從中安裝。

$ git clone https://github.com/jmcnamara/XlsxWriter.git

$ cd XlsxWriter
$ python setup.py install

要確認 XlsxWriter 是否已正確安裝,請從 Python 提示符檢查其版本:

>>> import xlsxwriter
>>> xlsxwriter.__version__
'3.0.2'

Python XlsxWriter - Hello World

入門

測試模組/庫是否正常工作的第一個程式通常是寫入 Hello world 訊息。以下程式建立一個具有 .XLSX 副檔名的檔案。xlsxwriter 模組中的 Workbook 類物件對應於當前工作目錄中的電子表格檔案。

wb = xlsxwriter.Workbook('hello.xlsx')

接下來,呼叫 Workbook 物件的 add_worksheet() 方法在其內插入一個新的工作表。

ws = wb.add_worksheet()

我們現在可以透過呼叫工作表物件的 write() 方法在 A1 單元格新增 Hello World 字串。它需要兩個引數:單元格地址和字串。

ws.write('A1', 'Hello world')

示例

hello.py 的完整程式碼如下:

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()
ws.write('A1', 'Hello world')
wb.close()

輸出

執行上述程式碼後,將在當前工作目錄中建立 hello.xlsx 檔案。您現在可以使用 Excel 軟體開啟它。

Hello World

Python XlsxWriter - 重要類

XlsxWriter 庫包含以下類。這些類中定義的所有方法都允許對 XLSX 檔案進行不同的程式設計操作。這些類是:

  • Workbook 類
  • Worksheet 類
  • Format 類
  • Chart 類
  • Chartsheet 類
  • Exception 類

Workbook 類

這是 XlsxWriter 模組公開的主要類,也是您唯一需要直接例項化的類。它表示寫入磁碟上的 Excel 檔案。

wb=xlsxwriter.Workbook('filename.xlsx')

Workbook 類定義了以下方法:

序號 Workbook 類和描述
1

add_worksheet()

向工作簿新增一個新的工作表。

2

add_format()

用於建立新的 Format 物件,這些物件用於將格式應用於單元格。

3

add_chart()

建立一個新的圖表物件,可以透過 insert_chart() Worksheet 方法將其插入工作表。

4

add_chartsheet()

向工作簿新增一個新的圖表表。

5

close()

關閉 Workbook 物件並寫入 XLSX 檔案。

6

define_name()

在工作簿中建立一個定義的名稱以用作變數。

7

add_vba_project()

用於使用二進位制 VBA 專案檔案向工作簿新增宏或函式。

8

worksheets()

返回工作簿中工作表的列表。

Worksheet 類

Worksheet 類表示 Excel 工作表。此類的物件處理諸如將資料寫入單元格或設定工作表佈局之類的操作。它透過從 Workbook() 物件呼叫 add_worksheet() 方法來建立。

Worksheet 物件可以訪問以下方法:

write()

將通用資料寫入工作表單元格。

引數

  • row - 單元格行(從零開始索引)。

  • col - 單元格列(從零開始索引)。

  • *args - 傳遞給子方法(例如數字、字串和單元格格式)的其他引數。

返回值

  • 0 - 成功

  • -1 - 行或列超出工作表範圍。

write_string()

將字串寫入由行和列指定的單元格。

引數

  • row (int) - 單元格行(從零開始索引)。

  • col (int) - 單元格列(從零開始索引)。

  • string (string) - 要寫入單元格的字串。

  • cell_format (Format) - 可選的 Format 物件。

返回值

  • 0 - 成功

  • -1 - 行或列超出工作表範圍。

  • -2 - 字串截斷為 32k 個字元。

write_number()

將數字型別寫入由行和列指定的單元格。

引數

  • row (int) - 單元格行(從零開始索引)。

  • col (int) - 單元格列(從零開始索引)。

  • string (string) - 要寫入單元格的字串。

  • cell_format (Format) - 可選的 Format 物件。

返回值

  • 0 - 成功

  • -1 - 行或列超出工作表範圍。

write_formula()

將公式或函式寫入由行和列指定的單元格。

引數

  • row (int) - 單元格行(從零開始索引)。

  • col (int) - 單元格列(從零開始索引)。

  • formula (string) - 要寫入單元格的公式。

  • cell_format (Format) - 可選的 Format 物件。

  • value - 可選結果。如果計算了公式,則為其值。

返回值

  • 0 - 成功

  • -1 - 行或列超出工作表範圍。

insert_image()

用於將影像插入工作表。影像可以是 PNG、JPEG、GIF、BMP、WMF 或 EMF 格式。

引數

  • row (int) - 單元格行(從零開始索引)。

  • col (int) - 單元格列(從零開始索引)。

  • filename - 影像檔名(如果需要,則包含路徑)。

返回值

  • 0 - 成功

  • -1 - 行或列超出工作表範圍。

insert_chart()

用於將圖表插入工作表。圖表物件是透過 Workbook add_chart() 方法建立的。

引數

  • row (int) - 單元格行(從零開始索引)。

  • col (int) - 單元格列(從零開始索引)。

  • chart - 圖表物件。

conditional_format()

用於根據使用者定義的條件向單元格或單元格範圍新增格式。

引數

  • first_row (int) - 範圍的第一行。(所有索引都從零開始)

  • first_col (int) - 範圍的第一列。

  • last_row (int) - 範圍的最後一行。

  • last_col (int) - 範圍的最後一列。

  • options (dict) - 條件格式選項。必須是一個字典,其中包含描述條件格式的型別和樣式的引數。

返回值

  • 0 - 成功

  • -1 - 行或列超出工作表範圍。

  • -2 - 引數或選項不正確。

add_table()

用於將單元格範圍分組到 Excel 表格中。

引數

  • first_row (int) - 範圍的第一行。(所有索引都從零開始)

  • first_col (int) - 範圍的第一列。

  • last_row (int) - 範圍的最後一行。

  • last_col (int) - 範圍的最後一列。

  • options (dict) - 表格格式選項。

autofilter()

設定工作表中的自動篩選區域。它向工作表資料二維範圍的標題新增下拉列表。使用者可以根據簡單的條件篩選資料。

引數

  • first_row (int) - 範圍的第一行。(所有索引都從零開始)

  • first_col (int) - 範圍的第一列。

  • last_row (int) - 範圍的最後一行。

  • last_col (int) - 範圍的最後一列。

Format 類

Format 物件是透過呼叫工作簿 add_format() 方法建立的。此物件可用的方法和屬性與字型、顏色、圖案、邊框、對齊和數字格式有關。

字型格式方法和屬性:

方法名稱 描述 屬性
set_font_name() 字型型別 'font_name'
set_font_size() 字型大小 'font_size'
set_font_color() 字型顏色 'font_color'
set_bold() 粗體 'bold'
set_italic() 斜體 'italic'
set_underline() 下劃線 'underline'
set_font_strikeout() 刪除線 'font_strikeout'
set_font_script() 上標/下標 'font_script'

對齊格式方法和屬性

方法名稱 描述 屬性
set_align() 水平對齊 'align'
set_align() 垂直對齊 'valign'
set_rotation() 旋轉 'rotation'
set_text_wrap() 文字換行 'text_wrap'
set_reading_order() 閱讀順序 'reading_order'
set_text_justlast() 右對齊 'text_justlast'
set_center_across() 跨列居中 'center_across'
set_indent() 縮排 'indent'
set_shrink() 自動調整大小 'shrink'

Chart 類

圖表物件是透過 Workbook 物件的 add_chart() 方法建立的,其中指定了圖表型別。

chart = workbook.add_chart({'type': 'column'})

透過呼叫 insert_chart() 方法將 chart 物件插入工作表。

worksheet.insert_chart('A7', chart)

XlxsWriter 支援以下圖表型別:

  • area - 建立面積圖(填充線樣式)。

  • bar - 建立條形圖(轉置直方圖)。

  • column - 建立柱狀圖(直方圖)。

  • line - 建立折線圖。

  • pie - 建立餅圖。

  • doughnut - 建立環形圖。

  • scatter - 建立散點圖。

  • stock - 建立股票圖。

  • radar − 建立雷達圖。

Chart 類定義了以下方法:

add_series(options)

向圖表新增資料系列。可以給出以下屬性:

  • 值,類別
  • 名稱
  • 線條,邊框
  • 填充,圖案,漸變
  • 資料標籤,點

set_x_axis(options)

設定圖表 X 軸選項,包括:

  • 名稱,名稱字型
  • 數字字型,數字格式
  • 線條,填充,圖案,漸變
  • 最小值,最大值
  • 軸位置
  • 標籤位置,標籤對齊
  • 日期軸,文字軸
  • 次要單位型別,主要單位型別

set_y_axis(options)

設定圖表 Y 軸選項,包括:

  • 名稱,名稱字型
  • 數字字型,數字格式
  • 線條,填充,圖案,漸變
  • 最小值,最大值
  • 軸位置
  • 標籤位置,標籤對齊
  • 日期軸,文字軸
  • 次要單位型別,主要單位型別

set_size()

此方法用於設定圖表的尺寸。可以透過設定寬度和高度或設定x_scaley_scale來修改圖表的尺寸。

set_title(options)

設定圖表標題選項。

引數

  • options (dict) − 圖表尺寸選項的字典。

  • name − 設定圖表的名稱(標題)。名稱顯示在圖表上方。

  • name_font − 設定圖表標題的字型屬性。

  • overlay − 允許標題疊加在圖表上。

  • layout − 設定標題在圖表中相對單位的 (x, y) 位置。

set_legend()

此方法使用以下屬性格式化圖表圖例:

  • 位置,字型,邊框
  • 填充,圖案,漸變

圖表工作表類

XLSX 檔案中的圖表工作表是一個僅包含圖表而不包含其他資料的worksheet。透過從 Workbook 物件呼叫add_chartsheet() 方法來建立一個新的chartsheet 物件:

chartsheet = workbook.add_chartsheet()

Chartsheet 類的一些功能與資料工作表類似,例如選項卡選擇、頁首、頁尾、頁邊距和列印屬性。但是,它的主要目的是顯示單個圖表,而普通資料工作表可以包含一個或多個嵌入式圖表。

chartsheet 圖表的資料必須存在於單獨的工作表中。因此,它總是與至少一個數據工作表一起建立,使用set_chart() 方法。

chartsheet = workbook.add_chartsheet()
chart = workbook.add_chart({'type': 'column'})
chartsheet.set_chart(chart)

請記住,圖表工作表只能包含一個圖表。

示例

以下程式碼將資料系列寫入名為 sheet1 的工作表中,但會開啟一個新的圖表工作表以根據 sheet1 中的資料新增柱狀圖。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()

cs = wb.add_chartsheet()
chart = wb.add_chart({'type': 'column'})

data = [
   [10, 20, 30, 40, 50],
   [20, 40, 60, 80, 100],
   [30, 60, 90, 120, 150],
]
worksheet.write_column('A1', data[0])
worksheet.write_column('B1', data[1])
worksheet.write_column('C1', data[2]) 

chart.add_series({'values': '=Sheet1!$A$1:$A$5'})
chart.add_series({'values': '=Sheet1!$B$1:$B$5'})
chart.add_series({'values': '=Sheet1!$C$1:$C$5'})

cs.set_chart(chart)
cs.activate()

wb.close()

輸出

ChartSheet Class

異常類

XlsxWriter 識別各種執行時錯誤或異常,可以使用 Python 的錯誤處理技術來捕獲這些錯誤,以避免 Excel 檔案損壞。XlsxWriter 中的異常類如下:

序號 異常類和描述
1

XlsxWriterException

XlsxWriter 的基本異常。

2

XlsxFileError

所有與檔案相關的錯誤的基本異常。

3

XlsxInputError

所有與輸入資料相關的錯誤的基本異常。

4

FileCreateError

如果在將 xlsx 檔案寫入磁碟時發生檔案許可權錯誤或 IO 錯誤,或者如果檔案已在 Excel 中開啟,則會發生此錯誤。

5

UndefinedImageSize

如果影像不包含高度或寬度資訊,則在insert_image() 方法中引發此異常。此異常在 Workbook close() 期間引發。

6

UnsupportedImageFormat

如果影像不是支援的檔案格式之一:PNG、JPEG、GIF、BMP、WMF 或 EMF,則會引發此異常。

7

EmptyChartSeries

當向工作表新增圖表而沒有資料系列時,會發生此異常。

8

InvalidWorksheetName

如果工作表名稱過長或包含無效字元。

9

DuplicateWorksheetName

當工作表名稱已存在時,會引發此異常。

異常 FileCreateError

假設一個名為hello.xlsx的工作簿已經使用 Excel 應用程式開啟,則以下程式碼將引發FileCreateError

import xlsxwriter
workbook = xlsxwriter.Workbook('hello.xlsx')
worksheet = workbook.add_worksheet()
workbook.close()

執行此程式時,錯誤訊息將顯示如下:

PermissionError: [Errno 13] Permission denied: 'hello.xlsx'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
   File "hello.py", line 4, in <module>
   workbook.close()
File "e:\xlsxenv\lib\site-packages\xlsxwriter\workbook.py", line 326, in close
   raise FileCreateError(e)
xlsxwriter.exceptions.FileCreateError: [Errno 13] Permission denied: 'hello.xlsx'

處理異常

為此,我們可以使用 Python 的異常處理機制。

import xlsxwriter
try:
   workbook = xlsxwriter.Workbook('hello.xlsx')
   worksheet = workbook.add_worksheet()
   workbook.close()
except:
   print ("The file is already open")

現在將顯示自定義錯誤訊息。

(xlsxenv) E:\xlsxenv>python ex34.py
The file is already open

異常 EmptyChartSeries

新增帶有資料系列的圖表時引發的另一個異常情況。

import xlsxwriter
workbook = xlsxwriter.Workbook('hello.xlsx')
worksheet = workbook.add_worksheet()
chart = workbook.add_chart({'type': 'column'})
worksheet.insert_chart('A7', chart)
workbook.close()

這將導致 EmptyChartSeries 異常:

xlsxwriter.exceptions.EmptyChartSeries: Chart1 must contain at least one data series.

Python XlsxWriter - 單元格表示法和範圍

工作簿中的每個工作表都是一個包含大量單元格的網格,每個單元格可以儲存一個數據——值或公式。網格中的每個單元格都由其行號和列號標識。

在 Excel 的標準單元格定址中,列由字母 A、B、C……Z、AA、AB 等標識,行從 1 開始編號。

每個單元格的地址都是字母數字的,其中字母部分對應於列,數字部分對應於行。例如,地址“C5”指向“C”列和“5”行中的單元格。

Cell Notations1

單元格表示法

標準 Excel 使用列字母和基於 1 的行的字母數字序列。XlsxWriter 支援標準 Excel 表示法 (A1 表示法) 以及行-列表示法,該表示法對行和列都使用基於零的索引。

示例

在下面的示例中,字串“Hello world”使用 Excel 的標準單元格地址寫入 A1 單元格,而“Welcome to XLSXWriter”使用行-列表示法寫入 C5 單元格。

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()
ws.write('A1', 'Hello world')           # A1 notation
ws.write(4,2,"Welcome to XLSXWriter")   # Row-column notation
wb.close()

輸出

使用 Excel 軟體開啟hello.xlsx 檔案。

Cell Notations2

編號的行-列表示法在以程式設計方式引用單元格時特別有用。在以下程式碼中,必須將列表列表中的資料寫入工作表中的一系列單元格。這是透過兩個巢狀迴圈實現的,外部迴圈表示行號,內部迴圈表示列號。

data = [
   ['Name', 'Physics', 'Chemistry', 'Maths', 'Total'],
   ['Ravi', 60, 70, 80],
   ['Kiran', 65, 75, 85],
   ['Karishma', 55, 65, 75],
]
for row in range(len(data)):
   for col in range(len(data[row])):
      ws.write(row, col, data[row][col])

可以使用以下程式碼中使用的worksheet物件的write_row()方法實現相同的結果:

for row in range(len(data)):
   ws.write_row(6+row,0, data[row])

worksheet 物件具有add_table() 方法,該方法將資料寫入一個範圍並轉換為 Excel 範圍,在頂行顯示自動篩選下拉箭頭。

ws.add_table('G6:J9', {'data': data, 'header_row':True})

示例

以上三個程式碼的輸出可以透過以下程式碼驗證,並在下圖中顯示:

import xlsxwriter

wb = xlsxwriter.Workbook('ex1.xlsx')
ws = wb.add_worksheet()

data = [
   ['Name', 'Physics', 'Chemistry', 'Maths', 'Total'],
   ['Ravi', 60, 70, 80],
   ['Kiran', 65, 75, 85],
   ['Karishma', 55, 65, 75],
]
for row in range(len(data)):
   for col in range(len(data[row])):
      ws.write(row, col, data[row][col])
      
for row in range(len(data)):
   ws.write_row(6+row,0, data[row])
   
ws.add_table('G6:J9', {'data': data, 'header_row':False})

wb.close()

輸出

執行上述程式並使用 Excel 軟體開啟ex1.xlsx

Cell Notations3

Python XlsxWriter - 定義名稱

在 Excel 中,可以使用使用者定義的名稱來標識單元格、公式或單元格範圍,該名稱可以用作變數,使公式定義易於理解。這可以透過 Workbook 類的define_name() 方法來實現。

在以下程式碼片段中,我們有一系列包含數字的單元格。此範圍已命名為 marks。

data=['marks',50,60,70, 'Total']
ws.write_row('A1', data)
wb.define_name('marks', '=Sheet1!$A$1:$E$1')

如果名稱分配給一系列單元格,則define_name() 方法的第二個引數是一個字串,其中包含工作表名稱,後跟“”符號,然後是使用絕對定址方案的單元格範圍。在這種情況下,sheet1 中的範圍A1:E1 命名為marks

此名稱可用於任何公式。例如,我們計算由名稱marks標識的範圍中數字的總和。

ws.write('F1', '=sum(marks)')

我們還可以在write_formula() 方法中使用命名的單元格。在以下程式碼中,此方法用於計算金額的利息,其中rate 是一個定義的名稱

ws.write('B5', 10)
wb.define_name('rate', '=sheet1!$B$5')

ws.write_row('A5', ['Rate', 10])

data=['Amount',1000, 2000, 3000]
ws.write_column('A6', data)
ws.write('B6', 'Interest')
for row in range(6,9):
   ws.write_formula(row, 1, '= rate*$A{}/100'.format(row+1))

我們也可以使用write_array_formula() 方法代替上面的迴圈程式碼:

ws.write_array_formula('D7:D9' , '{=rate/100*(A7:A9)}')

示例

使用define_name() 方法的完整程式碼如下:

import xlsxwriter

wb = xlsxwriter.Workbook('ex2.xlsx')
ws = wb.add_worksheet()

data = ['marks',50,60,70, 'Total']
ws.write_row('A1', data)
wb.define_name('marks', '=Sheet1!$A$1:$E$1')
ws.write('F1', '=sum(marks)')

ws.write('B5', 10)
wb.define_name('rate', '=sheet1!$B$5')

ws.write_row('A5', ['Rate', 10])

data=['Amount',1000, 2000, 3000]
ws.write_column('A6', data)
ws.write('B6', 'Interest')

for row in range(6,9):
   ws.write_formula(row, 1, '= rate*$A{}/100'.format(row+1))
   
wb.close()

輸出

執行上述程式並使用 Excel 開啟ex2.xlsx

Ex2 Xlsx

Python XlsxWriter - 公式和函式

Worksheet 類提供三種使用公式的方法。

  • write_formula()
  • write_array_formula()
  • write_dynamic_array_formula()

所有這些方法都用於為單元格分配公式和函式。

write_formula() 方法

write_formula() 方法需要單元格的地址和包含有效 Excel 公式的字串。在公式字串內,只接受 A1 樣式的地址表示法。但是,單元格地址引數可以是標準 Excel 型別或基於零的行和列號表示法。

示例

在下面的示例中,各種語句使用write_formula() 方法。第一個使用標準 Excel 表示法分配公式。第二個語句使用行和列號來指定設定公式的目標單元格的地址。在第三個示例中,IF() 函式被分配給 G2 單元格。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data=[
   ['Name', 'Phy', 'Che', 'Maths', 'Total', 'percent', 'Result' ],
   ['Arvind', 50,60,70]
]
ws.write_row('A1', data[0])
ws.write_row('A2', data[1])
ws.write_formula('E2', '=B2+C2+D2')
ws.write_formula(1,5, '=E2*100/300')
ws.write_formula('G2', '=IF(F2>=50, "PASS","FAIL")')

wb.close()

輸出

Excel 檔案顯示以下結果:

Write Formula

write_array_formula() 方法

write_array_formula() 方法用於將公式擴充套件到一個範圍。在 Excel 中,陣列公式對一組值執行計算。它可以返回單個值或一系列值。

陣列公式用公式周圍的一對大括號表示——{=SUM(A1:B1*A2:B2)}。範圍可以透過範圍中第一個和最後一個單元格的行號和列號指定(例如 0,0, 2,2)或透過字串表示'A1:C2'指定。

示例

在下面的示例中,陣列公式用於 E、F 和 G 列,根據 B2:D4 範圍中的分數計算總計、百分比和結果。

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data=[
   ['Name', 'Phy', 'Che', 'Maths', 'Total', 'percent', 'Result'],
   ['Arvind', 50,60,70],
   ['Amar', 55,65,75],
   ['Asha', 75,85,80]
]

for row in range(len(data)):
   ws.write_row(row,0, data[row])
   
ws.write_array_formula('E2:E4', '{=B2:B4+C2:C4+D2:D4}')
ws.write_array_formula(1,5,3,5, '{=(E2:E4)*100/300}')
ws.write_array_formula('G2:G4', '{=IF((F2:F4)>=50, "PASS","FAIL")}')

wb.close()

輸出

以下是使用 MS Excel 開啟時工作表的外觀:

Write Array Formula

write_dynamic_array_data() 方法

write_dynamic_array_data() 方法將動態陣列公式寫入單元格範圍。動態陣列的概念已在 EXCEL 的 365 版本中引入,並且已經引入了一些利用動態陣列優勢的新函式。這些函式是:

序號 函式和描述
1

FILTER

篩選資料並返回匹配的記錄

2

RANDARRAY

生成隨機數陣列

3

SEQUENCE

生成順序數陣列

4

SORT

按列排序範圍

5

SORTBY

按另一個範圍或陣列排序範圍

6

UNIQUE

從列表或範圍中提取唯一值

7

XLOOKUP

VLOOKUP 的替代品

8

XMATCH

MATCH 函式的替代品

動態陣列是返回值範圍,其大小可以根據結果而改變。例如,像FILTER()這樣的函式返回一個值陣列,其大小可能因篩選結果而異。

示例

在下面的示例中,資料範圍是 A1:D17。篩選器函式使用此範圍,條件範圍是 C1:C17,其中給出了產品名稱。FILTER() 函式的結果是一個動態陣列,因為滿足條件的行數可能會改變。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data = (
   ['Region', 'SalesRep', 'Product', 'Units'],
   ['East',   'Tom',      'Apple',    6380],
   ['West',   'Fred',     'Grape',    5619],
   ['North',  'Amy',      'Pear',     4565],
   ['South',  'Sal',      'Banana',   5323],
   ['East',   'Fritz',    'Apple',    4394],
   ['West',   'Sravan',   'Grape',    7195],
   ['North',  'Xi',       'Pear',     5231],
   ['South',  'Hector',   'Banana',   2427],
   ['East',   'Tom',      'Banana',   4213],
   ['West',   'Fred',     'Pear',     3239],
   ['North',  'Amy',      'Grape',    6520],
   ['South',  'Sal',      'Apple',    1310],
   ['East',   'Fritz',    'Banana',   6274],
   ['West',   'Sravan',   'Pear',     4894],
   ['North',  'Xi',       'Grape',    7580],
   ['South',  'Hector',   'Apple',    9814])
for row in range(len(data)):
   ws.write_row(row,0, data[row])
   
ws.write_dynamic_array_formula('F1', '=FILTER(A1:D17,C1:C17="Apple")')
wb.close()

輸出

請注意,寫入 write_dynamic_array_formula() 的公式字串不需要包含花括號。生成的 hello.xlsx 必須使用 Excel 365 應用程式開啟。

Write Dynamic Array data

Python XlsxWriter - 日期和時間

在 Excel 中,日期儲存為實數,以便它們可以用於計算。預設情況下,1900 年 1 月 1 日(稱為紀元)被視為 1,因此 2022 年 1 月 28 日對應於 44589。類似地,時間表示為數字的小數部分,作為一天的百分比。因此,2022 年 1 月 28 日 11.00 對應於 44589.45833。

Date Format

set_num_format() 方法

由於 Excel 中的日期或時間就像任何其他數字一樣,要將數字顯示為日期,必須為其應用 Excel 數字格式。使用 Format 物件的set_num_format() 方法使用適當的格式。

以下程式碼片段將數字顯示為“dd/mm/yy”格式。

num = 44589
format1 = wb.add_format()
format1.set_num_format('dd/mm/yy')
ws.write('B2', num, format1)

num_format 引數

或者,可以將add_format() 方法的num_format 引數設定為所需的格式。

format1 = wb.add_format({'num_format':'dd/mm/yy'})
ws.write('B2', num, format1)

示例

以下程式碼顯示各種日期格式的數字。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

num=44589
ws.write('A1', num)

format2 = wb.add_format({'num_format': 'dd/mm/yy'})
ws.write('A2', num, format2)

format3 = wb.add_format({'num_format': 'mm/dd/yy'})
ws.write('A3', num, format3)

format4 = wb.add_format({'num_format': 'd-m-yyyy'})
ws.write('A4', num, format4)

format5 = wb.add_format({'num_format': 'dd/mm/yy hh:mm'})
ws.write('A5', num, format5)

format6 = wb.add_format({'num_format': 'd mmm yyyy'})
ws.write('A6', num, format6)

format7 = wb.add_format({'num_format': 'mmm d yyyy hh:mm AM/PM'})
ws.write('A7', num, format7)

wb.close()

輸出

在Excel軟體中,工作表如下所示:

Num Format Parameter

write_datetime() 和 strptime()

XlsxWriter 的 Worksheet 物件也具有 **write_datetime()** 方法,此方法在處理使用 Python 標準庫的 datetime 模組獲得的日期和時間物件時非常有用。

**strptime()** 方法根據給定的格式解析字串,並返回 **datetime** 物件。下面給出了一些用於格式化字串的程式碼:

%a

縮寫的工作日名稱

Sun, Mon

%A

完整的工作日名稱

Sunday, Monday

%d

月份中的日期,以零填充的十進位制數表示

01, 02

%-d

月份中的日期,以十進位制數表示

1, 2..

%b

縮寫的月份名稱

Jan, Feb

%m

月份,以零填充的十進位制數表示

01, 02

%-m

月份,以十進位制數表示

1, 2

%B

完整的月份名稱

January, February

%y

年份(不含世紀),以零填充的十進位制數表示

99, 00

%-y

年份(不含世紀),以十進位制數表示

0, 99

%Y

年份(含世紀),以十進位制數表示

2022, 1999

%H

小時(24 小時制),以零填充的十進位制數表示

01, 23

%-H

小時(24 小時制),以十進位制數表示

1, 23

%I

小時(12 小時制),以零填充的十進位制數表示

01, 12

%-I

小時(12 小時制),以十進位制數表示

1, 12

%p

區域設定的 AM 或 PM

AM, PM

%M

分鐘,以零填充的十進位制數表示

01, 59

%-M

分鐘,以十進位制數表示

1, 59

%S

秒,以零填充的十進位制數表示

01, 59

%-S

秒,以十進位制數表示

1, 59

%c

區域設定的適當日期和時間表示

Mon Sep 30 07:06:05 2022

**strptime()** 方法使用方法如下:

>>> from datetime import datetime
>>> dt="Thu February 3 2022 11:35:5"
>>> code="%a %B %d %Y %H:%M:%S"
>>> datetime.strptime(dt, code)
datetime.datetime(2022, 2, 3, 11, 35, 5)

現在可以使用 **write_datetime()** 方法將此 **datetime** 物件寫入工作表。

示例

在下面的示例中,**datetime** 物件使用不同的格式寫入。

import xlsxwriter
from datetime import datetime
wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()

dt="Thu February 3 2022 11:35:5"
code="%a %B %d %Y %H:%M:%S"
obj=datetime.strptime(dt, code)
date_formats = (
   'dd/mm/yy',
   'mm/dd/yy',
   'dd m yy',
   'd mm yy',
   'd mmm yy',
   'd mmmm yy',
   'd mmmm yyy',
   'd mmmm yyyy',
   'dd/mm/yy hh:mm',
   'dd/mm/yy hh:mm:ss',
   'dd/mm/yy hh:mm:ss.000',
   'hh:mm',
   'hh:mm:ss',
   'hh:mm:ss.000',
)
worksheet.write('A1', 'Formatted date')
worksheet.write('B1', 'Format')
row = 1

for fmt in date_formats:
   date_format = wb.add_format({'num_format': fmt, 'align': 'left'})
   worksheet.write_datetime(row, 0, obj, date_format)
   worksheet.write_string(row, 1, fmt)
   row += 1
wb.close()

輸出

使用 Excel 開啟時,工作表顯示如下。

Datetime And Strptime

Python XlsxWriter - 表格

在 MS Excel 中,表是一個已被分組為單個實體的單元格範圍。可以從公式中引用它,並且它具有公共的格式屬性。可以在工作表表中定義一些功能,例如列標題、自動篩選器、總計行、列公式。

add_table() 方法

工作表方法 **add_table()** 用於將單元格範圍新增為表。

worksheet.add_table(first_row, first_col, last_row, last_col, options)

允許使用標準“**A1**”或“**行/列**”表示法來指定範圍。**add_table()** 方法可以採用一個或多個以下可選引數。請注意,除範圍引數外,其他引數都是可選的。如果未給出,則會建立一個空表。

示例

data

此引數可用於指定表單元格中的資料。請看下面的例子:

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data = [
   ['Namrata',  75, 65, 80],
   ['Ravi',     60, 70, 80],
   ['Kiran',    65, 75, 85],
   ['Karishma', 55, 65, 75],
]
ws.add_table("A1:D4", {'data':data})

wb.close()

輸出

結果如下:

Add Table

header_row

此引數可用於啟用或停用表中的標題行。預設情況下為啟用。標題行將包含預設標題,例如“列 1”、“列 2”等。您可以使用 columns 引數設定所需的標題。

Columns

示例

此屬性用於設定列標題。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data = [
   ['Namrata',  75, 65, 80],
   ['Ravi',     60, 70, 80],
   ['Kiran',    65, 75, 85],
   ['Karishma', 55, 65, 75],
]

ws.add_table("A1:D4",
{'data':data,
   'columns': [
   {'header': 'Name'},
   {'header': 'physics'},
   {'header': 'Chemistry'},
   {'header': 'Maths'}]
})
wb.close()

輸出

現在標題行已設定為如下所示:

Header Row

autofilter

此引數預設為啟用。設定為停用時,標題行不顯示下拉箭頭以設定篩選條件。

Name

在 Excel 工作表中,表命名為 Table1、Table2 等。可以使用 *name* 引數根據需要設定表的名稱。

ws.add_table("A1:E4", {'data':data, 'name':'marklist'})

Formula

可以透過在 columns 選項中指定 formula 子屬性來建立包含公式的列。

示例

在下面的示例中,表的名稱屬性設定為“marklist”。“總計”列 E 的公式對分數進行求和,並賦值給 formula 子屬性。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data = [
   ['Namrata',  75, 65, 80],
   ['Ravi',     60, 70, 80],
   ['Kiran',    65, 75, 85],
   ['Karishma', 55, 65, 75],
]
formula = '=SUM(marklist[@[physics]:[Maths]])'
tbl = ws.add_table("A1:E5",
{'data': data,
   'autofilter': False,
   'name': 'marklist',
   'columns': [
      {'header': 'Name'},
      {'header': 'physics'},
      {'header': 'Chemistry'},
      {'header': 'Maths'},
      {'header': 'Total', 'formula': formula}
   ]
})
wb.close()

輸出

執行上述程式碼後,工作表將顯示包含分數總和的 **總計** 列。

AutoFilter

Python XlsxWriter - 應用篩選

在 Excel 中,您可以使用邏輯表示式根據條件設定表格資料的篩選器。在 XlsxWriter 的工作表類中,我們有 **autofilter()** 方法用於此目的。此方法的必需引數是單元格範圍。這會在標題行中建立下拉選擇器。要應用某些條件,我們有兩種方法可用:**filter_column()** 或 **filter_column_list()**。

應用列的篩選條件

在下面的示例中,範圍 A1:D51(即單元格 0,0 到 50,3)中的資料用作 **autofilter()** 方法的範圍引數。使用 **filter_column()** 方法在第 0 列(帶有“地區”標題)上設定篩選條件 **'Region == East'**。

示例

透過為工作表物件的 **set_row()** 方法的 hidden 選項設定 true,隱藏資料範圍內不滿足篩選條件的所有行。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data = (
   ['Region', 'SalesRep', 'Product', 'Units'],
   ['East',   'Tom',      'Apple',    6380],
   ['West',   'Fred',     'Grape',    5619],
   ['North',  'Amy',      'Pear',     4565],
   ['South',  'Sal',      'Banana',   5323],
   ['East',   'Fritz',    'Apple',    4394],
   ['West',   'Sravan',   'Grape',    7195],
   ['North',  'Xi',       'Pear',     5231],
   ['South',  'Hector',   'Banana',   2427],
   ['East',   'Tom',      'Banana',   4213],
   ['West',   'Fred',     'Pear',     3239],
   ['North',  'Amy',      'Grape',    6520],
   ['South',  'Sal',      'Apple',    1310],
   ['East',   'Fritz',    'Banana',   6274],
   ['West',   'Sravan',   'Pear',     4894],
   ['North',  'Xi',       'Grape',    7580],
   ['South',  'Hector',   'Apple',    9814]
)
for row in range(len(data)):
   ws.write_row(row,0, data[row])
   
ws.autofilter(0, 0, 50, 3)

ws.filter_column(0, 'Region == East')

row = 1
for row_data in (data):
   region = row_data[0]
   
   if region != 'East':
      ws.set_row(row, options={'hidden': True})
      
   ws.write_row(row, 0, row_data)
   
   row += 1
wb.close()

輸出

當我們藉助 Excel 開啟工作表時,我們會發現只有“地區 = 東部”的行可見,其他行被隱藏(您可以透過清除篩選器再次顯示它們)。

Filter Criteria1

column 引數可以是零索引的列號或字串列名。Python 中允許的所有邏輯運算子都可以在條件中使用(==,!=,<,>,<=,>=)。可以在多列上定義篩選條件,並且可以透過 **and** 或 **or** 運算子將它們組合起來。帶有邏輯運算子的條件示例如下:

ws.filter_column('A', 'x > 2000')
ws.filter_column('A', 'x != 2000')
ws.filter_column('A', 'x > 2000 and x<5000')

請注意,條件引數中的“**x**”只是一個形式上的佔位符,可以是任何合適的字串,因為它在內部會被忽略。

ws.filter_column('A', 'price > 2000')
ws.filter_column('A', 'x != 2000')
ws.filter_column('A', 'marks > 60 and x<75')

XlsxWriter 還允許在包含字串資料的列的篩選條件中使用萬用字元“**\***”和“**?**”。

ws.filter_column('A', name=K*') #starts with K
ws.filter_column('A', name=*K*') #contains K
ws.filter_column('A', name=?K*') # second character as K
ws.filter_column('A', name=*K??') #any two characters after K

示例

在下面的示例中,對列 A 的第一個篩選要求區域為西部,對列 D 的第二個篩選的條件為“**units > 5000**”。不滿足條件“**region = West**”或“**units > 5000**”的行將被隱藏。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data = (
   ['Region',  'SalesRep', 'Product', 'Units'],
   ['East',    'Tom',      'Apple',    6380],
   ['West',    'Fred',     'Grape',    5619],
   ['North',   'Amy',      'Pear',     4565],
   ['South',   'Sal',      'Banana',   5323],
   ['East',    'Fritz',    'Apple',    4394],
   ['West',    'Sravan',   'Grape',    7195],
   ['North',   'Xi',       'Pear',     5231],
   ['South',   'Hector',   'Banana',   2427],
   ['East',    'Tom',      'Banana',   4213],
   ['West',    'Fred',     'Pear',     3239],
   ['North',   'Amy',      'Grape',    6520],
   ['South',   'Sal',      'Apple',    1310],
   ['East',    'Fritz',    'Banana',   6274],
   ['West',    'Sravan',   'Pear',     4894],
   ['North',   'Xi',       'Grape',    7580],
   ['South',   'Hector',   'Apple',    9814])
        
for row in range(len(data)):
   ws.write_row(row,0, data[row])
   
ws.autofilter(0, 0, 50, 3)

ws.filter_column('A', 'x == West')
ws.filter_column('D', 'x > 5000')

row = 1
for row_data in (data[1:]):
   region = row_data[0]
   volume = int(row_data[3])
   
   if region == 'West' or volume > 5000:
      pass
   else:
      ws.set_row(row, options={'hidden': True})
      
   ws.write_row(row, 0, row_data)
   row += 1
   
wb.close()

輸出

在 Excel 中,可以在列 A 和 D 標題上看到篩選圖示。篩選後的資料如下所示:

Filter Criteria2

應用列列表篩選器

**filter_column_list()** 方法可用於表示 Excel 2007 樣式中具有多個選定條件的篩選器。

ws.filter_column_list(col,list)

第二個引數是與給定列中的資料匹配的值列表。例如:

ws.filter_column_list('C', ['March', 'April', 'May'])

這將導致篩選資料,以便列 C 中的值與列表中的任何專案匹配。

示例

在下面的示例中,**filter_column_list()** 方法用於篩選區域等於東部或西部的 **行**。

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()
data = (
   ['Region', 'SalesRep', 'Product', 'Units'],
   ['East',   'Tom',      'Apple',    6380],
   ['West',   'Fred',     'Grape',    5619],
   ['North',  'Amy',      'Pear',     4565],
   ['South',  'Sal',      'Banana',   5323],
   ['East',   'Fritz',    'Apple',    4394],
   ['West',   'Sravan',   'Grape',    7195],
   ['North',  'Xi',       'Pear',     5231],
   ['South',  'Hector',   'Banana',   2427],
   ['East',   'Tom',      'Banana',   4213],
   ['West',   'Fred',     'Pear',     3239],
   ['North',  'Amy',      'Grape',    6520],
   ['South',  'Sal',      'Apple',    1310],
   ['East',   'Fritz',    'Banana',   6274],
   ['West',   'Sravan',   'Pear',     4894],
   ['North',  'Xi',       'Grape',    7580],
   ['South',  'Hector',   'Apple',    9814]
)
for row in range(len(data)):
   ws.write_row(row,0, data[row])
   
ws.autofilter(0, 0, 50, 3)

l1= ['East', 'West']
ws.filter_column_list('A', l1)

row = 1
for row_data in (data[1:]):
   region = row_data[0]
   
   if region not in l1:
      ws.set_row(row, options={'hidden': True})
      
   ws.write_row(row, 0, row_data)
   row += 1
   
wb.close()

輸出

列 A 顯示已應用自動篩選器。顯示所有區域為東部或西部的行,其餘行被隱藏。

Column List Filter1

在 Excel 軟體中,單擊 **地區** 標題中的 **篩選器** 選擇器箭頭,我們應該看到已應用區域等於東部或西部的篩選器。

Column List Filter2

Python XlsxWriter - 字型和顏色

使用字型

要對工作表單元格進行格式化,我們需要使用 **add_format()** 方法藉助 Format 物件並使用其屬性或格式化方法對其進行配置。

f1 = workbook.add_format()
f1 = set_bold(True)
# or
f2 = wb.add_format({'bold':True})

然後將此格式物件用作工作表的 write() 方法的引數。

ws.write('B1', 'Hello World', f1)

示例

要使單元格中的文字 **加粗、下劃線、斜體** 或 **刪除線**,我們可以使用這些屬性或相應的 methods。在下面的示例中,文字“Hello World”使用 set 方法編寫。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

for row in range(4):
   ws.write(row,0, "Hello World")

f1=wb.add_format()
f2=wb.add_format()
f3=wb.add_format()
f4=wb.add_format()

f1.set_bold(True)
ws.write('B1', '=A1', f1)

f2.set_italic(True)
ws.write('B2', '=A2', f2)

f3.set_underline(True)
ws.write('B3', '=A3', f3)

f4.set_font_strikeout(True)
ws.write('B4', '=A4', f4)

wb.close()

輸出

結果如下:

Working with Fonts1

示例

另一方面,我們可以使用 **font_color、font_name** 和 **font_size** 屬性來格式化文字,如下例所示:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

for row in range(4):
   ws.write(row,0, "Hello World")
   
f1=wb.add_format({'bold':True, 'font_color':'red'})
f2=wb.add_format({'italic':True,'font_name':'Arial'})
f3=wb.add_format({'font_size':20})
f4=wb.add_format({'font_color':'blue','font_size':14,'font_name':'Times New Roman'})

ws.write('B1', '=A1', f1)
ws.write('B2', '=A2', f2)
ws.write('B3', '=A3', f3)
ws.write('B4', '=A4', f4)

wb.close()

輸出

可以使用 Excel 開啟工作表來驗證上述程式碼的輸出:

Working with Fonts2

文字對齊

XlsxWriter 的 Format 物件也可以使用對齊方法/屬性建立。align 屬性可以具有 **left、right、center** 和 **justify** 值。

示例

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()
for row in range(4):
   ws.write(row,0, "Hello World")
ws.set_column('B:B', 30)

f1=wb.add_format({'align':'left'})
f2=wb.add_format({'align':'right'})
f3=wb.add_format({'align':'center'})
f4=wb.add_format({'align':'justify'})
ws.write('B1', '=A1', f1)
ws.write('B2', '=A2', f2)
ws.write('B3', '=A3', f3)
ws.write('B4', 'Hello World', f4)

wb.close()

輸出

以下輸出顯示具有不同對齊方式的文字“Hello World”。請注意,B 列的寬度由工作表物件的 **set_column()** 方法設定為 30。

Text Alignment1

示例

Format 物件還具有 **valign** 屬性來控制單元格的垂直位置。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

for row in range(4):
   ws.write(row,0, "Hello World")
   
ws.set_column('B:B', 30)

for row in range(4):
   ws.set_row(row, 40)
f1=wb.add_format({'valign':'top'})
f2=wb.add_format({'valign':'bottom'})
f3=wb.add_format({'align':'vcenter'})
f4=wb.add_format({'align':'vjustify'})

ws.write('B1', '=A1', f1)
ws.write('B2', '=A2', f2)
ws.write('B3', '=A3', f3)
ws.write('B4', '=A4', f4)

wb.close()

輸出

在上述程式碼中,使用 set_row() 方法將第 1 行到第 4 行的高度設定為 40。

Text Alignment2

單元格背景色和前景色

Format 物件的兩個重要屬性是 **bg_color** 和 **fg_color**,用於設定單元格的背景色和前景色。

示例

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()
ws.set_column('B:B', 30)

f1=wb.add_format({'bg_color':'red', 'font_size':20})
f2=wb.add_format({'bg_color':'#0000FF', 'font_size':20})

ws.write('B1', 'Hello World', f1)
ws.write('B2', 'HELLO WORLD', f2)
wb.close()

輸出

上述程式碼的結果如下所示:

Cell Background and Foreground Colors

Python XlsxWriter - 數字格式

在 Excel 中,不同的數字資料格式選項在 **設定單元格格式** 選單的 **數字** 選項卡中提供。

Format Cells

要使用 XlsxWriter 控制數字的格式,我們可以使用 **set_num_format()** 方法或定義 **add_format()** 方法的 **num_format** 屬性。

f1 = wb.add_format()
f1.set_num_format(FormatCode)
#or
f1 = wb.add_format('num_format': FormatCode)

Excel 有許多預定義的數字格式。它們可以在數字選項卡的自定義類別下找到,如上圖所示。例如,帶有兩位小數和逗號分隔符的數字的格式程式碼為 #,##0.00。

示例

在下面的示例中,數字 1234.52 使用不同的格式程式碼進行格式化。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()
ws.set_column('B:B', 30)

num=1234.52

num_formats = (
   '0.00',
   '#,##0.00',
   '0.00E+00',
   '##0.0E+0',
   '₹#,##0.00',
)
ws.write('A1', 'Formatted Number')
ws.write('B1', 'Format')

row = 1
for fmt in num_formats:
   format = wb.add_format({'num_format': fmt})
   ws.write_number(row, 0, num, format)
   ws.write_string(row, 1, fmt)
   row += 1
wb.close()

輸出

下圖顯示了已格式化的數字及其使用的格式程式碼:

Formatted Number

Python XlsxWriter - 邊框

本節介紹如何應用和設定單元格邊框以及文字框周圍邊框的外觀。

使用單元格邊框

控制單元格邊框外觀的 **add_format()** 方法中的屬性如下表所示:

描述 屬性 方法
單元格邊框 'border' set_border()
底部邊框 'bottom' set_bottom()
頂部邊框 'top' set_top()
左邊框 'left' set_left()
右邊框 'right' set_right()
邊框顏色 'border_color' set_border_color()
底部顏色 'bottom_color' set_bottom_color()
頂部顏色 'top_color' set_top_color()
左側顏色 'left_color' set_left_color()
右側顏色 'right_color' set_right_color()

請注意,對於add_format() 方法的每個屬性,都有一個對應的以set_propertyname() 方法開頭的格式類方法。

例如,要在單元格周圍設定邊框,我們可以使用add_format() 方法中的 border 屬性,如下所示:

f1= wb.add_format({ 'border':2})

同樣的操作也可以透過呼叫set_border() 方法來完成:

f1 = workbook.add_format()
f1.set_border(2)

各個邊框元素可以透過屬性或格式方法進行配置,如下所示:

  • set_bottom()
  • set_top()
  • set_left()
  • set_right()

這些邊框方法/屬性具有與預定義樣式相對應的整數值,如下表所示:

索引 Name 粗細 樣式
0 0
1 實線 1 -----------
2 實線 2 -----------
3 虛線 1 - - - - - -
4 點線 1 . . . . . .
5 實線 3 -----------
6 雙線 3 ===========
7 實線 0 -----------
8 虛線 2 - - - - - -
9 點劃線 1 - . - . - .
10 點劃線 2 - . - . - .
11 雙點劃線 1 - . . - . .
12 雙點劃線 2 - . . - . .
13 斜點劃線 2 / - . / - .

示例

以下程式碼展示瞭如何使用 border 屬性。這裡,每一行都有一個值為 2 的邊框樣式,對應粗實線。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

f1=wb.add_format({'bold':True, 'border':2, 'border_color':'red'})
f2=wb.add_format({'border':2, 'border_color':'red'})

headings = ['Month', 'Product A', 'Product B']

data = [
   ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June'],
   [10, 40, 50, 20, 10, 50],
   [30, 60, 70, 50, 40, 30],
]

ws.write_row('A1', headings, f1)
ws.write_column('A2', data[0], f2)
ws.write_column('B2', data[1],f2)
ws.write_column('C2', data[2],f2)

wb.close()

輸出

工作表顯示單元格周圍有粗體邊框。

Cell Border

文字框邊框的使用

border 屬性也適用於文字框物件。文字框還有一個 line 屬性,它與 border 屬性類似,因此可以互換使用。邊框本身可以透過 none、color、width 和dash_type 引數進一步設定格式。

將 Line 或 border 設定為 none 表示文字框將沒有任何邊框。dash_type 引數可以是以下任何值:

  • 實線 (solid)
  • 圓點 (round_dot)
  • 方點 (square_dot)
  • 虛線 (dash)
  • 點劃線 (dash_dot)
  • 長劃線 (long_dash)
  • 長點劃線 (long_dash_dot)
  • 長雙點劃線 (long_dash_dot_dot)

示例

這是一個顯示兩個文字框的程式,一個帶有紅色實線邊框;第二個框具有藍色dash_dot 型別邊框。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

ws.insert_textbox('B2', 'Welcome to Tutorialspoint',
{'border': {'color': '#FF9900'}})

ws.insert_textbox('B10', 'Welcome to Tutorialspoint', {
   'line':
   {'color': 'blue', 'dash_type': 'dash_dot'}
})
wb.close()

輸出

輸出工作表顯示文字框邊框。

Textbox Borders

Python XlsxWriter - 超連結

超連結是一個字串,單擊它時,會將使用者帶到其他位置,例如 URL、同一工作簿中的另一個工作表或計算機上的另一個工作簿。Worksheet 類為此提供了write_url() 方法。超連結也可以使用 url 屬性放置在文字框內。

首先,讓我們瞭解write_url() 方法。除了單元格位置外,它還需要指向的 URL 字串。

import xlsxwriter

workbook = xlsxwriter.Workbook('hello.xlsx')
worksheet = workbook.add_worksheet()
worksheet.write_url('A1', 'https://tutorialspoint.tw/index.htm')

workbook.close()

此方法有一些可選引數。一個是 Format 物件,用於配置要顯示的 URL 的字型、顏色屬性。我們還可以指定工具提示字串和 URL 的顯示文字。當文字未給出時,URL 本身將顯示在單元格中。

示例

支援的不同型別的 URL 包括http://https://ftp://mailto:。在下面的示例中,我們使用了這些 URL。

import xlsxwriter

workbook = xlsxwriter.Workbook('hello.xlsx')
worksheet = workbook.add_worksheet()

worksheet.write_url('A1', 'https://tutorialspoint.tw/index.htm')
worksheet.write_url('A3', 'https://:8080')
worksheet.write_url('A5', 'ftp://python.club.tw')
worksheet.write_url('A7', 'mailto:dummy@abc.com')

workbook.close()

輸出

執行上述程式碼,並使用 Excel 開啟hello.xlsx 檔案。

HyperLink1

示例

我們還可以插入指向同一工作簿中的另一個工作表或另一個工作簿的超連結。這可以透過在本地 URI 字首加上internal:external: 來完成。

import xlsxwriter

workbook = xlsxwriter.Workbook('hello.xlsx')
worksheet = workbook.add_worksheet()

worksheet.write_url('A1', 'internal:Sheet2!A1', string="Link to sheet2", tip="Click here")
worksheet.write_url('A4', "external:c:/test/testlink.xlsx", string="Link to other workbook")
   
workbook.close()

輸出

請注意,stringtip 引數作為linktool tip 的替代文字給出。上述程式的輸出如下所示:

HyperLink2

Python XlsxWriter - 條件格式

Excel 使用條件格式根據使用者定義的條件更改區域中單元格的外觀。從條件格式選單中,可以定義包含各種型別值的條件。

Conditional Formatting

在下面顯示的工作表中,A 列包含不同的數字。小於 50 的數字以紅色字型和灰色背景顯示。

Conditional Formatting1

這是透過定義以下條件格式規則實現的:

Conditional Formatting2

conditional_format() 方法

在 XlsxWriter 中,Worksheet 類中定義了一個conditional_format() 方法。為了實現上述結果,conditional_format() 方法的呼叫方式如下面的程式碼所示:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data=[56,95,63,34,81,47,74,5,99,12]
row=0

for num in data:
   ws.write(row,0,num)
   row+=1
f1 = wb.add_format({'bg_color': '#D9D9D9', 'font_color': 'red'})
ws.conditional_format(
   'A1:A10',{
      'type':'cell', 'criteria':'<', 'value':50, 'format':f1
   }
)
wb.close()

引數

conditional_format() 方法的第一個引數是單元格區域,第二個引數是條件格式選項的字典。

選項字典使用以下引數配置條件格式規則:

type 選項是必需引數。其值為 cell、date、text、formula 等。每個引數都有子引數,例如 criteria、value、format 等。

  • Type 是最常見的條件格式型別。當基於簡單條件將格式應用於單元格時使用。

  • Criteria 引數設定用於評估單元格資料的條件。除了 between 和 not between 運算子之外,所有邏輯運算子都是 criteria 引數的可能值。

  • Value 引數是構成規則的 criteria 的運算元。

  • Format 引數是 Format 物件(由add_format() 方法返回)。這定義了要應用於滿足條件的單元格的格式化功能,例如字型、顏色等。

date 型別類似於 cell 型別,並使用相同的 criteria 和 values。但是,value 引數應作為datetime 物件給出。

text 型別指定 Excel 的“特定文字”樣式條件格式。它用於使用 criteria 和 value 引數進行簡單的字串匹配。

示例

當使用formula 型別時,條件格式取決於使用者定義的公式。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data = [
   ['Anil', 45, 55, 50], ['Ravi', 60, 70, 80],
   ['Kiran', 65, 75, 85], ['Karishma', 55, 65, 45]
]   
for row in range(len(data)):
   ws.write_row(row,0, data[row])
   
f1 = wb.add_format({'font_color': 'blue', 'bold':True})

ws.conditional_format(
   'A1:D4',
   {
      'type':'formula', 'criteria':'=AVERAGE($B1:$D1)>60', 'value':50, 'format':f1
   })
wb.close()

輸出

使用 MS Excel 開啟結果工作簿。我們可以看到滿足上述條件的行根據格式物件顯示為藍色。條件格式規則管理器還顯示我們在上述程式碼中設定的條件。

Parameters

Python XlsxWriter - 新增圖表

Excel 最重要的功能之一是將資料轉換為圖表。圖表是資料的直觀表示。可以透過圖表選單生成不同型別的圖表。

Insert Chart

為了以程式設計方式生成圖表,XlsxWriter 庫具有 Chart 類。它的物件是透過呼叫 Workbook 類的add_chart() 方法獲得的。然後,它使用add_series() 方法與工作表中的資料範圍相關聯。然後,使用其insert_chart() 方法將圖表物件插入到工作表中。

示例

以下是顯示簡單柱狀圖的程式碼:

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
chart = wb.add_chart({'type': 'column'})

data = [
   [10, 20, 30,  40,  50],
   [20, 40, 60,  80, 100],
   [30, 60, 90, 120, 150],
]
worksheet.write_column('A1', data[0])
worksheet.write_column('B1', data[1])
worksheet.write_column('C1', data[2])

chart.add_series({'values': '=Sheet1!$A$1:$A$5'})
chart.add_series({'values': '=Sheet1!$B$1:$B$5'})
chart.add_series({'values': '=Sheet1!$C$1:$C$5'})

worksheet.insert_chart('B7', chart)

wb.close()

輸出

生成的圖表嵌入到工作表中,顯示如下:

Add Series

add_series() 方法還有以下附加引數:

  • Values - 這是最重要的必填屬性。它將圖表與它顯示的工作表資料鏈接起來。

  • Categories - 這設定圖表類別標籤。如果沒有給出,圖表將只假設從 1…n 的順序序列。

  • Name - 為序列設定名稱。名稱顯示在公式欄中。

  • Line - 設定序列線型別的屬性,例如顏色和寬度。

  • Border - 設定序列的邊框屬性,例如顏色和樣式。

  • Fill - 設定序列的純色填充屬性,例如顏色。

  • Pattern - 設定序列的圖案填充屬性。

  • Gradient - 設定序列的漸變填充屬性。

  • data_labels - 為序列設定資料標籤。

  • Points - 為序列中的各個點設定屬性。

在下面的示例中,在新增資料序列時,定義了 value 和 categories 屬性。示例資料為:

# Add the worksheet data that the charts will refer to.
headings = ['Name', 'Phy', 'Maths']
data = [
   ["Jay",   30, 60],
   ["Mohan", 40, 50],
   ["Veeru", 60, 70],
]

建立圖表物件後,第一個資料序列對應於以 phy 作為 name 屬性值的列。第一列中的學生姓名用作類別。

chart1.add_series({
   'name': '=Sheet1!$B$1',
   'categories': '=Sheet1!$A$2:$A$4',
   'values': '=Sheet1!$B$2:$B$4',
})

第二個資料序列也參考 A 列中的姓名作為類別,以及標題為 Maths 的 C 列作為 values 屬性。

chart1.add_series({
   'name': ['Sheet1', 0, 2],
   'categories': ['Sheet1', 1, 0, 3, 0],
   'values': ['Sheet1', 1, 2, 3, 2],
})

示例

這是完整的示例程式碼:

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
chart1 = wb.add_chart({'type': 'column'})

# Add the worksheet data that the charts will refer to.
headings = ['Name', 'Phy', 'Maths']
data = [
   ["Jay",   30, 60],
   ["Mohan", 40, 50],
   ["Veeru", 60, 70],
]

worksheet.write_row(0,0, headings)
worksheet.write_row(1,0, data[0])
worksheet.write_row(2,0, data[1])
worksheet.write_row(3,0, data[2])

chart1.add_series({
   'name': '=Sheet1!$B$1',
   'categories': '=Sheet1!$A$2:$A$4',
   'values': '=Sheet1!$B$2:$B$4',
})

chart1.add_series({
   'name': ['Sheet1', 0, 2],
   'categories': ['Sheet1', 1, 0, 3, 0],
   'values': ['Sheet1', 1, 2, 3, 2],
})

worksheet.insert_chart('B7', chart1)

wb.close()

輸出

工作表及其基礎圖表如下所示:

Add Series1

add_series() 方法還有data_labels 屬性。如果設定為 True,則繪製資料點的值將顯示在每一列的頂部。

示例

以下是 add_series() 方法的完整程式碼示例:

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
chart1 = wb.add_chart({'type': 'column'})

# Add the worksheet data that the charts will refer to.
headings = ['Name', 'Phy', 'Maths']
data = [
   ["Jay",   30, 60],
   ["Mohan", 40, 50],
   ["Veeru", 60, 70],
]

worksheet.write_row(0,0, headings)
worksheet.write_row(1,0, data[0])
worksheet.write_row(2,0, data[1])
worksheet.write_row(3,0, data[2])

chart1.add_series({
   'name': '=Sheet1!$B$1',
   'categories': '=Sheet1!$A$2:$A$4',
   'values': '=Sheet1!$B$2:$B$4',
   'data_labels': {'value':True},
})
chart1.add_series({
   'name': ['Sheet1', 0, 2],
   'categories': ['Sheet1', 1, 0, 3, 0],
   'values': ['Sheet1', 1, 2, 3, 2],
   'data_labels': {'value':True},
})
worksheet.insert_chart('B7', chart1)

wb.close()

輸出

執行程式碼並開啟Hello.xlsx柱狀圖現在顯示了資料標籤。

Hello Xlsx

資料標籤可以顯示在所有型別的圖表中。資料標籤的位置引數可以設定為頂部、底部、左側或右側。

XlsxWriter 支援以下型別的圖表:

  • Area - 建立區域(填充線)樣式圖表。

  • Bar - 建立條形樣式(轉置直方圖)圖表。

  • Column - 建立柱形樣式(直方圖)圖表。

  • Line - 建立線條樣式圖表。

  • Pie - 建立餅圖樣式圖表。

  • Doughnut - 建立環形圖樣式圖表。

  • Scatter - 建立散點圖樣式圖表。

  • Stock - 建立股票樣式圖表。

  • Radar - 建立雷達圖樣式圖表。

許多圖表型別也有子型別。例如,柱狀圖、條形圖、區域圖和折線圖的子型別有堆疊和percent_stacked。型別和子型別引數可以在add_chart() 方法中給出。

workbook.add_chart({'type': column, 'subtype': 'stacked'})

圖表使用其insert_chart() 方法嵌入到工作表中,該方法採用以下引數:

worksheet.insert_chart(location, chartObj, options)

options 引數是一個字典,用於配置圖表的定位和比例。選項屬性及其預設值為:

{
   'x_offset':        0,
   'y_offset':        0,
   'x_scale':         1,
   'y_scale':         1,
   'object_position': 1,
   'description':     None,
   'decorative':      False,
}

x_offsety_offset 值以畫素為單位,而x_scaley_scale 值用於水平/垂直縮放圖表。description 欄位可用於為圖表指定說明或“替代文字”字串。

decorative 引數用於將圖表標記為裝飾性的,因此對於自動螢幕閱讀器來說是不提供資訊的。它必須設定為 True/False。最後,object_position 引數控制圖表的物件定位。它允許以下值:

  • 1 - 與單元格一起移動和調整大小(預設值)。

  • 2 - 移動但不與單元格一起調整大小。

  • 3 - 不與單元格一起移動或調整大小。

Python XlsxWriter - 圖表格式

可以自定義圖表的預設外觀,使其更具吸引力、更具解釋性和更方便使用者使用。使用XlsxWriter,我們可以對 Chart 物件進行以下增強:

  • 設定和格式化圖表標題

  • 設定 X 軸和 Y 軸標題和其他引數

  • 配置圖表圖例

  • 圖表佈局選項

  • 設定邊框和圖案

標題

您可以透過呼叫其set_title() 方法來設定和配置圖表物件的標題。可以使用各種引數,如下所示:

  • Name - 設定要在圖表上方顯示的圖表名稱(標題)。name 屬性是可選的。預設情況下沒有圖表標題。

  • name_font − 設定圖表標題的字型屬性。

  • Overlay - 允許標題疊加在圖表上。

  • 佈局 − 設定圖表標題的 (x, y) 位置(相對單位)。

  • − Excel 會自動新增圖表標題。選擇“無”選項將關閉此預設標題。它還會關閉所有其他 set_title() 選項。

X 軸和 Y 軸

使用兩種方法 set_x_axis()set_y_axis() 設定軸標題,name_font 用於標題文字的字型,num_font 用於顯示在 X 軸和 Y 軸上的數字。

  • name − 設定軸的標題或說明。

  • name_font − 設定軸標題的字型屬性。

  • num_font − 設定軸數字的字型屬性。

  • num_format − 設定軸的數字格式。

  • major_gridlines − 配置軸的主網格線。

  • display_units − 設定軸的顯示單位。

在前面的示例中,marklist 的資料已以柱狀圖的形式顯示,我們設定了圖表格式選項,例如圖表標題以及 X 軸和 Y 軸的標題及其其他顯示屬性,如下所示:

chart1.set_x_axis(
   {'name': 'Students', 'name_font':{'name':'Arial', 'size':16, 'bold':True},})
chart1.set_y_axis(
   {
      'name': 'Marks', 'name_font':
      {'name':'Arial', 'size':16, 'bold':True}, 'num_font':{'name':'Arial', 'italic':True}
   }
)

示例

將上述程式碼片段新增到完整程式碼中。現在它看起來如下所示:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
chart1 = wb.add_chart({'type': 'column'})

# Add the worksheet data that the charts will refer to.
headings = ['Name', 'Phy', 'Maths']

data = [
   ["Jay", 30, 60],
   ["Mohan", 40, 50],
   ["Veeru", 60, 70],
]

worksheet.write_row(0,0, headings)
worksheet.write_row(1,0, data[0])
worksheet.write_row(2,0, data[1])
worksheet.write_row(3,0, data[2])

chart1.add_series({
   'name': '=Sheet1!$B$1',
   'categories': '=Sheet1!$A$2:$A$4',
   'values': '=Sheet1!$B$2:$B$4',
})

chart1.add_series({
   'name': ['Sheet1', 0, 2],
   'categories': ['Sheet1', 1, 0, 3, 0],
   'values': ['Sheet1', 1, 2, 3, 2],
})
chart1.set_title ({'name': 'Marklist',
   'name_font': {'name':'Times New Roman', 'size':24}
})
chart1.set_x_axis({'name': 'Students',
   'name_font': {'name':'Arial', 'size':16, 'bold':True},
})
chart1.set_y_axis({'name': 'Marks',
   'name_font':{'name':'Arial', 'size':16, 'bold':True},
   'num_font':{'name':'Arial', 'italic':True}
})
worksheet.insert_chart('B7', chart1)

wb.close()

輸出

圖表顯示標題座標軸標題如下所示:

Title Axes

Python XlsxWriter - 圖例

根據圖表型別,資料以不同顏色或圖案的柱狀、條形、線形、弧形等形式直觀地表示。圖表圖例使您可以輕鬆快速地瞭解哪種顏色/圖案對應於哪個資料系列。

使用圖表圖例

要設定圖例並配置其屬性(例如位置和字型),XlsxWriter 有set_legend() 方法。屬性如下:

  • − 在 Excel 圖表中,圖例預設情況下處於啟用狀態。none=True 選項將關閉圖表圖例。

  • 位置 − 設定圖表圖例的位置。可以設定為頂部、底部、左側、右側、無。

  • 字型 − 設定圖表圖例的字型屬性(如名稱、大小、粗體、斜體等)。

  • 邊框 − 設定圖例的邊框屬性,例如顏色和樣式。

  • 填充 − 設定圖例的純色填充屬性,例如顏色。

  • 圖案 − 設定圖例的圖案填充屬性。

  • 漸變 − 設定圖例的漸變填充屬性。

圖表的一些圖例屬性設定如下:

chart1.set_legend(
   {'position':'bottom', 'font': {'name':'calibri','size': 9, 'bold': True}}
)

示例

以下是根據上述特性顯示圖例的完整程式碼:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
chart1 = wb.add_chart({'type': 'column'})

# Add the worksheet data that the charts will refer to.
headings = ['Name', 'Phy', 'Maths']
data = [
   ["Jay", 30, 60],
   ["Mohan", 40, 50],
   ["Veeru", 60, 70],
]

worksheet.write_row(0,0, headings)
worksheet.write_row(1,0, data[0])
worksheet.write_row(2,0, data[1])
worksheet.write_row(3,0, data[2])
chart1.add_series({
   'name': '=Sheet1!$B$1',
   'categories': '=Sheet1!$A$2:$A$4',
   'values': '=Sheet1!$B$2:$B$4',
})
chart1.add_series({
   'name': ['Sheet1', 0, 2],
   'categories': ['Sheet1', 1, 0, 3, 0],
   'values': ['Sheet1', 1, 2, 3, 2],
})
chart1.set_title ({'name': 'Marklist', 'name_font':
   {'name':'Times New Roman', 'size':24}})

chart1.set_x_axis({'name': 'Students', 'name_font':
   {'name':'Arial', 'size':16, 'bold':True},})

chart1.set_y_axis({'name': 'Marks','name_font':
   {'name':'Arial', 'size':16, 'bold':True},
   'num_font':{'name':'Arial', 'italic':True}})

chart1.set_legend({'position':'bottom', 'font':
   {'name':'calibri','size': 9, 'bold': True}})

worksheet.insert_chart('B7', chart1)

wb.close()

輸出

圖表在 X 軸標題下方顯示圖例。

Legend

在圖表中,對應於物理數學的列以不同的顏色顯示。圖表右側的小彩色方塊符號是圖例,顯示哪種顏色對應於物理數學

Python XlsxWriter - 條形圖

條形圖類似於柱狀圖,只是資料以成比例的水平條形而不是垂直列表示。要製作條形圖,必須將add_chart() 方法的 type 引數設定為“bar”。

chart1 = workbook.add_chart({'type': 'bar'})

條形圖如下所示:

Bar Chart1

條形圖有兩種子型別,即堆疊和百分比堆疊。在堆疊圖中,某個類別的不同顏色的條形一個接一個地放置。在百分比堆疊圖中,每個條形的長度顯示其在每個類別總值中的百分比。

chart1 = workbook.add_chart({
   'type': 'bar',
   'subtype': 'percent_stacked'
})

示例

生成百分比堆疊條形圖的程式如下所示:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
chart1 = wb.add_chart({'type': 'bar', 'subtype': 'percent_stacked'})

# Add the worksheet data that the charts will refer to.
headings = ['Name', 'Phy', 'Maths']
data = [
   ["Jay", 30, 60],
   ["Mohan", 40, 50],
   ["Veeru", 60, 70],
]

worksheet.write_row(0,0, headings)
worksheet.write_row(1,0, data[0])
worksheet.write_row(2,0, data[1])
worksheet.write_row(3,0, data[2])

chart1.add_series({
   'name': '=Sheet1!$B$1',
   'categories': '=Sheet1!$A$2:$A$4',
   'values': '=Sheet1!$B$2:$B$4',
})

chart1.add_series({
   'name': ['Sheet1', 0, 2],
   'categories': ['Sheet1', 1, 0, 3, 0],
   'values': ['Sheet1', 1, 2, 3, 2],
})
chart1.set_title ({'name': 'Marklist', 'name_font':
   {'name':'Times New Roman', 'size':24}})

chart1.set_x_axis({'name': 'Students', 'name_font':
   {'name':'Arial', 'size':16, 'bold':True}, })

chart1.set_y_axis({'name': 'Marks','name_font':
   {'name':'Arial', 'size':16, 'bold':True},
   'num_font':{'name':'Arial', 'italic':True}})

chart1.set_legend({'position':'bottom', 'font':
   {'name':'calibri','size': 9, 'bold': True}})

worksheet.insert_chart('B7', chart1)

wb.close()

輸出

輸出檔案將如下所示:

Bar Chart2

Python XlsxWriter - 折線圖

一條線顯示一系列資料點,這些資料點沿 X 軸用一條線連線起來。這是一個獨立軸,因為 X 軸上的值不依賴於垂直 Y 軸。

Y 軸是一個依賴軸,因為其值取決於 X 軸,結果是水平發展的線。

使用 XlsxWriter 線形圖

要使用 XlsxWriter 以程式設計方式生成線形圖,我們使用add_series()。圖表物件的型別定義為“line”。

示例

在下面的示例中,我們將繪製一個線形圖,顯示兩種產品在六個月內的銷售額。使用add_series() 方法將對應於產品 A 和產品 B 銷售額的兩個資料系列新增到圖表中。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
headings = ['Month', 'Product A', 'Product B']

data = [
   ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June'],
   [10, 40, 50, 20, 10, 50],
   [30, 60, 70, 50, 40, 30],
]

bold=wb.add_format({'bold':True})
worksheet.write_row('A1', headings, bold)
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])
worksheet.write_column('C2', data[2])

chart1 = wb.add_chart({'type': 'line'})

chart1.add_series({
   'name': '=Sheet1!$B$1',
   'categories': '=Sheet1!$A$2:$A$7',
   'values': '=Sheet1!$B$2:$B$7',
})
chart1.add_series({
   'name': ['Sheet1', 0, 2],
   'categories': ['Sheet1', 1, 0, 6, 0],
   'values': ['Sheet1', 1, 2, 6, 2],
})
chart1.set_title ({'name': 'Sales analysis'})
chart1.set_x_axis({'name': 'Months'})
chart1.set_y_axis({'name': 'Units'})

worksheet.insert_chart('D2', chart1)

wb.close()

輸出

執行上述程式後,XlsxWriter 將生成線形圖,如下所示:

Sales Analysis

除了data_labels 之外,add_series() 方法還具有marker 屬性。這線上形圖中尤其有用。資料點由標記符號指示,例如圓形、三角形、正方形、菱形等。讓我們在此圖表的兩個資料系列中分別指定圓形正方形符號。

chart1.add_series({
   'name': '=Sheet1!$B$1',
   'categories': '=Sheet1!$A$2:$A$7',
   'values': '=Sheet1!$B$2:$B$7',
   'data_labels': {'value': True},
   'marker': {'type': 'circle'},
})
chart1.add_series({
   'name': ['Sheet1', 0, 2],
   'categories': ['Sheet1', 1, 0, 6, 0],
   'values': ['Sheet1', 1, 2, 6, 2],
   'data_labels': {'value': True},
   'marker': {'type': 'square'},})

資料標籤和標記已新增到線形圖中。

Sales Analysis1

線形圖還支援堆疊百分比堆疊子型別。

Sales Analysis2

Python XlsxWriter - 餅圖

餅圖是將單個數據系列表示為圓形,該圓形被劃分為對應於系列中每個資料項的扇區。在餅圖中,每個扇區的弧長與其表示的數量成正比。在下面的工作表中,產品的季度銷售額以餅圖的形式顯示。

Pie Chart Of Quarterly Sales

使用 XlsxWriter 餅圖

要使用 XlsxWriter 以程式設計方式生成上述圖表,我們首先將以下資料寫入工作表。

headings = ['Category', 'Values']
data = [
   ['Q1', 'Q2', 'Q3', 'Q4'],
   [125, 60, 100, 80],
]
worksheet.write_row('A1', headings, bold)
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])

宣告一個type=pie 的 Chart 物件,並將單元格範圍 B1:D1 用作add_series() 方法的值引數,A 列中的季度 (Q1、Q2、Q3 和 Q4) 是類別。

chart1.add_series({
   'name': 'Quarterly sales data',
   'categories': ['Sheet1', 1, 0, 4, 0],
   'values': ['Sheet1', 1, 1, 4, 1],
})
chart1.set_title({'name': 'Pie Chart of Quarterly Sales'})

餅圖中,我們可以使用data_labels 屬性透過設定percentage=True 來表示每個餅的百分比值。

示例

生成餅圖的完整程式如下所示:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()

headings = ['Category', 'Values']
data = [
   ['Q1', 'Q2', 'Q3', 'Q4'],
   [125, 60, 100, 80],
]
bold=wb.add_format({'bold':True})
worksheet.write_row('A1', headings, bold)
worksheet.write_column('A2', data[0])
worksheet.write_column('B2', data[1])

chart1 = wb.add_chart({'type': 'pie'})
chart1.add_series({
   'name': 'Quarterly sales data',
   'categories': ['Sheet1', 1, 0, 4, 0],
   'values': ['Sheet1', 1, 1, 4, 1],
   'data_labels': {'percentage':True},
})
chart1.set_title({'name': 'Pie Chart of Quarterly Sales'})

worksheet.insert_chart('D2', chart1)

wb.close()

輸出

看看上述程式生成的餅圖。

Pie Chart Of Quarterly Sales1

環形圖

環形圖是餅圖的一種變體,中心有一個孔,它將類別顯示為弧而不是扇區。兩者都使一目瞭然地掌握部分與整體的關係變得容易。只需將圖表型別更改為doughnut

chart1 = workbook.add_chart({'type': 'doughnut'})

上述示例中資料的環形圖如下所示:

Doughnut Chart

Python XlsxWriter - 迷你圖

迷你圖是一個小型圖表,沒有座標軸或座標。它表示某個引數的變化。普通圖表尺寸較大,具有許多解釋性特徵,例如標題、圖例、資料標籤等,並且與伴隨文字分開。另一方面,迷你圖尺寸較小,可以嵌入到文字或包含其上下文的單元格中。

迷你圖功能由 Edward Tufte 於 1983 年引入。Microsoft 在 Excel 2010 中引入了迷你圖。我們可以在 Excel 軟體的插入功能區中找到迷你圖選項。

迷你圖有三種類型:

  • line − 類似於線形圖

  • column − 類似於柱狀圖

  • win_loss − 每個值是正數(贏)還是負數(輸)。

使用 XlsxWriter 迷你圖

XlsxWriter 模組具有add_sparkline() 方法。它基本上需要迷你圖的單元格位置以及要表示為迷你圖的資料範圍。可選地,其他引數(例如型別、樣式等)以字典物件的格式提供。預設情況下,型別為 line。

示例

以下程式以線形迷你圖和柱形迷你圖表示相同的一組數字。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data=[12,23,9,17,31,3,7,21,10,15]

ws.write_row('A1', data)
ws.set_column('K:K', 40)
ws.set_row(0, 30)
ws.add_sparkline('K1', {'range':'Sheet1!A1:J1'})

ws.write_row('A5', data)
ws.set_column('K:K', 40)
ws.set_row(4, 30)
ws.add_sparkline('K5', {'range':'Sheet1!A5:J5', 'type':'column'})

wb.close()

輸出

在 K 單元格中添加了迷你圖。

Sparklines

屬性如下:

  • range − 是必需引數。它指定迷你圖將繪製的單元格資料範圍。

  • type − 指定迷你圖的型別。有 3 種可用的迷你圖型別:line、column 和 win_loss。

  • markers − 為線型迷你圖開啟標記。

  • style − MS Excel 中定義的迷你圖樣式。有 36 種樣式型別。

  • negative_points − 如果設定為 True,則迷你圖中的負點將突出顯示。

示例

以下程式生成帶標記線形迷你圖和帶突出顯示負點的win_loss 迷你圖

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data=[12,23,9,17,31,3,7,21,10,15]
ws.write_row('A1', data)
ws.set_column('K:K', 40)
ws.set_row(0, 30)

data=[1,1,-1,-1,-1,1,1,1,-1,-1]
ws.write_row('A5', data)
ws.set_column('K:K', 40)
ws.set_row(4, 30)
ws.add_sparkline('K1', {'range':'Sheet1!A1:J1', 'markers':True})
ws.add_sparkline('K5', {'range':'Sheet1!A5:J5', 'type':'win_loss',
'negative_points':True})

wb.close()

輸出

K1 中的線形迷你圖帶有標記。K5 中的迷你圖顯示負點突出顯示。

Line Sparkline

示例 – 樣式型別

以下程式碼以柱形迷你圖顯示一系列數字。這裡使用了十種不同的樣式型別。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data=[12,23,9,17,31,3,7,21,10,15]
ws.write_row('C3', data)
ws.set_column('B:B',40)

for i in range(1,11):
   ws.write(i+4,0, 'style {}'.format(i))
   ws.add_sparkline(i+4,1,
   {'range':'Sheet1!$C$3:$L$3',
   'type':'column',
   'style':i})
   
wb.close()

輸出

它將產生以下輸出:

Column Sparkline

Python XlsxWriter - 資料驗證

Excel 中的資料驗證功能允許您控制使用者可以輸入單元格的內容。您可以使用它來確保單元格中的值是指定範圍內的數字/日期、具有所需長度的文字,或者提供下拉選單以從中選擇值。

資料驗證工具位於“資料”選單中。第一個選項卡允許您設定驗證條件。下圖顯示該條件要求單元格應包含 1 到 25 之間的整數:

Data Validation

在第二個選項卡中,設定當用戶的遊標位於目標單元格(在本例中為“輸入 1 到 25 之間的任何整數”)時要顯示的訊息。您還可以設定訊息標題;在本例中為年齡。

Data Validation1

第三個選項卡允許您定義如果驗證條件失敗則要顯示的任何錯誤訊息。

Data Validation2

當用戶將游標放在 I10(已設定驗證)中時,您可以看到輸入訊息。

Age1

當輸入的數字不在範圍內時,將顯示錯誤訊息。

Age2

使用 XlsxWriter 資料驗證

您可以使用data_validation() 方法以程式設計方式設定驗證條件、輸入和錯誤訊息。

worksheet.data_validation(
   'I10',
   {
      'validate': 'integer','criteria': 'between',
      'minimum': 1,'maximum': 25,
      'input_title': 'Enter an integer:',
      'input_message': 'between 1 and 25',
      'error_title': 'Input value is not valid!',
      'error_message': 'It  should be an integer between 1 and 25'
   }
)

data_validation() 方法接受 options 引數作為包含以下引數的字典:

  • validate − 用於設定要驗證的資料型別。允許的值包括整數、小數、列表、日期、時間、長度等。

  • criteria − 用於設定驗證條件。可以設定為任何邏輯運算子,包括between/not between==!=<><=>= 等。

  • value − 設定應用條件的限制值。始終需要此值。使用列表驗證時,它作為逗號分隔的值字串給出。

  • input_title − 用於設定將游標放在目標單元格時輸入訊息的標題。

  • input_message − 輸入單元格時要顯示的訊息。

  • error_title − 驗證條件未滿足時要顯示的錯誤訊息的標題。

  • error_message − 設定錯誤訊息。預設錯誤訊息為“您輸入的值無效。使用者已限制可以輸入單元格的值”。

示例

data_validation() 方法的以下用法會導致資料驗證功能的行為如上圖所示。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()

worksheet.data_validation(
   'I10',
   {
      'validate': 'integer','criteria': 'between',
      'minimum': 1,'maximum': 25,
      'input_title': 'Enter an integer:',
      'input_message': 'between 1 and 25',
      'error_title': 'Input value is not valid!',
      'error_message':'It should be an integer between 1 and 25'
   }
)
wb.close()

作為另一個示例,單元格 I10 設定了驗證條件,以便強制使用者從下拉列表中的字串列表中選擇其值。

worksheet.data_validation(
   'I10',
   {
      'validate': 'list',
      'source': ['Mumbai', 'Delhi', 'Chennai', 'Kolkata'],
      'input_title': 'Choose one:',
      'input_message': 'Select a value from th list',
   }
)

示例

帶有下拉列表的修改後的驗證程式如下所示:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()

worksheet.data_validation(
   'I10',
   {
      'validate': 'list',
      'source': ['Mumbai', 'Delhi', 'Chennai', 'Kolkata'],
      'input_title': 'Choose one:',
      'input_message': 'Select a value from the list',
   }
)
wb.close()

輸出

將游標放在 I10 單元格中時,將出現下拉列表:

Dropdown List

示例

如果要讓使用者輸入長度大於 5 的字串,請使用>= 作為條件並將值設定為 5。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()

worksheet.data_validation(
   'I10',{
      'validate': 'length',
      'criteria': '>=','value': 5,'input_title': 'Enter name:',
      'input_message': 'Minimum length 5 character',
      'error_message':'Name should have at least 5 characters'
   }
)

wb.close()

輸出

如果字串的字元少於 5 個,則會彈出錯誤訊息,如下所示:

String

Python XlsxWriter - 大綱和分組

在 Excel 中,您可以對具有特定列(或行)相同值的行列進行分組,以便可以透過單擊滑鼠即可隱藏或顯示它們。此功能稱為大綱和分組。它有助於顯示小計或彙總。此功能可以在 MS Excel 軟體的資料→大綱組中找到。

要使用此功能,資料範圍必須使所有行都按一列中的值排序。假設我們有不同商品的銷售額。按商品名稱對範圍進行排序後,單擊“大綱”組中的“小計”選項。將彈出以下對話方塊。

Outline

工作表顯示按商品的小計銷售額,最後顯示總計。在工作表的左側,顯示大綱級別。原始資料位於級別 3,小計位於級別 2,總計位於級別 1。

Item And Sales

使用大綱和分組

要使用XlsxWriter實現此功能,我們需要使用set_row()方法的level屬性。資料行設定為級別2。

ws.set_row(row, None, None, {'level': 2})

小計行級別為1。

ws.set_row(row, None, None, {'level': 1})

我們使用SUBTOTAL()函式來計算和顯示一組中銷售額的總和。

示例

完整的程式碼如下所示:

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

headings=['Item', 'Sales']
data=[
   ['Apple', 45], ['Apple', 84], ['Apple', 125],
   ['Mango', 32], ['Mango', 65], ['Mango', 90],
   ['Oranges', 60], ['Oranges', 75], ['Oranges',100],
]
ws.write_row('A1', headings)
item='Apple'
rownum=1
startrow=1
for row in data:
   if row[0]==item:
      ws.set_row(rownum, None, None, {'level': 2})
      ws.write_row(rownum,0, row)
      rownum+=1
else:
   ws.set_row(rownum, None, None, {'level': 1})
   ws.write(rownum, 0, item+' Subtotal')
   cellno='B{}:B{}'.format(startrow,rownum)
   print (cellno)
   ws.write(rownum,1,'=SUBTOTAL(9,'+cellno+')')
   # rownum+=1
   item=data[rownum][0]
   rownum+=1
   ws.set_row(rownum, None, None, {'level': 2})
   ws.write_row(rownum,0, row)
   rownum+=1
   startrow=rownum
else:
   ws.set_row(rownum, None, None, {'level': 1})
   ws.write(rownum, 0, item+' Subtotal')
   cellno='B{}:B{}'.format(startrow,rownum)
   ws.write(rownum,1,'=SUBTOTAL(9,'+cellno+')')
rownum+=1
ws.write(rownum, 0, 'Grand Total')
cellno='B{}:B{}'.format(1,rownum)
ws.write(rownum,1,'=SUBTOTAL(9,'+cellno+')')

wb.close()

輸出

執行程式碼並使用Excel開啟hello.xlsx。我們可以看到,大綱顯示在左側。

Outlines

在每一級,減號表示可以摺疊行,並且只顯示小計行。

Subtotal Row

此圖顯示所有級別為2的行都已摺疊。現在顯示了大綱中的加號,這意味著可以展開資料行。如果單擊級別1處的減號,則工作表中將只剩下總計。

Grand Total

Python XlsxWriter - 凍結和拆分窗格

freeze_panes()方法

XlsxWriter庫中Worksheet物件的freeze_panes()方法將工作表劃分為水平或垂直區域,稱為窗格,並“凍結”這些窗格中的一個或兩個,以便如果我們向下滾動或向右滾動,窗格(分別為頂部或左側)將保持靜止。

該方法需要引數rowcol來指定分割的位置。需要注意的是,分割是在單元格的頂部或左側指定的,並且該方法使用基於零的索引。如果不需要垂直或水平分割,可以將row和col引數之一設定為零。

示例

以下示例中的工作表在每一行顯示列號的遞增倍數,以便每個單元格顯示行號和列號的乘積。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
format1=wb.add_format({'bg_color':'#D9D9D9', 'bold':True})

for col in range(0, 15):
   worksheet.write(0, col, col+1, format1)
   
for row in range(1, 51):
   for col in range(0,15):
      if col==0:
         worksheet.write(row,col,(col+1)*(row + 1), format1)
      else:
         worksheet.write(row,col,(col+1)*(row + 1))
# Freeze pane on the top row.
worksheet.freeze_panes(1, 0)

wb.close()

輸出

然後,我們凍結頂行窗格。因此,開啟工作表後,如果單元格指標向下滾動,頂行將始終保留在工作表上。

Top Row

同樣,我們可以使第一列保持靜止。

# Freeze pane on the first column.
worksheet.freeze_panes(0, 1)

下面的螢幕截圖顯示,即使我們向右滾動,A列仍然可見。

Column A

透過將freeze_panes()方法中的row和column引數設定為1,頂行和最左列都將被凍結。

# Freeze pane on the first row, first column.
worksheet.freeze_panes(1, 1)

開啟生成的工作表並滾動單元格游標。您會發現頂行和最左列中的行號和列號(已格式化為粗體並帶有背景顏色)始終可見。

Freeze Panes

split_panes()方法

split_panes()方法也把工作表分成水平或垂直區域,稱為窗格,但與freeze_panes()方法不同的是,窗格之間的分割線對使用者可見,並且每個窗格都有自己的捲軸。

該方法具有引數“y”和“x”,用於指定分割的垂直和水平位置。這些引數以Excel使用的行高和列寬表示。行高和列寬的預設值分別為行15和列8.43。

如果不需要垂直或水平分割,可以將“y”和“x”引數之一設定為零。

要在第10行和第7列建立分割線,可以使用split_panes()方法,如下所示:

worksheet.split_panes(15*10, 8.43*7)

您會在工作表的第10行和第7列找到分割線。您可以將垂直分割線左右兩側的窗格以及水平分割線上下兩側的窗格滾動。請注意,其他窗格將保持不變。

示例

以下是建立分割線的完整程式碼,以及其輸出:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
format1=wb.add_format({'bg_color':'#D9D9D9', 'bold':True})

for col in range(0, 15):
   worksheet.write(0, col, col+1, format1)
   
for row in range(1, 51):
   for col in range(0,15):
      if col==0:
         worksheet.write(row,col,(col+1)*(row + 1), format1)
      else:
         worksheet.write(row,col,(col+1)*(row + 1))
worksheet.split_panes(15*10, 8.43*7)

wb.close()

輸出

執行程式碼並使用Excel開啟hello.xlsx。我們可以看到,工作表在第10行和第7列被分成了不同的窗格。

Split Panes

Python XlsxWriter - 隱藏/保護工作表

工作表物件的hide()方法使工作表消失,直到透過Excel選單取消隱藏。

在下面的工作表中,共有三個工作表,其中sheet2是隱藏的。

sheet1 = workbook.add_worksheet()
sheet2 = workbook.add_worksheet()
sheet3 = workbook.add_worksheet()

# Hide Sheet2. It won't be visible until it is unhidden in Excel.
worksheet2.hide()

它將建立以下工作表:

Hide

您不能隱藏“活動”工作表(通常是第一個工作表),因為這會導致Excel錯誤。因此,為了隱藏第一個工作表,您需要啟用另一個工作表。

sheet2.activate()
sheet1.hide()

隱藏特定行或列

要在工作表中隱藏特定行或列,請在set_row()set_column()方法中將hidden引數設定為1。以下語句隱藏活動工作表中的C、D和E列。

worksheet.set_column('C:E', None, None, {'hidden': 1})

示例

考慮以下程式:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
format1=wb.add_format({'bg_color':'#D9D9D9', 'bold':True})

for col in range(0, 15):
   worksheet.write(0, col, col+1, format1)
   
for row in range(1, 51):
   for col in range(0,15):
      if col==0:
         worksheet.write(row,col,(col+1)*(row + 1), format1)
      else:
         worksheet.write(row,col,(col+1)*(row + 1))
worksheet.set_column('C:E', None, None, {'hidden': 1})

wb.close()

輸出

執行上述程式碼後,下面的工作表中C、D和E列不可見:

Hide Column

類似地,我們可以使用set_row()方法和hidden引數隱藏行。

for row in range(5, 7):
   worksheet.set_row(row, None, None, {'hidden':1})

結果如下:

Hide Row

Python XlsxWriter - 文字框

在Excel中,文字框是一個可以放置在工作表任何位置的圖形物件,如果需要,可以隨意移動。可以在文字框中包含的文字上應用所需的格式化功能,例如字型(顏色、大小、名稱等)、對齊方式、填充效果、方向等。

使用XlsxWriter – 文字框

在XlsxWriter中,有一個insert_textbox()方法用於在工作表上放置文字框。必須給出文字框的單元格位置和要寫入其中的文字。此外,不同的格式選項以字典物件的格式給出。

示例

以下程式碼在C5單元格顯示一個文字框,給定的字串將使用如下所示的字型和對齊屬性顯示:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
text = 'Welcome to TutorialsPoint'

options = {'font': {'color': 'red','size': 14},
   'align': {'vertical': 'middle','horizontal': 'center'}}
worksheet.insert_textbox('C5', text, options)

wb.close()

輸出

使用Excel應用程式開啟工作表“hello.xlsx”。文字框如下所示:

Text Box

文字框選項 – 填充

文字框的預設大小為192 x 120畫素(對應於3列和6行)。可以使用以畫素為單位的width和height引數更改此大小。inset_textbox()方法可接受的引數之一是fill引數。它採用預定義的色名或十六進位制表示的顏色作為值。

示例

以下程式碼在一個自定義大小的文字框中顯示一個多行字串,背景填充為紅色。

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
text = 'TutorialsPoint - Simple Easy Learning\nThe best resource for Online Education'

options = {
   'width': 384,
   'height':80,
   'font': {'color': 'blue', 'bold':True, 'size': 14},
   'align': {'vertical': 'middle', 'horizontal': 'center'},
   'fill':{'color':'red'},
}
worksheet.insert_textbox('C5', text, options)
wb.close()

如下圖所示,在C5單元格呈現了一個包含多行的文字框。

Text Box With Multiple Lines

文字框選項 – text_rotation

另一個重要的屬性是text_rotation。預設情況下,文字水平顯示。如果需要,可以透過給定一個角度作為其值來更改其方向。請參考以下選項。

import xlsxwriter
wb = xlsxwriter.Workbook('hello.xlsx')
worksheet = wb.add_worksheet()
text = 'TutorialsPoint - Simple Easy Learning\nThe best resource for Online Education'

options = {
   'width': 128,
   'height':200,
   'font': {'bold':True, 'name':'Arial', 'size': 14},
   'text_rotation':90,
}
worksheet.insert_textbox('C5', text, options)
wb.close()

文字現在以垂直方向顯示在文字框中。

Text Rotation

object_position引數控制文字框的行為。它可以具有以下可能的值及其效果:

  • "1" – 與單元格一起移動和調整大小(預設值)。

  • "2" – 移動但不與單元格一起調整大小。

  • "3" – 不與單元格一起移動或調整大小。

Python XlsxWriter - 插入圖片

藉助insert_image()方法,可以在工作表的特定單元格位置插入影像物件。基本上,您必須使用任何型別的符號指定單元格的位置以及要插入的影像。

worksheet.insert_image('C5', 'logo.png')

insert_image()方法在字典中採用以下可選引數。

引數 預設值
'x_offset' 0,
'y_offset' 0,
'x_scale' 1,
'y_scale' 1,
'object_position' 2,
'image_data'
'url'
'description'
'decorative' False

偏移值以畫素為單位。x_scaley_scale引數用於水平和垂直縮放影像。

image_data引數用於新增io.BytesIO格式的記憶體位元組流。

示例

以下程式從當前資料夾中的檔案提取影像資料,並將其用作image_data引數的值。

from io import BytesIO
import xlsxwriter
workbook = xlsxwriter.Workbook('hello.xlsx')
worksheet = workbook.add_worksheet()

filename = 'logo.png'

file = open(filename, 'rb')
data = BytesIO(file.read())
file.close()

worksheet.insert_image('C5', filename, {'image_data': data})

workbook.close()

輸出

以下是結果工作表的檢視:

Insert Image

Python XlsxWriter - 頁面設定

工作表的頁面設定方法與列印工作表時的外觀有關。這些工作表方法控制方向、紙張大小、頁邊距等。

set_landscape()

此方法用於將工作表列印頁面的方向設定為橫向。

set_portrait()

此方法用於將工作表列印頁面的方向設定為縱向。這是預設方向。

set_page_view()

此方法用於在“頁面檢視/佈局”模式下顯示工作表。

set_paper()

此方法用於設定工作表列印輸出的紙張格式。它採用整數引數作為索引。它是Excel紙張格式索引。

以下是一些紙張樣式和索引值:

索引 紙張格式 紙張大小
0 印表機預設值 印表機預設值
1 Letter 8 1/2 x 11 英寸
2 Letter Small 8 1/2 x 11 英寸
3 Tabloid 11 x 17 英寸
4 Ledger 17 x 11 英寸
5 Legal 8 1/2 x 14 英寸
6 Statement 5 1/2 x 8 1/2 英寸
7 Executive 7 1/4 x 10 1/2 英寸
8 A3 297 x 420 毫米
9 A4 210 x 297 毫米

set_margin()

此方法用於設定列印工作表時的頁邊距。它接受左、右、上和下引數,其值以英寸為單位。所有引數都是可選的。左和右引數預設為0.7,上和下引數預設為0.75。

Python XlsxWriter - 頁首和頁尾

使用上述方法列印工作表時,將在紙張上生成頁首頁尾。列印預覽也顯示頁首和頁尾。兩者都透過set_header()set_footer()方法進行配置。頁首和頁尾字串透過以下控制字元進行配置:

控制字元 類別 描述
&L 對齊方式
&C 居中
&R
&P 資訊 頁碼
&N 總頁數
&D 日期
&T 時間
&F 檔名
&A 工作表名稱
&Z 工作簿路徑
&fontsize 字型 字型大小
&"font,style" 字型名稱和樣式
&U 單下劃線
&E 雙下劃線
&S 刪除線
&X 上標
&Y 下標
&[Picture] 影像 影像佔位符
&G 與&[Picture]相同
&& 其他 字面意義上的&“&”

示例

以下程式碼使用set_header()set_footer()方法:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data = [ 
   ['Anil', 45, 55, 50], ['Ravi', 60, 70, 80],
   ['Kiran', 65, 75, 85],['Karishma', 55, 65, 45]
]
   
for row in range(len(data)):
   ws.write_row(row,0, data[row])
   
header1 = '&CTutorialspoint'
footer1 = '&LSimply Easy Learning'

ws.set_landscape()
ws.set_paper(9) #A4 paper
ws.set_header(header1)
ws.set_footer(footer1)

ws.set_column('A:A', 50)

wb.close()

輸出

執行上述Python程式碼並開啟工作表。從“檔案”選單中選擇“列印”選項。在右側窗格中,顯示預覽。您應該能夠看到頁首和頁尾。

Header And Footer

Python XlsxWriter - 單元格批註

在Excel工作表中,可以出於各種原因插入批註。其中一個用途是解釋單元格中的公式。此外,Excel批註還可以作為對其他使用者的提醒或註釋。它們對於與其他Excel工作簿交叉引用非常有用。

從Excel的菜單系統中,可以在功能區的“審閱”選單中找到批註功能。

Comment

要新增和格式化批註,XlsxWriter具有add_comment()方法。此方法的兩個必需引數是單元格位置(A1型別或行和列號)和批註文字

示例

這是一個簡單的示例:

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

data='XlsxWriter Library'

ws.set_column('C:C', 25)
ws.set_row(2, 50)
ws.write('C3', data)

text = 'Developed by John McNamara'
ws.write_comment('C3', text)

wb.close()

輸出

當我們開啟工作簿時,當游標放在C3單元格中時,會在其右上角看到一個帶有標記的批註。

Comment1

預設情況下,批註不可見,除非游標懸停在寫入批註的單元格上。您可以透過呼叫工作表物件的show_comment()方法或將單個批註的visible屬性設定為True來顯示工作表中的所有批註。

ws.write_comment('C3', text, {'visible': True})

示例

在以下程式碼中,放置了三個批註。但是,C3單元格中的批註已將其visible屬性設定為False。因此,除非游標放在單元格中,否則看不到它。

import xlsxwriter

wb = xlsxwriter.Workbook('hello.xlsx')
ws = wb.add_worksheet()

ws.show_comments()

data='Python'
ws.set_column('C:C', 25)
ws.set_row(0, 50)
ws.write('C1', data)
text = 'Programming language developed by Guido Van Rossum'
ws.write_comment('C1', text)
data= 'XlsxWriter'
ws.set_row(2, 50)
ws.write('C3', data)
text = 'Developed by John McNamara'
ws.write_comment('C3', text, {'visible':False})
data= 'OpenPyXl'
ws.set_row(4, 50)
ws.write('C5', data)
text = 'Developed by Eric Gazoni and Charlie Clark'
ws.write_comment('C5', text, {'visible':True})

wb.close()

輸出

它將產生以下輸出:

Show Comment

您可以設定author選項來指示單元格批註的作者是誰。批註的作者也顯示在工作表底部的狀態列中。

worksheet.write_comment('C3', 'Atonement', {'author': 'Tutorialspoint'})

可以使用set_comments_author()方法設定所有單元格批註的預設作者:

worksheet.set_comments_author('Tutorialspoint')

它將產生以下輸出:

Set Comments Author

Python XlsxWriter - 與Pandas協同工作

Pandas 是一個流行的 Python 庫,用於資料操作和分析。我們可以使用 XlsWriter 將Pandas 資料框寫入 Excel 工作表。

要學習本節中描述的功能,我們需要在已安裝XlsxWriter 的相同環境中安裝Pandas 庫。

pip3 install pandas

將 XlsxWriter 與 Pandas 一起使用

讓我們從一個簡單的例子開始。首先,從整數列表中的資料建立一個 Pandas 資料框。然後使用 XlsxWriter 作為引擎來建立 Pandas Excel 寫入器。藉助此引擎物件,我們可以將資料框物件寫入 Excel 工作表。

示例

import pandas as pd

df = pd.DataFrame({'Data': [10, 20, 30, 20, 15, 30, 45]})
writer = pd.ExcelWriter('hello.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')

writer.save()

輸出

建立的工作表顯示如下:

Pandas DataFrame

向 Pandas 資料框新增圖表

就像我們獲得 Workbook 類物件,然後透過呼叫其add_worksheet() 方法獲得 Worksheet 物件一樣,寫入器物件也可以用於獲取這些物件。一旦我們得到它們,就可以使用 XlsxWriter 方法新增圖表、資料表等。

在此示例中,我們設定了一個 Pandas 資料框並獲取其維度(或形狀)。

import pandas as pd
df = pd.DataFrame({'Data': [105, 60, 35, 90, 15, 30, 75]})
writer = pd.ExcelWriter('hello.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
(max_row, max_col) = df.shape

工作簿和工作表物件是從寫入器建立的。

workbook = writer.book
worksheet = writer.sheets['Sheet1']

其餘的事情很簡單。圖表物件像我們之前做的那樣新增。

chart = workbook.add_chart({'type': 'column'})
chart.add_series({'values': ['Sheet1', 1, 1, max_row, 1]})
worksheet.insert_chart(1, 3, chart)
writer.save()

示例

以下程式碼使用 Pandas 資料框寫入 Excel 工作簿,並由 XlsxWriter 建立一個柱狀圖。

import pandas as pd

df = pd.DataFrame({'Data': [105, 60, 35, 90, 15, 30, 75]})
writer = pd.ExcelWriter('hello.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1')
(max_row, max_col) = df.shape

workbook = writer.book
worksheet = writer.sheets['Sheet1']
chart = workbook.add_chart({'type': 'column'})
chart.add_series({'values': ['Sheet1', 1, 1, max_row, 1]})
worksheet.insert_chart(1, 3, chart)

writer.save()

輸出

柱狀圖及其資料如下所示:

Column Chart

將資料框寫入 Excel 表格

類似地,資料框可以寫入 Excel 表格物件。此處的 資料框源自一個 Python 字典,其中鍵是資料框列標題。每個鍵的值都是一個列表,該列表又成為每一列的值。

import pandas as pd

df = pd.DataFrame({
   'Name': ['Namrata','Ravi','Kiran','Karishma'],
   'Percent': [73.33, 70, 75, 65.5],
   'RollNo': [1, 2,3,4]})
   
df = df[['RollNo', 'Name', 'Percent']]
(max_row, max_col) = df.shape

使用 xlsxwriter 引擎將資料框寫入工作表 (sheet1)

writer = pd.ExcelWriter('hello.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', startrow=1, header=False, index=False)

以下幾行給出 Workbook 和 Worksheet 物件。

workbook = writer.book
worksheet = writer.sheets['Sheet1']

工作表中的資料藉助 add_table() 方法轉換為表格。

column_settings = [{'header': column} for column in df.columns]

worksheet.add_table(0, 0, max_row, max_col - 1, {'columns': column_settings})

writer.save()

示例

以下是將 pandas 資料框寫入 Excel 表格的完整程式碼。

import pandas as pd
df = pd.DataFrame({
   'Name': ['Namrata','Ravi','Kiran','Karishma'],
   'Percent': [73.33, 70, 75, 65.5],
   'RollNo': [1, 2,3,4]
})
   
df = df[['RollNo', 'Name', 'Percent']]
(max_row, max_col) = df.shape

writer = pd.ExcelWriter('hello.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', startrow=1, header=False, index=False)

workbook = writer.book
worksheet = writer.sheets['Sheet1']

column_settings = [{'header': column} for column in df.columns]

worksheet.add_table(0, 0, max_row, max_col - 1, {'columns': column_settings})

writer.save()

輸出

使用預設自動篩選設定的表格將從 A1 單元格開始顯示。

AutoFilter

Python XlsxWriter - VBA宏

在 Excel 中,是一系列記錄的步驟,可以使用快捷鍵重複任意多次。記錄宏時執行的步驟被轉換為 VBA 程式設計指令,VBA 代表 Visual Basic for Applications。VBA 是 Visual Basic 語言的一個子集,專門用於自動化 MS Office 應用程式(如 Word、Excel、PowerPoint 等)中的任務。

記錄宏的選項可在 MS Excel 的“開發工具”選單中找到。如果看不到此選單,則需要透過轉到“檔案→選項→自定義”功能區螢幕來啟用它。

如下圖所示,透過轉到“檢視→宏→記錄宏”來單擊“記錄宏”按鈕,併為宏指定一個合適的名稱,然後執行要記錄的所需操作。步驟完成後停止錄製。分配一個所需的快捷鍵,以便可以重複記錄的操作,並且按下它。

Record Macro

要檢視 VBA 程式碼,請透過轉到“檢視→宏→檢視宏”來編輯宏。從宏名稱中選擇宏,然後單擊“編輯”。

Macro Name

將顯示 VBA 編輯器。刪除 Excel 生成的所有步驟,並新增彈出訊息框的語句。

Visual Basic Of Applications

確認宏執行完美。按CTL+Shift+M,訊息框將彈出。將此檔案儲存為.xlsm副檔名。它內部包含vbaproject.bin,一個二進位制 OLE COM 容器。要從 Excel 宏檔案中提取它,請使用vba_extract.py實用程式。

(xlsxenv) E:\xlsxenv>vba_extract.py test.xlsm
Extracted: vbaProject.bin

示例

現在可以使用add_vba_project()方法將此 vbaProject.bin 檔案新增到 XlsxWriter 工作簿。在此工作表上,在 B3 單元格中放置一個按鈕物件,並將其連結到我們已建立的宏(即macro1)。

import xlsxwriter

workbook = xlsxwriter.Workbook('testvba.xlsm')
worksheet = workbook.add_worksheet()

worksheet.set_column('A:A', 30)
workbook.add_vba_project('./vbaProject.bin')
worksheet.write('A3', 'Press the button to say Welcome.')
worksheet.insert_button(
   'B3',
   {
      'macro': 'macro1',
      'caption': 'Press Me',
      'width': 80, 'height': 30
   }
)
workbook.close()

輸出

執行上述程式碼後,將建立名為 testvba.xlsm 的宏啟用工作簿。開啟它並單擊按鈕。它將導致訊息框彈出,如下所示。

VBA Project
廣告