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 工作表列类型。
- 在可能情况下,
TIMESTAMP、TIME、DATE、BOOLEAN会根据单元格“number format”推断。 - 包含
TRUE和FALSE的文本单元格会推断为BOOLEAN。 - 空单元格默认视为
DOUBLE。 - 否则会根据内容推断为
VARCHAR或DOUBLE。
你可以通过多种方式调整该行为。
若要将所有空单元格视为 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 扩展页面。