⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
Excel 扩展

excel 扩展通过封装 i18npool 库提供根据 Excel 格式规则格式化数字的功能,并支持读取/写入 Excel (.xlsx) 文件。但请注意,不支持 .xls 文件。

提示:此前,读取和写入 Excel 文件是通过 spatial 扩展处理的,该扩展恰好通过其依赖项之一包含了对 XLSX 文件的支持,但此功能可能会从 spatial 扩展中移除。此外,excel 扩展更高效,并能提供对导入/导出过程的更好控制。如果 excel 扩展无法满足您的用例,请尝试使用 spatial 扩展。有关说明,请参阅 Excel 导入Excel 导出页面。不过,请注意这些功能在未来可能会被弃用。

安装和加载

excel 扩展会在首次使用时从官方扩展仓库中自动加载。如果您想手动安装并加载它,请运行

INSTALL excel;
LOAD excel;

Excel 标量函数

函数 描述
excel_text(number, format_string) 根据 format_string 中给出的规则格式化指定的 number
text(number, format_string) excel_text 的别名

示例

SELECT excel_text(1_234_567.897, 'h:mm AM/PM') AS timestamp;
timestamp
9:31 PM
SELECT excel_text(1_234_567.897, 'h AM/PM') AS timestamp;
timestamp
9 PM

读取 XLSX 文件

读取 .xlsx 文件非常简单,只需直接对其执行 SELECT 操作即可,例如:

SELECT *
FROM 'test.xlsx';
a b
1.0 2.0
3.0 4.0

但是,如果您想设置额外的选项来控制导入过程,可以使用 read_xlsx 函数。支持以下命名参数:

选项 类型 默认值 描述
header BOOLEAN 自动推断 是否将第一行视为包含结果列的名称。
sheet VARCHAR 自动推断 要读取的 xlsx 文件中的工作表名称。默认为第一个工作表。
all_varchar BOOLEAN false 是否将所有单元格读取为 VARCHAR 类型。
ignore_errors BOOLEAN false 是否忽略错误,并将无法转换为相应推断列类型的单元格静默替换为 NULL
range VARCHAR 自动推断 以电子表格表示法指定的读取单元格范围。例如,A1:B2 读取从 A1 到 B2 的单元格。如果未指定,结果范围将被推断为从第一个连续非空单元格行到相同列中第一个空行之间的矩形区域。
stop_at_empty BOOLEAN 自动推断 当遇到空行时是否停止读取文件。如果提供了明确的 range 选项,则默认值为 false,否则为 true
empty_as_varchar BOOLEAN false 在尝试自动推断列类型时,是否将空单元格视为 VARCHAR 而不是 DOUBLE
SELECT *
FROM read_xlsx('test.xlsx', header = true);
a b
1.0 2.0
3.0 4.0

或者,可以使用带有 XLSX 格式选项的 COPY 语句将 Excel 文件导入现有表,在这种情况下,目标表中的列类型将用于强制转换 Excel 文件中单元格的类型。

CREATE TABLE test (a DOUBLE, b DOUBLE);
COPY test FROM 'test.xlsx' WITH (FORMAT xlsx, HEADER);
SELECT * FROM test;

类型和范围推断

由于 Excel 本身只在单元格中存储数字或字符串,并且不强制要求列中的所有单元格都具有相同的类型,因此 excel 扩展在导入 Excel 工作表时必须进行一些猜测来“推断”并决定列的类型。虽然几乎所有列都被推断为 DOUBLEVARCHAR,但仍有一些注意事项:

  • TIMESTAMPTIMEDATEBOOLEAN 类型是在可能的情况下,根据应用于单元格的格式进行推断的。
  • 包含 TRUEFALSE 的文本单元格被推断为 BOOLEAN
  • 默认情况下,空单元格被视为 DOUBLE,除非将 empty_as_varchar 选项设置为 true,在这种情况下它们被键入为 VARCHAR

如果将 all_varchar 选项设置为 true,则上述所有规则均不适用,所有单元格都将读取为 VARCHAR

当未明确指定类型时(例如,使用 read_xlsx 函数而不是 COPY TO ... FROM 'file.xlsx'),结果列的类型将基于工作表中的第一行“数据行”进行推断,即:

  • 如果未提供明确范围
    • 如果发现标题或通过 header 选项强制指定,则为标题后的第一行
    • 如果没有发现标题或强制指定,则为工作表中的第一个非空行
  • 如果提供了明确范围
    • 如果第一行发现标题或通过 header 选项强制指定,则为范围的第二行
    • 如果没有发现标题或强制指定,则为范围的第一行

如果第一个“数据行”不能代表工作表的其余部分(例如,它包含空单元格),这有时会导致问题,在这种情况下,可以使用 ignore_errorsempty_as_varchar 选项来解决此问题。

但是,当使用 COPY TO ... FROM 'file.xlsx' 语法时,不会进行任何类型推断,结果列的类型由正在复制到的表中的列类型确定。所有单元格只需通过从 DOUBLEVARCHAR 转换为目标列类型来进行转换。

写入 XLSX 文件

支持使用带有 XLSX 格式的 COPY 语句来写入 .xlsx 文件。支持以下附加参数:

选项 类型 默认值 描述
header BOOLEAN false 是否将列名写入工作表的第一行
sheet VARCHAR Sheet1 要写入的 xlsx 文件中的工作表名称。
sheet_row_limit INTEGER 1048576 工作表中的最大行数。如果超过此限制,将引发错误。

警告:许多工具仅支持工作表中最多 1,048,576 行,因此增加 sheet_row_limit 可能会导致生成的其他软件无法读取该文件。

这些作为选项传递给 FORMAT 之后的 COPY 语句,例如:

CREATE TABLE test AS
    SELECT *
    FROM (VALUES (1, 2), (3, 4)) AS t(a, b);
COPY test TO 'test.xlsx' WITH (FORMAT xlsx, HEADER true);

类型转换

由于 XLSX 文件实际上只支持存储数字或字符串(相当于 VARCHARDOUBLE),因此在写入 XLSX 文件时会应用以下类型转换:

  • 写入 XLSX 文件时,数值类型被转换为 DOUBLE
  • 时间类型(TIMESTAMPDATETIME 等)被转换为 Excel“序列号”,即日期为自 1900-01-01 以来的天数,时间为一天的分数。然后将它们应用“数字格式”,以便在 Excel 中打开时显示为日期或时间。
  • TIMESTAMP_TZTIME_TZ 分别转换为 UTC TIMESTAMPTIME,时区信息会丢失。
  • BOOLEAN 被转换为 10,并应用“数字格式”使其在 Excel 中显示为 TRUEFALSE
  • 所有其他类型都被转换为 VARCHAR,然后作为文本单元格写入。
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南