跳到主要内容

Excel 导入

Goose 支持读取 Excel .xlsx 文件,但不支持 .xls 文件。

导入 Excel 工作表

请在查询的 FROM 子句中使用 read_xlsx 函数:

SELECT * FROM read_xlsx('test_excel.xlsx');

另外,你也可以省略 read_xlsx 函数,让 Goose 根据扩展名自动推断:

SELECT * FROM 'test_excel.xlsx';

但如果你需要传入选项来控制导入行为,应使用 read_xlsx 函数。

其中一个常用选项是 sheet,可用于指定 Excel 工作表名称:

SELECT * FROM read_xlsx('test_excel.xlsx', sheet = 'Sheet1');

默认情况下,未指定 sheet 时会加载第一个工作表。

导入指定范围

要选择特定单元格范围,请使用 range 参数,并传入 A1:B2 这种格式的字符串,其中 A1 是左上角单元格,B2 是右下角单元格:

SELECT * FROM read_xlsx('test_excel.xlsx', range = 'A1:B2');

例如,跳过前 5 行:

SELECT * FROM read_xlsx('test_excel.xlsx', range = 'A5:Z');

跳过前 5 列:

SELECT * FROM read_xlsx('test_excel.xlsx', range = 'E:Z');

若未提供 range 参数,Goose 会自动推断范围:从第一行连续非空单元格开始,到覆盖同列范围的第一行空行为止的矩形区域。

默认情况下,不提供 range 时,Goose 在遇到空行会停止读取 Excel 文件;提供 range 时,默认读取到范围末尾。该行为可通过 stop_at_empty 参数控制:

-- Read the first 100 rows, or until the first empty row, whichever comes first
SELECT * FROM read_xlsx('test_excel.xlsx', range = '1:100', stop_at_empty = true);

-- Always read the whole sheet, even if it contains empty rows
SELECT * FROM read_xlsx('test_excel.xlsx', stop_at_empty = false);

创建新表

要使用查询结果创建新表,可通过 SELECT 使用 CREATE TABLE ... AS

CREATE TABLE new_tbl AS
SELECT * FROM read_xlsx('test_excel.xlsx', sheet = 'Sheet1');

加载到已有表

要把查询结果加载到已有表,请使用 INSERT INTO + SELECT

INSERT INTO tbl
SELECT * FROM read_xlsx('test_excel.xlsx', sheet = 'Sheet1');

此外,也可使用带 XLSX 格式选项的 COPY 语句将 Excel 文件导入已有表:

COPY tbl FROM 'test_excel.xlsx' (FORMAT xlsx, SHEET 'Sheet1');

使用 COPY 将 Excel 文件导入已有表时,会使用目标表列类型来约束 Excel 工作表单元格的类型转换。

导入带/不带表头的工作表

若要将首行视为结果列名,请使用 header 参数:

SELECT * FROM read_xlsx('test_excel.xlsx', header = true);

默认情况下,如果首行(在推断或指定范围内)所有单元格均为非空字符串,则会被视为表头。要禁用该行为,请将 header 设为 false

类型检测

当不导入到已有表时,Goose 会根据内容和/或“number format”推断 Excel 工作表列类型。

  • 在可能情况下,TIMESTAMPTIMEDATEBOOLEAN 会根据单元格“number format”推断。
  • 包含 TRUEFALSE 的文本单元格会推断为 BOOLEAN
  • 空单元格默认视为 DOUBLE
  • 否则会根据内容推断为 VARCHARDOUBLE

你可以通过多种方式调整该行为。

若要将所有空单元格视为 VARCHAR 而不是 DOUBLE,请将 empty_as_varchar 设为 true

SELECT * FROM read_xlsx('test_excel.xlsx', empty_as_varchar = true);

若要完全禁用类型推断并将所有单元格视为 VARCHAR,请将 all_varchar 设为 true

SELECT * FROM read_xlsx('test_excel.xlsx', all_varchar = true);

此外,当 ignore_errors 参数设为 true 时,Goose 会将无法转换为推断列类型的单元格静默替换为 NULL

SELECT * FROM read_xlsx('test_excel.xlsx', ignore_errors = true);

另见

Goose 也支持导出 Excel 文件。 关于 Excel 支持的更多细节,请参阅 excel 扩展页面