简介:Smartbi报表设置文档是一份面向数据分析、报表开发与Smartbi初学者的完整操作指南,系统讲解借助Excel中的Smartbi页签完成从引用模板、页面设置、隔行不同颜色、列宽自适应到参数校验与预览发布的报表配置全流程。文档针对列宽自适应给出通用宏代码,并围绕开始日期与结束日期设计不早于、不超过90天两道校验逻辑,能有效避免业务参数误填;同时总结参数排版一行不超过六个、多行时后行保留至少两个等实用规范,便于读者直接对照落地。资源包为1个docx文档,体积1.05MB,内容紧凑、步骤分明,适合需要快速上手Smartbi报表配置的用户按需查阅与复用。目前已有1302人学习下载,文档覆盖报表样式设计、条件格式应用、宏参数控制等关键知识点,对日常报表美化、业务参数联动与报表发布均具有较强的实践参考价值。
1. Smartbi 报表设置:从 Excel 模板到发布上线的完整链路
Smartbi 报表设置,说白了就是用 Excel 当画布,在 Smartbi 插件加持下,把一张静态表格变成能挂参数、能随数据刷新、能发布到门户的动态报表。这篇文档拆的是完整链路:引用模板、页面设置、隔行变色、列宽自适应、日期参数校验宏、参数排版、预览发布,七个环节都有对应的实操细节。
适合刚接手 Smartbi 报表的乙方实施、企业报表开发,以及想把现有 Excel 报表改造成 Smartbi 模板的运营同学。整篇没有高深理论,跟着步骤走就能把报表搭起来。
但有一个例外:日期参数校验那段宏,值得你亲手抄进宏管理里跑一遍。90 天限制和结束日期不能早于开始日期这两个校验,是项目里被问得最多的逻辑,第四章会拆到每一行。
2. 引用模板与页面设置:先把报表画布的形状定下来
2.1 引用模板:登录、打开模板、设计新样式的操作顺序
Smartbi 的报表开发不是从一张空白 Excel 开始的。绝大多数项目都会维护一套公共模板,模板里预置了公司 Logo、页眉页脚、标题字体、边框样式,甚至已经写好的部分公式或命名区域。你在模板上做设计,相当于站在项目既有的规范和结构上盖楼,而不是每次从平地起。这也是 Smartbi 报表和其他报表工具不太一样的地方——画布就是 Excel 本身,模板就是别人帮你踩过坑之后留下的标准答案。
我一般会这样做:先打开 Excel,找到 Smartbi 页签,输入账号密码登录。登录成功后点击「模板」按钮,在弹出的模板树里找到目标模板,双击打开。注意,这里打开的不是普通 Excel 文件,而是 Smartbi 服务器上的模板文件。这一点很重要:你在模板上的每一次修改,最终保存的都是服务端副本,而不是本地文件。所以别在本地另存一个 Excel 再开发,那样开发完还得手动导回服务器,中间环节格式容易出问题。
打开模板之后,直接在原有样式上设计新报表样式。这里有一个容易被忽略的细节:模板里可能带着上一张报表的历史残留,比如旧单元格的值、没删干净的筛选区块、多余的批注。我接手项目时踩过一次坑——打开模板直接往上写,发布后发现同一单元格出现了两套数据,旧模板的值和新报表的值叠在一起。所以我的习惯是:打开模板后先按 Ctrl+A 全选,用肉眼扫一遍有没有不属于当前需求的残留内容,有就清掉,再开始设计。这个动作花不了 30 秒,但能省掉发布后排查数据错位的半天时间。
关于模板选用还有一个建议:优先选和自己报表布局最接近的模板。要做一张宽表,就选横向布局的模板;做明细台账,就选带冻结行的模板。模板选错了,后续的页面设置会事倍功半,因为你要花大量时间去调边距、调列宽、调表头位置。
2.2 页面设置:空白首行与冻结行的配合逻辑
页面设置这部分,原文档只写了「第一行是空白行,所以上面报表冻结的是 1-5 行」这一句,但这句话背后是有讲究的。设置冻结行的目的,是让报表在 Smartbi 门户里上下滚动时,表头始终固定在可视区域。而第一行留白,是为了给 Smartbi 门户里的参数筛选区让出空间——参数区在页面顶端占据固定高度,如果报表第一行直接就是表头,用户滚动时会发现表头被参数区遮住一半,体验很差。
具体操作上,页面设置主要调四块内容:
| 设置项 | 推荐值 | 说明 |
|---|---|---|
| 冻结窗格 | 冻结 1-5 行 | 前 4 行是标题和表头区,第 1 行空白行作为缓冲 |
| 纸张方向 | 横向 | 绝大多数数据报表的列数超过纵向一页容量 |
| 缩放比例 | 适合一页宽 | 避免发布后出现横向滚动条 |
| 打印区域 | 从标题行到最后一行 | 影响门户导出 PDF 的页面范围 |
冻结窗格在 Excel 里的操作是:先选中第 6 行的行首(也就是第一个不参与冻结的行),然后「视图 → 冻结窗格 → 冻结首行及以上」。设置完以后,用 Smartbi 页签里的「预览」功能滚动数据行,如果表头跟着滚走了,说明冻结位置选错了。常见错误是选中第 1 行去冻结,结果只冻结了标题行,真正的数据表头还是会滚出屏幕。
打印区域这块很多人会忽略。报表最终在门户上以网页形式浏览,但如果用户点「导出 PDF」,Smartbi 会依据 Excel 的页面设置(纸张方向、边距、打印区域)来生成 PDF。不设置打印区域的话,PDF 会在数据行之间插入大量空白页,因为 Smartbi 默认按 Excel 的分页符来切割。我的做法是在「页面布局 → 打印区域 → 设置打印区域」里,把表头到数据区最末行的范围框选进去,然后去分页预览模式里检查分页符的位置,该拖就拖到合理位置。
提示:页面设置里的边距建议保持 Excel 默认值。Smartbi 门户有自己的渲染容器,过大的边距会让报表整体缩水,视觉上左右两侧留白过多。
3. 隔行变色与列宽自适应:两组样式配置的落地细节
3.1 隔行不同颜色:用条件格式还是内置表格样式
隔行变色(斑马纹)的目的是提升数据可读性,尤其是当报表行数超过屏幕高度时,行与行之间的边界感会明显增强。Smartbi 报表里实现隔行变色有两种常见路径:一种是用 Excel 的条件格式,另一种是套用 Excel 内置的表格样式。
条件格式的写法是:选中数据区域,注意从第二个数据行开始选,因为表头行通常不参与斑马纹。然后「开始 → 条件格式 → 新建规则 → 使用公式确定要设置格式的单元格」,输入以下公式:
=MOD(ROW()-1,2)=0这个公式的语义是:当前行号减 1 后对 2 取模,结果为 0 的偶数行(相对数据区首行而言)应用填充色。这里用 ROW()-1 而不是 ROW(),目的是让数据区的第一行不管在 Excel 的第几行,都能作为「奇数行」处理,从而保证颜色从第一行开始就是正确的。如果用 ROW() 直接取模,当数据区起始行号是偶数时,斑马纹会整体颠倒。
参数说明:
- MOD(ROW()-1,2):行号偏移后对 2 取模,产生 0/1 交替序列
- =0 或 =1:决定奇数行还是偶数行着色
- 填充色建议用浅灰或浅蓝(如 #F2F2F2),避免深色在导出打印时糊成一团
用表格样式的方式更省事:选中数据区,按 Ctrl+T 创建表格,在「表格设计」里选一个带斑马纹的内置样式。但这条路径有一个隐患——Smartbi 对 Excel 表格对象的兼容性不如普通单元格区域。我在一个项目里试过用表格样式做隔行变色,预览时正常,发布到门户后样式直接丢失,整张表变成无边框的纯文本。最后排查下来是 Smartbi 版本对表格对象的渲染支持不足,换成条件格式后一切正常。所以我的建议是:能用条件格式就别用表格样式,至少在正式环境里先发布验证一次。
3.2 列宽自适应:main 函数与 autoFitColumns 的调用差异
列宽自适应是 Smartbi 报表里一个高频需求。Excel 里手动双击列边界能自适应列宽,但这一动作在 Smartbi 门户里不一定生效,因为门户渲染时像素宽度和 Excel 的字符宽度换算有误差,所以 Smartbi 提供了脚本接口来做这件事。
在 Smartbi 的宏管理中,新建宏时会生成一个 main 函数框架。列宽自适应的标准写法如下:
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 }这段代码的逻辑是:先拿到当前报表的第一个工作表对象,做一次空值保护,然后取这个工作表的最大显示列数,最后调用 autoFitColumns 从第 0 列一直自适应到最后一列。main 函数是 Smartbi 宏体系约定的入口,报表每次渲染时都会执行一遍,所以列宽自适应会在每次刷新后重新生效。
代码里的几个参数值得单独说明:
worksheets.get(0):取第一个工作表。如果报表有多个 sheet,需要按实际情况改成 get(1) 或 get(2)maxDisplayRange.columnCount:拿到的是可视区域的列数,不是单元格区域的总列数。如果报表里存在隐藏列,这个值可能比实际数据列数大,导致自适应把隐藏列也撑开autoFitColumns(0, counts):第一个参数是起始列索引,第二个参数是结束列索引,索引都从 0 开始。如果只想对前 10 列做自适应,就写成 autoFitColumns(0, 9)autoFitColumn(3):注释掉的单列自适应。当只有个别列因为内容过长需要撑宽时,用这个方法比全局自适应更精准,不会影响其他列的手动宽度
这里有个坑:autoFitColumns 的第二个参数在语义上是「结束索引」还是「列数」,不同 Smartbi 版本有过差异。我在某个版本里发现传 counts 之后自适应范围比预期少一列,排查了半天才意识到那个版本的实现是把第二个参数当作结束索引用的,最后一列没被覆盖。所以写完之后一定要在预览里数一下最后一列有没有被自适应到,没有的话把参数改成 counts + 1 或 counts - 1 试试,以实际渲染结果为准。
另一个实际经验是:不要在宏里对所有列做自适应后,又手动在 Excel 里给某些列设了固定宽度。宏执行时机在报表渲染时,会覆盖手动设置,最终以宏的结果为准。所以如果你只想让三列自适应、其余列保持设计宽度,就老老实实调用三次 autoFitColumn,而不是调 autoFitColumns 之后再想办法改回去。
提示:列宽自适应的代码是全报表通用的,不绑定任何参数。它和日期校验宏互相独立,可以同时挂在同一个宏管理里,互不干扰。
4. 日期参数校验宏:结束日期与开始日期的 90 天约束
4.1 doRefresh 拦截机制:为什么覆盖而不是新建
报表参数里有两个日期:开始日期和结束日期。业务上通常有两条硬约束:结束日期不能早于开始日期;结束日期与开始日期的差不能超过 90 天。这两条规则如果在数据库 SQL 里过滤,用户体验会很差——用户选完日期点了查询,报表转半天然后报错,用户根本不知道是自己选错了日期。所以要在前端拦截,在用户点击刷新(doRefresh)的时候先做校验,不通过就直接弹提示,不发请求。
Smartbi 的宏体系里,报表刷新动作对应的是 spreadsheetReport 对象的 doRefresh 方法。在这个场景下,正确做法是先保存原始 doRefresh 的引用,再把它替换成自己的校验函数。这就是原文档里_jhy_doRefresh模式:
function main(spreadsheetReport) { if(!spreadsheetReport._jhy_doRefresh){ spreadsheetReport._jhy_doRefresh = spreadsheetReport.doRefresh; } spreadsheetReport.doRefresh = function(fromButton, delayMask) { // 校验逻辑 this._jhy_doRefresh(fromButton, delayMask); }; }为什么要这么写?因为直接覆盖 doRefresh 的话,原始刷新逻辑就丢了,校验通过后你根本不知道该怎么触发真正的刷新。保存一份到_jhy_doRefresh,相当于留了一条后路:校验过了就调它,校验不过就 return。这个模式在 Smartbi 宏里非常通用,不只是日期校验,任何需要拦截默认刷新行为的场景都能套用。
4.2 宏代码逐段拆解:参数获取、日期解析与阈值判断
完整的校验宏如下,可以直接复制到 Excel 的 Smartbi 页签 → 宏管理 → 新建宏里:
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); }; }逐段说明一下这段代码的行为。
第一段spreadsheetReport.getParameterValue("结束日期 2")是按参数名取值。注意参数名后面带了一个空格和数字 2,这不是笔误——当报表里存在同名参数时,Smartbi 会自动给第二个实例加序号后缀。在宏里取值时,参数名必须和报表参数面板里的名字完全一致,包括空格。我见过有人把「结束日期 2」写成了「结束日期」,拿到的值是 null,后面的 new Date(null) 直接解析出当前时间,导致校验永远通过,等于没设防。
第二段.replace(/\-/g, "/")是把日期字符串里的连字符替换成斜杠。原因是 JavaScript 的 new Date() 对 "2025-01-15" 这种格式的解析在不同浏览器里行为不一致,某些环境下会把 "-" 格式按 UTC 时间解析,导致日期偏移一天;替换成 "2025/01/15" 后所有主流浏览器都按本地时间解析,比较结果才可靠。这是日期校验宏里的一个隐藏玄学,不换斜杠的话,跨时区场景下你会看到诡异的一天偏差。
第三段new Date(...)执行完,得到两个 Date 对象。直接用<比较 Date 对象是合法的,JavaScript 会调用对象的 valueOf 拿到毫秒时间戳再比较,所以endtime < starttime就是标准的结束日期早于开始日期判断。
第四段endtime.getTime() - starttime.getTime() > 1000 * 3600 * 24 * 90,这里把天数换算成毫秒:1000 毫秒 × 3600 秒 × 24 小时 × 90 天。整个判断用>而不是>=,意味着恰好 90 天时校验通过,超过 90 天才拦截。如果业务要求满 90 天也不允许,把>改成>=就行。
第五段setTimeout(function() { alert(...); }, 100)。为什么不直接 alert?因为 doRefresh 的执行时机可能早于报表 DOM 渲染完成,直接弹窗在某些场景下会被浏览器拦截。延迟 100 毫秒再弹,能确保弹窗正常出现。虽然 100 毫秒在手感上几乎无感,但确实能规避掉一部分偶发弹不出提示的问题。
第六段this._jhy_doRefresh(fromButton, delayMask)。两个参数原样透传给原始刷新函数。fromButton 表示刷新是否由按钮触发,delayMask 是遮罩层延迟参数。如果你在拦截函数里忘了透传这两个参数,可能导致刷新后遮罩层一直卡在页面上,用户以为报表卡死了。
注意:参数名后面的序号后缀不是固定的「2」,它是 Smartbi 按照参数创建顺序自动生成的。如果你报表里只有一个开始日期和一个结束日期,参数名可能就是「结束日期」不带后缀。写宏之前,先到参数面板里确认实际参数名是什么,再动手写代码。
4.3 校验宏适用的边界条件
这段宏不是无条件套用的。原文档里明确写了「该步骤跟进报表参数决定是否需要」,翻译成大白话就是:报表里得有这两个日期参数才需要加这个宏。如果你的报表只有开始日期,或者只有一个查询区间没有结束日期,这段宏贴进去会报错——getParameterValue 拿不到参数值,后续的 Date 解析全乱套。
还有一个细节:getParameterValue获取到的是字符串还是 Date 对象,取决于参数类型。日期参数在 Smartbi 里通常返回字符串,所以代码里才需要先 replace 再 new Date。如果你把参数类型误设成了其他类型,这段解析逻辑就得跟着改。我在一个项目里碰到过参数类型被设成「字符串」但实际传进来是时间戳的情况,直接 new Date 一个毫秒数也能解析,但参数如果是纯数字毫秒值,replace 那步就会报错,因为数字没有 replace 方法。这种情况需要先判断参数类型再决定要不要做字符串替换。
5. 参数排版与发布避坑:五个常见翻车现场
5.1 参数排版:一行不超过 6 个,第二行至少保留 2 个
参数排版影响的是报表上方的筛选项布局。原文档里的约定是:筛选项居左,每行尽可能在美观的基础上平均分配,一行不超过 6 个;如果排成 2 行,第二行至少要保留 2 个。
这个约定的实际意义是避免参数控件挤成一团。当一行塞了 7 个以上的参数时,控件宽度会被严重压缩,日期选择器可能只显示一半,下拉框的文本被截断。居左排列符合阅读习惯,用户在筛选时从左往右扫一遍就能找到目标参数。
关于换行,Smartbi 的设计器里可以拖拽参数到第二行。常见做法是第一行放核心参数,比如日期区间、区域、渠道;第二行放次要过滤条件,比如业务员、状态。第二行至少保留 2 个的原因,是避免只有一个参数孤零零地挂在第二行,视觉上像排版事故。
5.2 避坑记录:五条实战踩坑
以下避坑记录均来自实际项目调试,每一条都按「现象 → 原因 → 解决」整理。
坑 1:日期校验宏保存了但完全不生效
现象:宏管理里新建了宏,代码也贴进去了,预览报表时选一个结束日期早于开始日期的组合,点了刷新,报表照样查询,没有任何提示。
原因:宏没有关联到当前报表。Smartbi 的宏管理里新建宏之后,还需要在当前报表的资源设置里确认宏已经被绑定。常见情况是宏新建后自动绑定了,但如果你是通过「另存为」复制的报表,绑定关系可能丢失。
解决:回到 Excel 的 Smartbi 页签 → 宏管理,查看宏列表里是否有当前校验宏;没有就手动绑定。绑定后重新预览,再测一次边界日期。
坑 2:alert 弹窗出现但刷新没被拦住
现象:弹窗正常弹出,点掉之后报表还是刷新了,等于校验形同虚设。
原因:return 的位置不对。我见过有人把 return 写在 if 块外面,或者写了两个 return 但第二个 return 在 setTimeout 内部——setTimeout 是异步回调,return 只退出回调函数,根本拦不住 doRefresh。
解决:确认两个 return 都在 doRefresh 函数体内部、if 代码块内部。最简单的方法是把 setTimeout 和 return 配对写,弹窗归弹窗,return 归 return,两者是先后关系而不是嵌套关系。
坑 3:日期差刚好 90 天被拦截
现象:用户选了间隔恰好 90 天的日期,被提示「两个参数的差不能超过 90 天」。
原因:代码用>理论上不会误拦,但日期参数如果带了时分秒,比如开始日期是 2025-01-01 00:00:00,结束日期是 2025-04-01 12:00:00,计算出的毫秒差会略大于 90 天整,于是被拦截。
解决:按业务口径判断。如果要按自然日算,先把两个日期归零到当天零点再比较。常见做法是在 new Date 之后手动调用 setHours(0,0,0,0) 去掉时分秒再参与计算。
坑 4:列宽自适应后最后一列没有撑开
现象:预览报表时,前面几列自适应正常,最后一列的内容还是被截断。
原因:autoFitColumns 的第二个参数在不同 Smartbi 版本里的语义不一致,有的版本把它当作结束索引,有的当作列数,导致遍历范围差一列。
解决:预览后检查最后一列,如果没撑开,把 counts 改成 counts + 1 或 counts - 1,重新预览确认。这种差异属于版本行为,没有统一答案,只能实测。
坑 5:发布后隔行变色样式丢失
现象:Excel 里设置好的隔行变色,预览正常,发布到门户后变成纯白底。
原因:使用了 Excel 表格样式(Ctrl+T 创建的表格对象),而当前 Smartbi 版本对表格对象的渲染支持不完整,条件格式反而没问题。
解决:把表格样式拆掉(表格设计 → 转换为区域),重新用条件格式做隔行变色。或者在上一个版本里验证表格样式是否被支持,不支持就走条件格式。
6. 预览发布后的验证技巧:文字和表格在同一张报表里对齐
Smartbi 报表发布之前,「预览」只是第一步。真正要验证的是发布后的行为:参数刷新是否正常、样式在门户里是否走样、导出 PDF 是否干净。这里有一个我坚持了很久的习惯:发布前强制走一遍边界日期测试。
具体做法是准备三组日期组合:第一组结束日期早于开始日期,用于验证「结束时间不能早于起始时间」的提示是否弹出;第二组结束日期比开始日期大 91 天,用于验证 90 天上限的拦截;第三组间隔恰好 90 天,用于验证边界值放行逻辑没有误伤。三组跑完,日期校验宏的逻辑才算真正闭环。这个测试只需一分钟,但能挡住绝大多数发布后翻车的情况。
再展开一个和「文字 + 表格的报告」场景强相关的技巧。Smartbi 报表允许在一张画布里同时放置文字说明和数据表格。很多报表不只是数据罗列,底部还需要一段分析结论、口径说明或者业务备注。做法很简单:在 Excel 模板里选中几个连续的空白单元格,合并成一个横向区域,输入文字。Smartbi 发布后会把合并单元格里的文字原样渲染出来。
这里有一个容易翻车的对齐问题:文字区的合并宽度最好与上方数据表格的总宽度保持一致,否则会出现文字区比表格窄一截或者宽一截的错位。验证方法是在预览模式下把缩放比例调到 100%,沿着表格的左右边界垂直往下看,确认文字区边界与表格边界在同一条线上。肉眼对齐虽然土,但比任何参数设置都直接。
| 检查项 | 验证方法 | 通过标准 |
|---|---|---|
| 文字区对齐 | 预览缩放到 100%,沿表格边界垂直看 | 文字区与表格区左右边界对齐 |
| 参数刷新 | 改日期参数后点刷新 | 数据变化且无报错 |
| 导出 PDF | 门户中执行导出 | 无空白页、无列截断 |
| 冻结行 | 滚动数据行 | 表头始终可见 |
从那以后,我每次改完 Smartbi 报表,都会强制走一遍这四件事:三组日期边界测试、文字区和表格区对齐检查、一次 PDF 导出、一次冻结行滚动验证。全部跑完才点发布。这套习惯帮我挡掉过至少三次发布后返工,希望帮到你。
本文还有配套的精品资源,点击获取