Azure Databricks 內建支援讀取 .xls 和 .xlsx 檔案,因此無需外部程式庫或手動轉換檔案。 你可以從多張工作簿中讀取任何一張,針對特定格區間,自動推斷結構和資料型態,並以公式值作為計算結果。 Excel 檔案可從雲端儲存讀取或直接上傳至 Add Data UI,並支援批次與串流工作負載,使用 Auto Loader。
先決條件
閱讀與串流 Excel 檔案需要 Databricks Runtime 17.1 或以上版本及 Auto Loader 來串流工作負載。
選項
使用 .option() 的 .options() 和 DataFrameReader 方法來設定 Excel 資料來源。 欲了解完整的支援選項清單,請參閱 DataFrameReader Excel 選項及 DataFrameWriter Excel 選項。
Usage
以下範例示範使用 Spark 批次(spark.read)及串流 API 讀取 Excel 檔案。 預設情況下,解析器會讀取第一個工作表中,從左上角到右下方非空白儲存格為止的所有儲存格;使用 dataAddress 選項來指定特定的工作表或儲存格範圍。 結構是自動推斷的,或者你可以自己指定。
在 UI 中建立或修改資料表
你可以使用 Create 或 modify table 介面,從Excel檔案建立表格。 首先可以上傳一個Excel檔案或從磁碟區或外部位置選取Excel檔案。 選擇工作表,調整標頭列數,並可選擇指定儲存格範圍。 介面支援從選取的檔案和工作表建立單一表格。
閱讀 Excel 檔案
你可以用 spark.read.excel SQL read_files 函式從雲端儲存(例如 S3、ADLS)讀取 Excel 檔案。
Python
# Read the first sheet from a single Excel file or from multiple Excel files in a directory
df = (spark.read.excel(<path to excel directory or file>))
# Infer schema field name from the header row
df = (spark.read
.option("headerRows", 1)
.excel(<path to excel directory or file>))
# Read a specific sheet and range
df = (spark.read
.option("headerRows", 1)
.option("dataAddress", "Sheet1!A1:E10")
.excel(<path to excel directory or file>))
SQL
-- Read an entire Excel file
CREATE TABLE my_table AS
SELECT * FROM read_files(
"<path to excel directory or file>",
schemaEvolutionMode => "none"
);
-- Read a specific sheet and range
CREATE TABLE my_sheet_table AS
SELECT * FROM read_files(
"<path to excel directory or file>",
format => "excel",
headerRows => 1,
dataAddress => "Sheet1!A2:D10",
schemaEvolutionMode => "none"
);
使用 Auto Loader 串流 Excel 檔案
你可以用自動載入器串流Excel檔案,方法是將 cloudFiles.format 設為 excel。 例如:
df = (
spark
.readStream
.format("cloudFiles")
.option("cloudFiles.format", "excel")
.option("cloudFiles.inferColumnTypes", True)
.option("headerRows", 1)
.option("cloudFiles.schemaLocation", "<path to schema location dir>")
.option("cloudFiles.schemaEvolutionMode", "none")
.load(<path to excel directory or file>)
)
(df.writeStream
.format("delta")
.option("mergeSchema", "true")
.option("checkpointLocation", "<path to checkpoint location dir>")
.table(<table name>))
使用 COPY INTO 來匯入 Excel 檔案
使用 COPY INTO 以冪等方式將 Excel 檔案從雲端儲存載入 Delta 資料表。
CREATE TABLE IF NOT EXISTS excel_demo_table;
COPY INTO excel_demo_table
FROM "<path to excel directory or file>"
FILEFORMAT = EXCEL
FORMAT_OPTIONS ('mergeSchema' = 'true')
COPY_OPTIONS ('mergeSchema' = 'true');
名單表
你可以使用 listSheets 操作,列出 Excel 檔案中的工作表。 回傳的結構體是 struct 並包含以下欄位:
-
sheetIndex:長 -
sheetName:字串
例如:
Python
# List the name of the Sheets in an Excel file
df = (spark.read.format("excel")
.option("operation", "listSheets")
.load(<path to excel directory or file>))
SQL
SELECT * FROM read_files("<path to excel directory or file>",
schemaEvolutionMode => "none",
operation => "listSheets"
)
解析複雜非結構化 Excel 工作表
對於複雜且非結構化的 Excel(例如每張圖表有多個資料表、資料島),Databricks 建議利用 dataAddress 選項擷取建立 Spark DataFrames 所需的單元範圍。
df = (spark.read.format("excel")
.option("headerRows", 1)
.option("dataAddress", "Sheet1!A1:E10")
.load(<path to excel directory or file>))
局限性
- 不支援有密碼保護的檔案。
- 只支援一個標題列。
- 合併後的儲存格值只會填入左上角的儲存格。 剩餘的子格則設定為
NULL。 - 支援使用 Auto Loader 串流 Excel 檔案,但不支援結構演進。 你必須明確設定
schemaEvolutionMode="None"。 - 「嚴格開放 XML 試算表(嚴格 OOXML)」不支援。
- 不支援在
.xlsm檔案中執行巨集。 - 這個
ignoreCorruptFiles選項不被支援。
FAQ
在 Lakeflow Connect 中找到關於 Excel 連接器的常見問題解答。
我可以一次看所有紙張嗎?
解析器一次只讀取 Excel 檔案中的一張工作表。 預設情況下,它會讀取第一張圖紙。 你可以用這個 dataAddress 選項指定不同的工作表。 要處理多個工作表,首先將 operation 選項設為 listSheets 以檢索工作表清單,然後遍歷這些工作表名稱,並在 dataAddress 選項中提供其名稱以讀取每一個工作表。
我可以匯入具有複雜版面或每個工作表包含多個資料表的Excel檔案嗎?
預設情況下,解析器會讀取左上方所有 Excel 儲存格到右下角非空儲存格。 你可以用這個 dataAddress 選項指定不同的儲存格範圍。
公式和合併的儲存格是怎麼處理的?
公式會以計算值的形式被吸收。 合併後的儲存格僅保留左上角的值(子儲存格則為 NULL)。
我可以在自動載入和串流任務中使用 Excel 匯入嗎?
是的,你可以用 cloudFiles.format = "excel" 串流Excel檔案。 然而,結構演化不被支援,因此你必須設 "schemaEvolutionMode" 為 "None"。
支援密碼保護Excel嗎?
否。 如果這項功能對您的工作流程至關重要,請聯絡您的 Databricks 帳戶代表。
其他資源
- 讀寫 CSV 檔案:如果你的資料來源能匯出成 CSV,CSV 格式較簡單,工具支援更廣泛,且不依賴專用解析器。