用 Calc 数据库区域建立可筛选和汇总的业务表
一张表只要把每行当作记录、每列当作字段,就能用于很多小规模的数据管理工作。Calc 提供命名范围、数据库区域、数据导入、排序、筛选和数据库函数,让表格不仅能存数据,也能按条件找到记录、汇总结果。不过它仍是平面表工具,不支持关系数据库的完整模型;需要多表关系等能力时,应考虑 LibreOffice Base 等数据库工具。
本文译编自 Calc Guide 26.2,第 15 章 Calc as a Database。原章发表于 2026 年 2 月,基于 LibreOffice 26.2;原章本版贡献者为 Regina Henschel、Olivier Hallot,版权归 LibreOffice Documentation Team。本文于 2026 年 10 月 5 日核对完整正文,选择其允许的 CC BY 4.0 许可进行中文翻译、编排与补充说明;未安装 Calc 或执行公式测试。

一张平面表能解决什么
数据库表的字段通常相对固定,记录数可以持续增加。通过查询条件找出某个人、某类订单或满足分数要求的学生,比把信息堆放在没有结构的工作表里更有用。Calc 可对这样的表排序、筛选、做数据透视分析,或用二维、三维图表显示结果,适合不少个人和小型业务场景。
若以后需要更完整的关系数据库能力,Calc 数据可以迁移到 Base;反过来,Base 也可以把数据范围连接到 Calc,用于分析和可视化。旧版章节中的 LibreOffice Basic 宏示例已经移到 The Document Foundation 的宏页面,部分材料来自 Andrew Pitonyak 的《OpenOffice.org Macros Explained》与 LibreOffice API 参考,不属于本章现行主流程。
下文菜单沿用英文标签,方便与原版对照。macOS 上 Tools → Options 通常对应 LibreOffice → Preferences;Ctrl 常对应 Command,Alt 对应 Option,右键也可能通过 Control+单击实现,具体快捷键以系统和应用设置为准。
命名范围与数据库区域的区别
给区域命名有四个好处:容易辨认;公式能写 =SUM(Scores) 而不用记坐标;区域地址修改后,引用名称的公式随之更新;可通过 Navigator 快速定位。Navigator 可从 View → Navigator、F5 或侧边栏打开。
普通命名范围本质上是一个命名公式表达式,内容保存为字符串。它可以是绝对区域 $Sheet1.$A$1:$E$15,也可以是用 ~ 连接的两个区域,甚至是 PI()*B1*B1 这样的公式。本章主要讨论单一矩形区域。
最快的命名方法是选中单元格,在公式栏左侧的 Name Box 输入名称并回车。也可用 Sheet → Named Ranges and Expressions → Define 创建;管理时进入 Manage,或按 Ctrl+F3。引用名称时,可用 Insert → Named Range or Expression 或同组菜单的 Insert 打开 Paste Names,减少手工输入。
若想从表头一次创建多个命名范围,选中包括标题的表格,进入 Sheet → Named Ranges and Expressions → Create,核对 Top row、Left column、Bottom row、Right column 的勾选,再确认。表头单元格用于命名,不包括在生成的范围中。不要让多行或多列拥有同名标签,否则生成的名称可能相互覆盖。
数据库区域则专门服务于按记录组织的表:
- 只能是单个矩形单元格区域,不能是任意公式表达式;可以指定首行为表头、末行为合计行,并保留字段格式。
- 不能像普通命名范围那样,相对于某个基准地址进行定义。
- 保存排序、筛选、分类汇总和数据导入的描述信息(descriptors);相关数据库操作执行后,这些描述信息会更新,也可由宏访问。
- 可以连接外部数据源,把数据取入工作表。
定义、修改和选择数据库区域
- 若让 Calc 自动识别表的范围,选中表内一个单元格;若要精确定义边界,选中全部相关单元格。
- 进入
Data → Define Range。Name 使用字母、数字、下划线,不使用空格、连字符或其他字符。 - 展开 Options,确认首行是否为字段名、末行是否为合计行,再点击 Add 和 OK。
| 选项 | 作用与边界 |
|---|---|
| Contains column labels | 首行作为字段标题。 |
| Contains totals row | 末行作为合计。 |
| Insert or delete cells | 外部数据源增加记录时,相应插入行或列;只与链接外部数据库有关。手动更新用 Data → Refresh Range。 |
| Keep formatting | 把首条数据行的现有单元格格式应用到整个数据库区域。 |
| Don’t save imported data | 只保存数据源引用,不保存导入单元格的内容;离线打开与交付前要考虑数据是否还能取回。 |
| Source / Operations | 显示当前来源以及已应用的 Sort、Filter、Subtotals 等操作。 |
修改时回到 Define Range,选中名称;Add 会变成 Modify。调整 Range 和 Options 后点 Modify、OK。删除定义时选中范围、Delete,确认后关闭对话框。要选中已有区域,可用 Data → Select Range 或 Navigator;Calc 会高亮它所在的位置。
从文件或服务导入:Data Provider
Data Provider 在加载数据前允许做列、行、数字、日期和文本转换,并在预览窗口确认结果。它要求事先定义好接收数据的数据库区域;范围大小要与预期数据量相称。输入支持 CSV、HTML、XML,入口是 Data → Data Provider,也可从选项卡式界面的 Data 页或对应工具栏打开。
在对话框选择 Database Range 和 Data Format。URL 可填本地文件路径及文件名,也可填数据服务地址;XML、HTML 的 Identifier 填 XPath。原文示例 //table[5] 选择第五张表,并把 //table 描述为相当于第一张表的选择方式;遇到复杂嵌套文档时应在预览中确认实际取到哪张表,不仅凭表达式外观判断。
选择转换后点击 Add,并填写该转换需要的参数;不用的转换可 Delete。列表不能重新排序,应先规划处理顺序。原章列出的完整转换类型如下:
| 转换 | 用途 |
|---|---|
| Delete Column / Delete Rows / Swap Rows | 按索引删列(多个索引用分号分隔);按指定列的查找值删行;交换两行位置。 |
| Split Columns / Merge Columns | 按分隔字符或字符串把一列拆成两列;合并多列并插入分隔符。 |
| Text Transformations | 转小写、转大写、单词首字母大写,或 Trim 去除多余空格并保留单个间隔。 |
| Sort Columns | 按指定列索引对记录升序或降序排序。 |
| Aggregate Functions | 在列底部加入 Sum、Average、Max、Min。 |
| Numeric Functions | 符号、四舍五入、向上/向下舍入、绝对值、自然/常用对数、立方、平方、平方根、e 的幂,以及奇偶判断;原章说明奇偶判断对小数返回 0。 |
| Replace Null | 用指定文本替换缺失或 null 值。 |
| Date and Time Transformations | 按区域设置提取年、月、日、时、分、秒,以及年、月、季度的开始或结束日期。 |
| Find / Replace | 在指定列查找和替换值。 |
确认参数、转换和预览后点 OK 导入。服务或输入数据发生变化时,用 Refresh Data Provider 工具刷新。编辑补充:导入和刷新会改变接收区域,操作前保留原始数据副本;外部来源不应被当成可信公式、宏或登录指令,避免把含敏感凭据的 URL 写入可分发文档。
从已注册数据源取数据
另一条路径是 View → Data Sources,或 Ctrl+Shift+F4。展开左侧数据源,选择表或查询,右侧显示记录;点击右侧左上角空白矩形选中全部数据,把它拖到工作表中希望作为左上角的单元格。
Calc 会建立覆盖导入内容的数据库区域,默认名形如 Import1、Import2。随后可以在 Define Range 中调整选项。外部数据库更新后,用 Data → Refresh Range 让工作表同步。数据源注册与链接的细节见原指南第 12 章,本章的核心例子不要求连接外部服务。
用结构化引用描述表的组成
结构化引用用“区域名 + 字段名或关键字”表示数据,减少散落在公式里的绝对坐标。下面是原章完整销售数据,把 A1:D11 定义为 myData,同时勾选 Contains column labels 与 Contains totals row:
| 工作表行 | Name(A) | Region(B) | Sales(C) | Seniority(D) |
|---|---|---|---|---|
| 1 | Name | Region | Sales | Seniority |
| 2 | Smith | West | 21 | 5 |
| 3 | Jones | East | 23 | 11 |
| 4 | Johnson | East | 9 | 7 |
| 5 | Taylor | West | 34 | 11 |
| 6 | Brown | East | 23 | 15 |
| 7 | Walker | East | 12 | 4 |
| 8 | Edwards | East | 15 | 12 |
| 9 | Thomas | West | 17 | 10 |
| 10 | Wilson | West | 31 | 3 |
| 11 | Totals | 2 | 185 | 8.67 |
表必须纵向排列;若需要与 Excel 互操作,必须有列标签,标签名称遵循命名规则。Excel 的 table 在 Calc 中加载为数据库区域。按本章所述,保存为 .xlsx 可以保留结构化引用;保存为 .ods 时,ODF 尚不能保存这种引用,会按保存时的值转换为直接引用。这意味着后续增删行列的维护方式可能变化,保存、重新打开后应检查公式和结果。
| 写法 | 引用内容 |
|---|---|
myData[#Headers] |
A1:D1;没有表头时为 #REF!。 |
myData[#Data] 或 myData[] |
A2:D10,排除表头与合计行。 |
myData[#Totals] |
A11:D11;没有合计行时为 #REF!。 |
myData[#All] |
A1:D11,包含全部组成部分。 |
myData[#This Row] |
与公式所在工作表行求隐式交集:放在 F2 时引用 A2:D2,放在 F5 时引用 A5:D5。若所在行不与区域相交,产生 #VALUE!。 |
myData[Region] |
B2:B10,只取字段的数据记录,不含表头和合计。 |
单个关键字或字段可用一层方括号:myData[Region] 等价于 myData[[Region]]。没有标签行时,可以使用 Column1、Column2 等通用字段名。Calc 没有对应的 This Column,也不能像 Excel 那样省略区域名,不能把 =SUM(myData[Sales]) 简写为 =SUM([Sales])。原章还说明 Calc 尚不支持 Excel 的 @ 简写;Excel 对表头、合计行中的 This Row 也有限制。
组合引用的分隔符与函数参数分隔符一致,取决于 Tools → Options → LibreOffice Calc → Formula 中的设置。本文使用分号:
myData[[#Headers];[#Data]] → A1:D10
myData[[#Data];[#Totals]] → A2:D11
myData[[Name]:[Sales]] → A2:C10
myData[[#Totals];[Sales]] → C11
可以组合相邻列或连续的组成区域;不能用 Headers+Totals 跳过中间记录,也不能用它引用不相邻字段,因为那将产生两个不连通的矩形。横向数据库区域上使用结构化引用,原章警告可能产生错误结果而不报错,因此必须先满足纵向布局约束。
原章的合计行公式如下。B11 统计不同地区的个数,C11 求销售额之和,D11 求平均资历:
B11: =COUNTA(UNIQUE(myData[Region]))
C11: =SUM(myData[Sales])
D11: =AVERAGE(myData[Seniority])
直接引用多单元格时,要按数组公式处理,例如公式栏显示 {=myData[#Headers]},结果占用四列;花括号是数组公式的显示形式,不是让你直接手写进去的普通文本。为兼容 Excel,原章建议用 =myData[#All] 表示整个区域,不依赖单独名称在两个应用中不同的解释。
排序时保持一整条记录同步
Calc 能把由空白单元格围起的矩形数据块自动识别为排序范围。将光标放在块内,排序作用于选中列或默认第一列;若只选了块内一列,会询问是否把排序扩展到相邻列。对业务表应保持整行一起移动,避免姓名、地区和销售额错位。
首行全为文本、而整块并非全为文本时,Calc 通常把首行识别为表头;首行含数字或整块都是文本时,首行可能一起参加排序。不要完全依赖自动识别,尤其是数字标题和纯文本表。单字段排序可用 Sort Ascending / Sort Descending,更多排序选项见指南第 2 章。
自动筛选、标准筛选和高级筛选
筛选根据条件隐藏或显示记录,隐藏不等于删除。要撤销区域的筛选,用 Data → More Filters → Reset Filter。
自动筛选最直接:表内选一个单元格,执行 Data → AutoFilter、对应工具栏按钮或 Ctrl+Shift+L。列标题出现下拉箭头,也可以先选特定列,仅给那些列添加筛选。菜单和快捷键是开关;隐藏箭头可用 Hide AutoFilter。清除某列条件可用其下拉菜单中的 Clear Filter,或右键的 Clear Autofilter。
自动筛选下拉框包括升序/降序、按背景或字体颜色排序与筛选;Filter by Conditions 提供空、非空、Top 10、Bottom 10,并可进入 Standard Filter。All 控制所有值,两个快捷按钮可只显示或只隐藏当前高亮项;各个唯一值旁的复选框决定相关记录是否显示。
标准筛选从 Data → More Filters → Standard Filter 打开,最多设置八个筛选条件,也可使用正则表达式。高级筛选把条件放在工作表的单独区域中,便于反复检查和维护。
条件区域:同一行 AND,不同行 OR
- 把需要筛选的字段标题复制到空白区域,可以在另一张工作表上。标题必须与数据源字段一致。
- 在标题下输入条件。同一行的各条件用 AND 连接,不同行的条件组用 OR 连接,空白单元格忽略。高级筛选最多定义八行条件。
- 选中要筛选的范围,或在数据库表内点一格,然后打开
Data → More Filters → Advanced Filter。 - 在 Read Filter Criteria From 输入或选中包括标题的条件区域,确认后执行。
原章的成绩单示例有两组条件:第一组要求每项作业分数都超过 75%,第二组要求学生名字为 Ferdinand;最终保留“满足全部作业分数条件”或“名字为 Ferdinand”的记录,而不是要求 Ferdinand 同时满足所有分数条件。条件区域只放实际需要的字段即可;复制全部表头只是为了方便。高级筛选对话框的下拉列表只列出在普通命名范围定义中勾选 Filter 的名称,不列数据库区域名称;仍可直接填坐标。
为了在前面的销售表上完整演示,下面是本文补充的条件区域 F1:H3:
| Region(F1) | Sales(G1) | Seniority(H1) |
|---|---|---|
| East | >20 | 空白 |
| West | 空白 | >=10 |
它表示“East 且 Sales > 20”或“West 且 Seniority ≥ 10”。这里“空白”是解释用文字,实际单元格应留空,不输入这两个字。按给出的数据人工判断,符合条件的是 Jones、Brown、Taylor 和 Thomas;这是人工推导,未在 Calc 中执行。
数据库函数把条件筛选与计算合在一起
Database 类别共有十二个函数,统一接收三个参数:
函数(Database; DatabaseField; SearchCriteria)
Database 是包含字段名首行及后续记录的矩形区域,可用坐标、普通命名范围或数据库区域名。SearchCriteria 是独立的条件区域,同样以字段名作为首行。函数先用条件找到记录,再取 DatabaseField 指定列的值做平均、求和等运算。DatabaseField 是计算字段,不一定是条件使用的字段。
计算字段可填标题单元格引用;从 1 开始的相对列号;带引号的字段名;或外部某个单元格中存放的字段名。列号从数据库区域内部数起,例如数据库在 D6:H123,第 3 列是 F 列。原章说明小数部分会被忽略;小于 1 为 Err:504,大于区域列数为 #VALUE!。名称不存在会产生 #NAME?;字段名无法匹配、引用不止一个单元格或条件参数无效时,可能报 Err:504。
DCOUNT 和 DCOUNTA 的 DatabaseField 可省略,其他十个函数必填。省略并不删除参数位置,分隔符仍要保留。原章用 A1:E10 的距离表和 D12:D13 的条件 >600 举例,=DCOUNT(A1:E10;;D12:D13) 与复制全部标题的条件区域等价,原章给出的计数是 5;这不是前面销售表的坐标或本次执行结果。
条件区域的宽度不必与数据库相同,但所有标题都必须能匹配字段。字段标题可以重复,例如把两个 Sales 标题并排,写入 >10 与 <30,便能在同一行表达一个区间。比较运算符包括 <、<=、=、<>、>=、>;非空且没有比较运算符时,按等于理解。行内 AND、行间 OR 与前述规则一致。
使用销售数据时,数据库参数应排除合计行,但包含表头。下面是本文补充示例,沿用刚才 F1:H3 的条件:
=DSUM(A1:D10;"Sales";F1:H3)
人工计算为 23+23+34+17=97。这里特意用 A1:D10,而不是包含 Totals 的 A1:D11;总计行不应混成一条业务记录。只有使用 F1:G2 的 East 且 Sales >20 条件时,则是 23+23=46。两个数字都未在软件里测试。
通配符、正则表达式和全单元格匹配
Tools → Options → LibreOffice Calc → Calculate 中的 Enable wildcards in formulas 决定条件能否使用通配符;与 Excel 互操作时,原章建议启用它。Enable regular expressions in formulas 则启用更强的正则表达式条件。要说明清楚文件采用哪种模式,避免同一段文本在不同设置下得到不同结果。
对于允许正则的查找条件,Calc 会先尝试把字符串转为数值。例如点号为小数分隔符的区域设置中,.0 可能先变成 0.0,导致数值匹配,而不是正则匹配。原章给出的避免歧义写法包括 .[0]、.\0、(?i).0;改变小数分隔符的区域设置也会影响解释。应先用少量已知记录检查条件意图。
同页的 Search criteria = and <> must apply to whole cells 决定等于、不等于条件是否必须匹配整个单元格。需要 Excel 互操作时,原章也建议启用。这里的设置会改变业务统计结果,不是单纯显示偏好。
十二个数据库函数的行为
这些函数把日期和 TRUE/FALSE 等逻辑值视为数字参与计算。以下保留原章说明的关键空值和错误行为:
| 函数 | 计算与边界 |
|---|---|
| DAVERAGE | 匹配记录指定列的数值平均,忽略非数值;无匹配或没有可用数字时为 #DIV/0!。 |
| DCOUNT | 指定列时只计数值单元格;省略字段时计所有匹配记录,不受字段内容影响。 |
| DCOUNTA | 指定列时计非空单元格;省略字段时计所有匹配记录。 |
| DGET | 返回唯一匹配记录的指定字段。多条匹配为 Err:502;无匹配或唯一匹配字段为空时为 #VALUE!。 |
| DMAX / DMIN | 求匹配记录指定列的最大/最小数字,忽略空白及非数字。无匹配或无可用数字时返回 0;全为零时结果也为 0,不能仅凭 0 判断有没有记录。 |
| DPRODUCT | 数值乘积,忽略空白及非数字;无匹配或没有数字时返回 0。 |
| DSTDEV | 样本标准差,忽略非数字;恰有一条匹配或只有一个数字时为 #NUM!;无匹配或无数字时返回 0。 |
| DSTDEVP | 总体标准差,忽略非数字;无匹配或无数字时为 #NUM!。 |
| DSUM | 数值之和,忽略空白及非数字;无匹配或无数字时返回 0。 |
| DVAR | 样本方差;只有一个可用样本时为 #NUM!,无匹配或无数字时返回 0。 |
| DVARP | 总体方差;无匹配或无数字时为 #NUM!。 |
这些边界来自 26.2 指南,不是本稿运行测试结论。若结果用于重要统计,应同时显示匹配记录数,以免把“没有数据”的 0 与真实零值混为一谈。
还可配合哪些常用函数
原章还列出一组适合表格数据的普通函数;它们不都使用 Database/SearchCriteria 三参数模型,应按各自语法使用:
| 函数组 | 用途 |
|---|---|
| AGGREGATE / SUBTOTAL | 聚合入口。AGGREGATE 提供十九类计算;SUBTOTAL 提供十一类,与 AutoFilter 配合可只计算筛选后的记录。 |
| AVERAGE / AVERAGEA / AVERAGEIF / AVERAGEIFS | 平均、把文本按 0 处理的平均,以及单条件、多条件平均。 |
| COUNT / COUNTA / COUNTBLANK / COUNTIF / COUNTIFS | 数值计数、非空计数、空白计数、单条件或多条件计数。 |
| SUM / SUMIF / SUMIFS / PRODUCT | 求和、按一个或多个条件求和、数值乘积。 |
| MAX / MAXA / MAXIFS;MIN / MINA / MINIFS | 最大值与最小值;A 版本把文本按 0 处理,IFS 版本使用多条件。 |
| MEDIAN;MODE / MODE.SNGL;MODE.MULT | 中位数、单个众数、多个众数。频数并列时 MODE 返回其中最小值,MODE.MULT 返回纵向数组。 |
| STDEV / STDEV.S、STDEVA;STDEVP / STDEV.P、STDEVPA | 样本/总体标准差;A 系列将文本按 0 处理,普通版本忽略空白和文本。 |
| VAR / VAR.S、VARA;VARP / VAR.P、VARPA | 样本/总体方差,文本处理差别与对应标准差函数类似。 |
| CHOOSE / INDEX / INDIRECT / OFFSET | 按索引选择值;按行列取值或数组;由字符串建立引用;在基准引用上按行列偏移。 |
| LOOKUP / HLOOKUP / VLOOKUP | 单行/单列查找;在首行横向查找并从同列取值;在首列纵向查找并从同行取值。 |
| MATCH / XMATCH / XLOOKUP | 返回匹配项目的相对位置;一维数组匹配位置;查找并返回单元格或区域引用。 |
| FILTER / SORT / SORTBY | 按条件返回范围或数组;对内容排序;按对应范围或数组排序。 |
详细语法见应用 Help 与 Calc Functions Wiki。普通 SUM 并不会因为记录被界面筛选隐藏,就自动只计算可见行;若意图是可见记录汇总,应选择相应函数并检查具体行为。
来源、贡献者与本次修改
© 2026 LibreOffice Documentation Team。原章本版贡献者:Regina Henschel、Olivier Hallot。前版贡献者依原章保留:Skip Masonsmith、Barbara Duprey、Jean Hollis Weber、Andrew Pitonyak、Kees Kriek、Zachary Parliman、Simon Brydon、Leo Moons、Felipe Viggiano、Steve Fanning、Rafael Lima、Olivier Hallot、B. Antonio Fernández、Edward Olson、Lisa Samy。中文译编与原创示意图:未完纪。本文为独立译编,非 LibreOffice Documentation Team 发布或背书。商标属于各自权利人。
原章允许按 GNU GPL 3 或以后版本,或 CC BY 4.0 或以后版本分发、修改;本译编选择 CC BY 4.0。修改包括中文翻译、章节编排、以文字整合对话框说明、原创示意图,以及销售数据条件/DSUM 的补充例子。原章的反馈入口是 Documentation Team 论坛;原章提醒发往论坛的内容和个人信息会公开归档,应在提交前考虑公开范围。
本次只完成正文、公式与数据的静态审阅,没有打开工作簿、连接数据源、运行宏或验证 .ods/.xlsx 往返。图中结果与文中补充运算是依据给定表格人工推导,不是软件实测截图或性能结论。
附录:原章界面与数据图
以下15幅图为原章原图,未经修改。© 2026 LibreOffice Documentation Team,本文依CC BY 4.0保留,图注为中文翻译;它们是来源图,不是本次执行截图。界面可能随系统与版本变化。
原章图1:成绩单原始数据

原章图2:定义名称对话框

原章图3:管理名称对话框

原章图4:粘贴名称对话框

原章图5:从边界标题创建名称

原章图6:定义数据库区域

原章图7:选择数据库区域

原章图8:Data Provider输入和预览

原章图9:清除自动筛选

原章图10:自动筛选菜单

原章图11:标准筛选对话框

原章图12:高级筛选对话框

原章图13:成绩单高级筛选条件区域

原章图14:成绩单高级筛选结果

原章图15:DCOUNT距离条件计数示例












暂无评论内容