小智报表实战系列I 轻松玩转中国式复杂报表-3 分栏报表
需求背景:体检化验报表(带参数查询)
在医疗信息系统中,分栏报表对于客户体检化验项目的需求主要集中在以下几点:
数据密度与清晰度:化验报告通常包含大量的项目,如血液检查、尿液分析、生化指标等,每一项都需要清晰、准确地显示在报表上,而分栏报表可以帮助在有限的空间内排列更多的项目而不牺牲可读性。
对比与分析:医生和实验室工作人员需要快速对比不同样本或同一患者在不同时间点的化验结果,分栏报表通过将相关数据并排显示,便于进行直观的比较分析。
规范化输出:化验报告需要遵循一定的格式标准,分栏报表可以确保所有项目按照规定的顺序和格式呈现,便于统一管理和存档。
灵活性与定制化:不同的科室或医疗机构可能有不同的报告需求,分栏报表应支持自定义栏目数量、宽度和排序,以适应特定的工作流程。
报表难点
- 主子表
- 子表分栏
小智报表解决方案
小智报表设计器实现要点
脚本嵌入 接口实现
<link rel="stylesheet" href="/xzreport.css">
<script type="module" src="/xzreportdesigner.js"></script>
const dataset = [ // 添加数据集按钮
{ id: 1,value: "新建Json数据集" },
{ id: 2,value: "新建Http接口数据集" },
{ id: 3,value: "API服务数据集" },
{ id: 4,value: "外部数据集" }];
const options = {
row: 100, col: 25,
width: () => document.documentElement.clientWidth,
renderArrow: true, // 是否显式 扩展方向图标
showFreeze: true, // 是否显式冻结线
showGrid: true, // 是否显式网格线
showPreviewToolbar: true,
showBottombar: true,
showSelect: true,
dataset
}
const _onUpdateDatasetList =
[
{
"name": "检验报告单",
"id": "检验报告单",
"type": 4,
"columns": [
{"name": "bgd_id", "data_type": "3" }, {"name": "姓名", "data_type": "3" },
{"name": "科别", "data_type": "3" }, { "name": "病人类别", "data_type": "3" },
{"name": "标本号", "data_type": "3" }, { "name": "性别", "data_type": "3" },
{"name": "送检医师", "data_type": "3" }, { "name": "标本类型", "data_type": "3" },
{"name": "病历号", "data_type": "3" }, { "name": "年龄", "data_type": "3" },
{"name": "床号", "data_type": "3" }, { "name": "临床诊断", "data_type": "3" },
{"name": "备注", "data_type": "3" }, { "name": "送检时间", "data_type": "3" },
{"name": "检查时间", "data_type": "3" }, { "name": "检验者", "data_type": "3" },
{"name": "审核者", "data_type": "3" }, { "name": "报告时间", "data_type": "3" },
{"name": "注意", "data_type": "3" } ],
"params": [ { "name": "bgd_id", "data_type": "3" } ] },
{
"name": "检验项目",
"id": "检验项目",
"type": 4,
"columns": [
{ "name": "bgd_id", "data_type": "3" }, { "name": "序号", "data_type": "3" },
{ "name": "项目名称", "data_type": "3" }, { "name": "结果", "data_type": "3" },
{ "name": "单位", "data_type": "3" }, { "name": "参考值", "data_type": "3" } ],
"params": [ { "name": "bgd_id", "data_type": "3" } ]
}
]
options.onUpdateDatasetList = () => {
return new Promise((resolve, reject) => {//Promise 异步回调
resolve(_onUpdateDatasetList);// 返回后台获取的数据集列表
})
}
onMounted(() => {// 页面加载时,初始化报表设计器
sheetDesign = XZReportDesigner("#action_8_1_main", options);
})
类excel报表设计 = 自由拖拽(低代码) + 极简配置
数据保存
const {config, data} = sheetDesign.getData(); //报表设计器的保存事件
报表渲染要点
准备模板和数据
在前面报表设计器的保存数据中,已经提交到业务后台保存;现在只需要axios.get提取config,data这2个json数据
脚本嵌入 接口实现
const option = {
mode: 'read', view: { width: 1920px, height:1080px }, // 设置报表的宽高
renderArrow: true, // 是否显式 扩展方向图标
showFreeze: true, // 是否显式冻结线
showGrid: true, // 是否显式网格线
showPreviewToolbar: true, showBottombar: true, showSelect: true,};
......
onMounted(() => {
....
//sheetConfig是报表设计器中getData().config
//data 是报表设计器中getData().data
spreadSheet = XZReport("#containerxzreport1", option, sheetConfig, data);
....
}
实现数据接口
const onUpdateData = (datasets, params) => {
console.log("datasets:", datasets, "params:", params);
return new Promise((resolve, reject) => {
//假设从axios远程拿到的报表渲染数据放在__updateData中(和getData().data不是一个东西)
resolve(queryonUpdateDataFrom(datasets, params,__updateData));
})
}
option.onUpdateData = onUpdateData
数据样例
点评
接口精简(默认可以满足大部需求)
- onUpdateDatasetList :提供候选数据集列表
- onUpdateData :提供数据集记录(带参数查询)
- sheetDesign.getData() :提取报表设计器的模板数据
//config,data两个部分,都作为报表模板保存 - options功能选项配置 :默认配置即可满足大部分需要
- reportDesign.on(“dataset-edited”,on_dataset_edited);//监听 编辑数据集事件
- reportDesign.loadData({config: config, data: data});//触发数据刷新事件
- spreadSheet.update(config, data);
- Json数据格式 :跨平台通用
分组/聚合/汇总/钻取/穿透/图表/函数/富文本/多样式单元格 层级坐标体系 开箱即用
- 简化后端程序员数据处理逻辑
- 减少后端数据库压力,前端只需要极少的原始数据
- 促进报表设计器人员和后台程序员合理化分工并行工作
参数查询 导出 打印 最大/小化 刷新 = 低代码 + 极简配置 开箱即用
参考文档和样例源码下载
-
小智报表样例源码下载
- https://gitee.com/tizdata_admin/vue-xzreport-example.git
-
小智报表demo体验
- https://xzdemo.tizdata.com/#/imbedShow/reportExample
- 丰富的报表模板示例
-
小智报表在线试用
- https://xzreport.com
-
小智报表js sdk下载
- https://tizdata.com/xzdownload/
-
开发使用文档
- https://doc.tizdata.com/xiaozhi/650