简介:这份Smartbi报表设置文档面向使用Smartbi进行报表开发的数据分析与报表人员,帮助解决从模板引用到预览发布全流程中的配置与样式难题。资源包内含1个docx文档,压缩包约1.05MB,以图文步骤与代码片段结合的方式呈现。内容覆盖引用模板、页面设置、隔行不同颜色、列宽自适应、参数设置、参数排版及预览发布等环节,并给出列宽自适应与参数校验的通用宏代码,例如限制结束日期不早于开始日期且间隔不超过90天,同时说明参数排版每行不超过6个、两行时第二行至少保留2个等细节。已有1302人学习下载,适合需要快速掌握Smartbi报表设置技巧、对照实操与查漏补缺的初中级报表开发者参考。
1. 从一份 Excel 插件文档说起:Smartbi 报表设置到底在设什么
很多人第一次接触 Smartbi 报表,以为它就是个"Excel 里画表格"的工具,直到把做好的报表发到 Web 端,发现列宽全乱、参数能选出一个 200 天的区间、隔行颜色在翻页后错位,才意识到这份《Smartbi 报表设置文档》里写的每一步都不是可选项。它本质上是一份"Excel 插件端 + 服务端渲染"的协同配置清单:模板引用决定数据绑定关系,页面设置决定冻结行与打印边界,条件格式决定隔行底色,宏脚本决定列宽自适应和参数校验,参数排版决定筛选区的视觉密度。适合两类人:一类是刚接手报表开发、需要在 Excel 里完成 90% 设计工作的实施人员;另一类是被"参数校验不生效""列宽在浏览器里被截断"这类问题反复折腾、想从宏层面找根因的熟手。下面按文档里的七个环节拆开讲,重点放在能直接抄的脚本和容易翻车的地方。
2. 模板引用与页面设置:冻结行、打印边界和第一行空白
2.1 模板引用不是"打开文件",是建立数据绑定通道
在 Excel 的 Smartbi 页签里点"模板"再打开,这个动作背后做的是把当前工作簿注册到 Smartbi 服务端,让单元格里的取数公式、参数占位符和服务端数据集建立映射。常见做法是:先在设计器里把数据集字段拖到单元格,确认取数正常,再另存为模板。如果跳过这一步直接改样式,后面刷新时会出现"样式在、数据空"的情况。
引用模板时有两个参数要留意:
| 配置项 | 作用 | 常见取值 |
|---|---|---|
| 数据集绑定 | 决定单元格取数来源 | 服务端已发布的数据集 |
| 参数占位符 | 决定筛选条件注入位置 | {开始日期}、{结束日期} |
| 刷新模式 | 决定打开时是否自动取数 | 手动刷新 / 自动刷新 |
我一般会先建一个最小模板——只放一个字段、一个参数——确认整条链路通了,再往上堆样式。这样出问题时能快速判断是数据层还是样式层。
2.2 页面设置里的"第一行空白"是个隐藏约定
文档里那句"第一行是空白行,所以上面报表冻结的是 1-5 行"容易被忽略。它的实际含义是:冻结窗格的行号计算包含了表头上方的空白行,如果你把标题直接写在第一行,冻结范围就要整体上移一行,否则滚动时表头会被切掉一半。
操作步骤:
- 在 Excel 里选中第 6 行(或表头下一行)。
- 视图 → 冻结窗格 → 冻结至第 5 行。
- 回到 Smartbi 页签,确认页面设置里的冻结行数与 Excel 一致。
提示:冻结行数在 Excel 端和服务端是两套配置,改完 Excel 一定要在页面设置里同步,否则 Web 端预览时冻结失效。
打印边界同理。页面设置里的缩放比例、页边距、打印区域,决定了导出 PDF 时的分页位置。如果报表列数多,建议在页面设置里锁定"调整为 1 页宽",避免导出时被切成两页。
3. 隔行变色与列宽自适应:条件格式和宏脚本怎么配合
3.1 隔行不同颜色:用条件格式而不是手动填色
手动隔行填色在数据行数变化后会错位,正确做法是用条件格式。步骤:
- 选中数据区域(不含表头)。
- 开始 → 条件格式 → 新建规则 → 使用公式。
- 输入公式:
=MOD(ROW(),2)=0。 - 设置填充色,确定。
这样无论数据是 10 行还是 1000 行,偶数行始终带底色。如果报表有分组小计行,公式要改成=MOD(ROW(),2)=0配合SUBTOTAL判断,避免小计行也被染色。
3.2 列宽自适应:一段通用宏的逐行拆解
文档里给出的列宽自适应脚本是通用的,直接贴进宏管理即可:
function main(spreadsheetReport) { var sheet = spreadsheetReport.workbook.worksheets.get(0); if (sheet === "" || sheet === null) { return; } var counts = sheet.cells.maxDisplayRange.columnCount; // 获取电子表格列数 sheet.autoFitColumns(0, counts); // 从 0 开始,到 counts 列结束 // sheet.autoFitColumn(3); // 只对某列自适应,第一列为 0 }逻辑说明:worksheets.get(0)取第一个工作表,maxDisplayRange.columnCount拿到当前有内容的列数,autoFitColumns(0, counts)从第 0 列到第 counts 列批量自适应。参数说明:autoFitColumns(start, end)的 start 和 end 都是列索引,从 0 开始计数;如果只想调某一列,用注释里那行autoFitColumn(3),3 代表第四列。
调试阶段我一般会先单独调某几列,确认宽度合适后再放开全局。全局自适应在列数超过 30 时会有明显性能开销,报表打开会变慢,这时候建议只对关键列做自适应。
注意:
autoFitColumns依赖单元格的实际内容宽度,如果某列内容是动态拼接的长文本,自适应后可能仍然显示不全,需要在单元格里设置自动换行作为兜底。
4. 参数校验宏:日期区间不早于开始、不超过 90 天
4.1 为什么要重写 doRefresh
Smartbi 的参数校验如果只靠数据集 SQL 里的 WHERE 条件,用户点了查询才会报错,体验很差。文档里的做法是在 Excel 的 Smartbi 页签下打开宏管理,新建宏,重写doRefresh,在刷新前拦截参数。这样用户一点查询就能弹出提示,不用等取数返回。
4.2 完整脚本与参数说明
function main(spreadsheetReport) { if (!spreadsheetReport._jhy_doRefresh) { spreadsheetReport._jhy_doRefresh = spreadsheetReport.doRefresh; } spreadsheetReport.doRefresh = function(fromButton, delayMask) { // 根据参数名称获取参数值 // 结束日期不早于开始日期 var endtime = new Date(spreadsheetReport.getParameterValue("结束日期 2").replace(/\-/g, "/")); var starttime = new Date(spreadsheetReport.getParameterValue("开始日期 2").replace(/\-/g, "/")); if (endtime < starttime) { setTimeout(function() { alert("结束时间不能早于起始时间"); }, 100); return; } // 结束日期不大于开始日期 90 天 if (endtime.getTime() - starttime.getTime() > 1000 * 3600 * 24 * 90) { setTimeout(function() { alert("两个参数的差不能超过 90 天"); }, 100); return; } this._jhy_doRefresh(fromButton, delayMask); }; }逻辑说明:先把原始的doRefresh存到_jhy_doRefresh,再用新函数覆盖。新函数里先取两个参数值,replace(/\-/g, "/")是把2024-01-01转成2024/01/01,因为部分环境下new Date()对短横线格式解析不稳定。日期比较用<直接比,天数差用毫秒数除以1000*3600*24。
参数说明:getParameterValue("结束日期 2")里的参数名必须和报表参数面板里的名称完全一致,包括空格和数字后缀。setTimeout包住alert是为了避开刷新过程中的 UI 阻塞,延迟 100ms 是经验值,太短弹窗会被覆盖,太长用户会觉得卡。
提示:如果参数名改了,宏里的字符串也要同步改,否则
getParameterValue返回 null,new Date(null)会得到 1970 年,校验逻辑直接失效。
5. 参数排版与预览发布:一行不超过 6 个的排版规则
5.1 参数排版的三个硬约束
文档里给的排版规则很具体:筛选项居左,每行平均分配,一行不超过 6 个,如果是 2 行,第二行至少保留 2 个。这三条不是审美偏好,是可用性底线。
- 一行超过 6 个,在 1366 宽度的笔记本上会出现横向滚动条,用户要拖动才能看到后面的筛选项。
- 第二行只剩 1 个,视觉上会显得头重脚轻,而且那个孤立的筛选项容易被忽略。
- 筛选项居左是为了和报表主体的左对齐保持一致,避免视线跳跃。
具体操作:在参数面板里拖动筛选项调整顺序,用空格或占位控件补齐每行的数量。如果参数超过 12 个,建议拆成"常用"和"高级"两组,默认只显示常用组。
5.2 预览发布前必须走的检查清单
预览不是点一下"预览"就完事,我一般会按这个顺序过一遍:
- 参数默认值是否正确加载,空值情况下报表是否报错。
- 冻结行在滚动时是否固定,表头是否错位。
- 隔行颜色在翻页或数据量变化后是否仍然正确。
- 列宽在浏览器端是否被截断,长文本是否换行。
- 日期校验宏是否生效,边界值(正好 90 天)是否通过。
- 导出 PDF 或 Excel 时分页是否合理。
发布时注意权限配置:报表挂到目录后,要确认目标用户组有数据集和模板的访问权限,否则会出现"设计器里正常、用户打开空白"的情况。
6. 避坑与排查:五个让我返工过的细节
6.1 现象:列宽自适应后浏览器端仍然显示不全
原因:autoFitColumns计算的是 Excel 端的字符宽度,Web 端字体渲染和 Excel 有差异,中文字符尤其明显。
解决:在自适应之后,对长文本列额外设置sheet.setColumnWidth(index, width)手动加宽 10%~15%,或者在单元格样式里开启自动换行。
6.2 现象:日期校验宏不生效,点查询直接取数
原因:宏没有绑定到正确的报表对象,或者main函数名被改过。Smartbi 的宏入口固定是main(spreadsheetReport),改名后不会执行。
解决:检查宏管理里宏的状态是否为启用,确认函数名和参数完全一致。改完宏后要重新打开报表,宏不会热更新。
6.3 现象:隔行颜色在分组小计行错乱
原因:条件格式公式=MOD(ROW(),2)=0只按物理行号判断,小计行插入后行号偏移,导致颜色和分组不匹配。
解决:改用=MOD(SUBTOTAL(103,$A$2:$A2),2)=0,按可见数据行计数,小计行不参与计数。
6.4 现象:参数名带空格或数字后缀,宏里取不到值
原因:getParameterValue是精确匹配,参数面板显示的名称和代码里的字符串必须一字不差。
解决:在参数面板里复制参数名,粘贴到代码里,不要手打。如果参数名有变动,全局搜索宏里的字符串同步替换。
6.5 现象:预览正常,发布后用户打开报"无权限"
原因:模板引用的数据集没有对目标用户组授权,或者报表目录的权限继承被断开。
解决:在服务端检查数据集权限和目录权限,确保用户组同时拥有数据集读取和报表查看权限。这一步在测试环境容易被忽略,因为测试账号通常是管理员。
7. 进阶技巧:把校验逻辑抽成可复用宏函数
上面那段日期校验宏,如果每个报表都复制一遍,参数名一改就要改多处,维护成本很高。我的习惯是把校验逻辑抽成一个独立函数,放在公共宏里,各个报表只调用入口。
// 公共宏:日期区间校验 function validateDateRange(report, startParam, endParam, maxDays) { var endtime = new Date(report.getParameterValue(endParam).replace(/\-/g, "/")); var starttime = new Date(report.getParameterValue(startParam).replace(/\-/g, "/")); if (endtime < starttime) { setTimeout(function() { alert("结束时间不能早于起始时间"); }, 100); return false; } if (endtime.getTime() - starttime.getTime() > 1000 * 3600 * 24 * maxDays) { setTimeout(function() { alert("两个参数的差不能超过 " + maxDays + " 天"); }, 100); return false; } return true; } // 报表宏入口 function main(spreadsheetReport) { if (!spreadsheetReport._jhy_doRefresh) { spreadsheetReport._jhy_doRefresh = spreadsheetReport.doRefresh; } spreadsheetReport.doRefresh = function(fromButton, delayMask) { if (!validateDateRange(spreadsheetReport, "开始日期 2", "结束日期 2", 90)) { return; } this._jhy_doRefresh(fromButton, delayMask); }; }这样改的好处是:参数名和天数上限都变成入参,新报表只要改调用那行的三个值。maxDays传 90 就是文档里的需求,传 30 就是月度报表,传 365 就是年度报表。
验证方法:把开始日期设为2024-01-01,结束日期设为2024-03-30(正好 89 天),应该通过;设为2024-03-31(90 天),应该通过;设为2024-04-01(91 天),应该弹出提示。边界值一定要测,因为>和>=差一天,用户对"90 天"的理解往往是包含首尾的。
还有一个容易忽略的点:getParameterValue返回的是字符串,如果参数为空,replace会报错。稳妥做法是在校验前加一层空值判断:
var startVal = report.getParameterValue(startParam); var endVal = report.getParameterValue(endParam); if (!startVal || !endVal) { return true; // 参数为空时不拦截,交给数据集处理 }从那以后我每次写参数校验宏,都强制走一遍"空值 → 格式转换 → 边界比较 → 原始刷新"这四步,再也没出现过因为参数为空导致整个报表打不开的情况。希望帮到你。
本文还有配套的精品资源,点击获取