fpSpread(FarPoint Spread / Spread.NET)报表设计器
fpSpread(FarPoint Spread / Spread.NET)报表设计器怎么用:区域设置详解与正确顺序(含最小可运行示例)
说明:以下内容面向WinForms 的 fpSpread / Spread Designer(不是 SpreadJS)。不同版本中文译名可能略有差异,但“先定画布→再定数据区→再分组/统计”的原则不变。
1) 先搞清楚一件事:“报表设计器模式”到底在管什么?
在 fpSpread 里做报表,通常有两条路:
轻量路线(最常见):把 Spread 当一个“强格式表格”
SheetView绑定DataTable,设置列/对齐/边框/合计行- 再用
PrintInfo控制纸张、页眉页脚、缩放、打印范围
“报表模板/区域驱动”路线(你截图里那些按钮):
把 Sheet 的某一片区域声明成不同角色——报表区域 / 数据区 / 分组头尾区——让设计器按“页眉—数据—页脚”的方式去分页、去重复表头、去生成打印输出。
如果你能看到“纵向报表 / 横向报表 / 固定报表 / 交叉报表”以及“设为报表区域 / 设为数据区域 / 设为分组区域…”这种功能区,那你走的正是第 2 种。
2) 那几个按钮/概念到底是什么意思?
A. 报表类型(纵向/横向/固定/交叉)
| 按钮 | 本质理解 | 什么时候选 |
|---|---|---|
| 纵向报表(最常用) | 一条记录 = 一行,顺着页往下铺;适合清单/明细表 | 检验明细、患者清单、流水表 |
| 横向报表 | 更像“一张单据/卡片”,字段从左往右排,常配“横向纸张” | 收据、体检单、窄条标签 |
| 固定报表 | 布局相对死板,位置更“钉死”,常用于需要严格对齐的单据 | 发票式样、固定格式申请表 |
| 交叉报表(矩阵/Pivot) | 行维度 × 列维度,交叉格放汇总值 | “各机构各月例数/金额”的统计矩阵 |
90%业务明细报表:直接用“纵向报表”,别一上来就切交叉,容易把简单事变复杂。
B. 区域(Region)四件套
| 区域按钮 | 它在干嘛 | 典型放在 Sheet 的什么位置 |
|---|---|---|
| 设为报表区域(灰色圆点) | 声明“这一大片是我的报表画布”,后续分页/打印都以它为边界 | 从表外标题开始,到表尾/签名栏结束 |
| 设为数据区域(绿色圆点) | 声明“这片格子会被数据源逐行展开”,你在这里放[Data.字段] | 表头下方那一整条“明细行模板” |
| 设为分组区域(黄色圆点) | 声明“按某个字段分组”,产生分组头/尾;头里通常放分组值本身 | 数据区上方/外侧的一条“分组头行” |
| 设为分组数据区域(橙色圆点) | 声明“这是分组级别的统计格”,常写SUM(...)之类 | 分组尾(或分组头里)的汇总单元格 |
3) 设置顺序:宁可死板,也不要乱(核心)
正确顺序一句话版
先划画布(报表区域)→ 再做明细行模板(数据区域)→ 再做分组头尾(分组区域)→ 最后做分组汇总(分组数据区域)
推荐的最小步骤(纵向清单为例)
假设你的 Sheet 大致这样规划:
- 第1行:报表大标题(不在数据循环里)
- 第2行:列标题(序号/检验机构/姓名/金额…)
- 第3行:明细模板行(你准备在这里绑字段)
- 第4行:表尾/签名区(可选)
Step 1:设报表区域(必须先做)
选中第1行 ~ 可能用到的最远行(例如A1:J50)
→ 点设为报表区域
目的:告诉设计器“我的报表边界就在这”,否则后面区域很容易越界,打印会多出空白页。
Step 2:设数据区域(明细展开区)
选中第3行那一行的单元格范围(例如A3:J3或A3:J100,看你模板怎么画)
→ 点设为数据区域
再把字段拖/绑进去:[Data.序号] [Data.检验机构] [Data.金额] …
关键点:数据区域一般只要“一行模板”,运行时按记录数向下复制。
Step 3:设分组区域(如果你要按机构分组)
如果列标题第2行要保留,通常分组头会放在第2行上面/包围住,或设计器允许你把第2行做成“分组头模板”。
选中分组头所在行范围 → 点设为分组区域→ 指定分组表达式(例如检验机构)
Step 4:设分组数据区域(小计/合计)
在分组尾(或你允许的汇总位置)放合计单元格 → 点设为分组数据区域→ 写汇总公式,例如=SUM(金额)(字段名以你绑定名为准)
4) 不用“区域四件套”也能跑:PrintInfo 兜底法(很实用)
很多项目其实只需要:表格清单 + 打印好看。这时不一定非要玩复杂区域,直接靠PrintInfo就很稳:
varpi=newFarPoint.Win.Spread.PrintInfo();// 纸张/方向pi.PaperSize=newSystem.Drawing.Printing.PaperSize("A4",827,1169);pi.Orientation=FarPoint.Win.Spread.PrintOrientation.Landscape;// 边距(单位是 1/100 英寸)pi.Margin=newFarPoint.Win.Spread.PrintMargin{Top=50,Bottom=50,Left=50,Right=50};// 页眉/页脚(\t 当分隔:左|中|右)pi.Header=@"华坪县县域医共体检验互认明细报表\t\t打印日期:{Date}";pi.Footer=@"第 {Page}/{PageCount} 页\t\t制表人:";pi.ZoomFactor=80;// 80%缩放(或你用 ZoomToFit)pi.ShowColor=true;pi.ShowBorder=true;pi.ShowGrid=true;fpSpread1.Sheets[0].PrintInfo=pi;fpSpread1.PrintSheet(0);页眉页脚支持的变量({Date}{Page}{PageCount}等)在官方打印页眉页脚说明里也有体现。
5) 最容易踩的坑(建议你对着检查)
- 先设数据区再设报表区域:容易导致数据区跑到报表边界外 → 打印缺内容/空白页。
- 合并单元格跨区域:只要开启了“分页/报表区域”语义,合并格跨区通常会把分页逻辑搞乱(这是同类报表工具的通用雷区)。
- 把列标题行也圈进数据区:会导致表头被当成模板重复输出。
- 数据源为空还硬看效果:设计器可能看起来“没反应”,先绑定一条两条假数据最省时间。
6) 最小可运行:从 DataTable 绑定的起点(不管你区域做不做花活)
vardt=newSystem.Data.DataTable();dt.Columns.Add("序号",typeof(int));dt.Columns.Add("检验机构");dt.Columns.Add("患者姓名");dt.Columns.Add("金额",typeof(decimal));dt.Rows.Add(1,"医院A","张三",120);dt.Rows.Add(2,"医院A","李四",200);dt.Rows.Add(3,"医院B","王五",150);varsheet=fpSpread1.Sheets[0];sheet.DataSource=dt;// 立刻变报表的关键其实是:锁格式 + 关默认“交互那堆东西”sheet.OperationMode=FarPoint.Win.Spread.OperationMode.ReadOnly;sheet.RowCount=dt.Rows.Count+1;// +1 看你需不需要预留标题行如果你愿意贴两样东西,我可以“按你电脑上真实界面”把每一步精确落到行号
- 你用的是fpSpread(WinForms)还是SpreadJS 报表插件(Web)?
- 把你设计器里 Sheet 的行用途规划发我(第1行写啥、第2行是不是列标题、第3行开始是不是明细……),我就按你的模板把“报表区域/数据区域/分组区域”应该分别框哪几行告诉你,并补一段对应的绑定代码。
