cass导出界址点成果表的模板可以改成我自己的吗
可以改成你自己的模板,CASS(尤其是10.0及以上版本)完全支持界址点成果表的自定义修改,包括表头、列、样式、每页行数、小数位等,通过自带的模板编辑工具即可操作。
一、核心修改入口(CASS 10.x/11.x)
-
打开CASS,进入菜单:地籍 → 启动模板编辑工具。 命令是
RUNSMARTTABLETOOL
-
在模板编辑器中点打开,选择安装目录下
report文件夹里的界址点成果表模板(如界址点成果表_excel.zip或 Word 版)。

- 双击左侧模板名,会自动打开对应的 Excel/Word 模板文件,直接编辑样式、表头、列宽、字体、页边距等。
界址点成果表.zip中的内容如下:

界址点成果表_excel.zip的内容如下:

界址点成果表_excel_many.zip的内容如下:

- 如需调整每页界址点行数、分页规则、小数位数,编辑同目录下的
.lua脚本文件,修改对应参数后保存。 (这个我还没测试) - 先保存 Excel/Word,再在模板编辑器中点保存,退出后重新生成成果表即生效。
二、可自定义的内容
- 表头、标题、单位、落款、日期等文字与格式 - 列的增减、顺序调整、列名修改(点号、X、Y、H、边长、界标类型等) - 坐标/面积小数位数、字体、颜色、对齐方式 - 每页显示行数、分页空行、纸张大小与方向 - 页眉页脚、水印、边框样式
三、关键注意事项
- 先备份原模板(复制整个
report文件夹),避免改错无法恢复。 - 动态字段(如
[ZD_ZDH]宗地号、[JZD_DH]界址点号)不要删除或乱改字段名,只改格式与位置,否则数据无法填充。 - 复杂字段新增需先在
cassconfig.db确认字段名,再在模板中按规范插入,避免导出空白或报错。 - 旧版CASS(如 9.1及以下)部分模板为固定文件,修改有限,建议升级到10.x以上。
四、最简操作流程(Excel版)
- 备份
CASS安装目录\report。 - 地籍→启动模板编辑工具→打开
界址点成果表_excel.zip。 - 双击左侧模板名,打开Excel,改表头、列、样式后保存关闭。
- 如需改每页行数,编辑
.lua里的分页参数。 - 模板编辑器内点保存,退出。
- 重新执行 地籍→生成界址点成果表,即可按新模板导出。 需要我按你的CASS版本(10.1/11.0等)给你一份逐行可复制的lua分页参数和字段对照表吗?
本次实际操作记录
下载示例成果
- 测试发现
界址点成果表excel.zip对应的是批量输出界址点成果表


双击 界址点成果表excel.zip会打开wps
下面是改了的,但我不知道具体是这里起作用,还是下面的lua代码起作用

界址点成果表main.lua
保持原来的不变
require("stfunctions")
local excel = st.currentExcel()
local callback = excel:callBack("jzdcgb")
--callback:setDB(1, 1)--设置宗地作为当前1类数据源
--stReplace(excel,callback)
界址点成果表sheet1.lua
- 实现 “宗地一、宗地二” 自动编号,核心是新增计数器并替换宗地号生成逻辑;
require("stfunctions")
local excel = st.currentExcel()
local sheet = st.currentExcelSheet()
local callback = sheet:callBack("jzdcgb")
-- ====================== 【可自定义参数】 ======================
local onepagenum = 35 -- 每页界址点数量(默认35,可改20/30/50)
local dj_coorddot = 3 -- 坐标小数位数(默认3,改4则保留4位)
local dj_distdot = 2 -- 距离小数位数(默认2,改4则保留4位)
local row_offset = 81 -- 分页行偏移量(默认81,无需改)
-- ==============================================================
-- 新增:宗地序号计数器(实现"宗地一/二"自动编号)
local zd_serial_num = 1 -- 从1开始计数
-- 数字转中文序号(1→一、2→二...,支持1-99)
local function num_to_chinese(n)
local chn = {"零","一","二","三","四","五","六","七","八","九","十",
"十一","十二","十三","十四","十五","十六","十七","十八","十九"}
local chn2 = {"二十","三十","四十","五十","六十","七十","八十","九十"}
if n <= 19 then
return chn[n+1]
elseif n < 100 then
local shi = math.floor(n/10)
local ge = n % 10
if ge == 0 then
return chn2[shi-1]
else
return chn2[shi-1]..chn[ge+1]
end
else
return tostring(n) -- 超过99直接显示数字
end
end
local zdcount = callback:getInt(4,"zdcount")
local dj_jzdorder=callback:getInt(1,"#dj_jzdorder") --获取当前界址点编号方式
for z = 0,zdcount-1 do
callback:setDB(2,z)
-- 核心1:替换为自定义宗地号(宗地一/二),保留原逻辑可注释回滚
-- local zdID = tostring(callback:getString(1,"qhdm"))..tostring(callback:getString(1,"south|1"))
local zdID = "宗地"..num_to_chinese(zd_serial_num)
local cursheet = st.ExcelSheet()
if excel:copySheet(1,tostring(zdID),cursheet) then
-- 写入自定义宗地号
cursheet:setCellValueText(3,1,tostring(" 宗地号:")..tostring(zdID))
-- 核心2:读取正确的权利人(south|2),替换为"项目名称:"显示
local qlr_name = callback:getString(1,"south|2") -- 原始正确的权利人读取逻辑
if qlr_name == nil or qlr_name == "" then
cursheet:setCellValueText(4,1,tostring(" 项目名称:")) -- 空值留空
else
cursheet:setCellValueText(4,1,tostring(" 项目名称:")..tostring(qlr_name)) -- 填充权利人
end
-- 保留原始面积读取逻辑(#area和#blarea是内置字段)
cursheet:setCellValueText(5,1,tostring(" 宗地面积(平方米): ")..tostring(callback:getString(1,"#area")))
cursheet:setCellValueText(6,1,tostring(" 建筑占地(平方米): ")..tostring(callback:getString(1,"#blarea")))
if cursheet ~= nil then
local jzdcount = callback:getInt(4,"jzdcount")
-- 分页计算(使用自定义的onepagenum参数)
local d_pagenum = jzdcount/ (onepagenum-1)
local pagenum = getIntPart(d_pagenum)
if (d_pagenum - pagenum) > 0 then
pagenum = pagenum + 1
end
-- 复制分页行(使用自定义的row_offset参数)
for i = 1, pagenum -1, 1 do
cursheet:copyRows(1, row_offset, row_offset * i)
end
-- 写入页码
for i = 1, pagenum , 1 do
cursheet:setCellValueText((i-1)* row_offset + 2, 5, "共 "..pagenum.." 页")
cursheet:setCellValueText( (i-1)* row_offset + 1, 5, "第 "..(i).." 页")
end
-- 填充界址点数据(保留原始正确逻辑)
local lastpos = nil
for j = 1, jzdcount+pagenum, 1 do
local pageindex = getIntPart((j-1) / (onepagenum))
local index = j - pageindex
local jzdrow = pageindex * 11 + 8 + 2 * j
local jzxrow = pageindex * 11 + 7 + 2 * j
if (j == (jzdcount+pagenum)) then
callback:setDB(1, 2)
index = 1
elseif (1 == j) then
callback:setDB(1, 2)
jzdrow = 10
jzxrow = 10
else
callback:setDB(1, 1 + index)
end
cursheet:setCellValueText(jzdrow, 1, tostring(index))
-- 界址点号生成逻辑(保留原始正确逻辑)
if dj_jzdorder==0 then
prefix = tostring(callback:getString(1, "south|1"))--界址点前缀
jzdindex=tostring(callback:getString(1,"south|2"))
cursheet:setCellValueText(jzdrow, 2, prefix..jzdindex)
else
prefix=tostring(callback:getString(1,"#dj_prefix"))
cursheet:setCellValueText(jzdrow, 2, prefix..(index))
end
-- 坐标/距离填充(使用自定义小数位参数)
local currentpos, isok = callback:getDoubleList(1, "#xyz")
-- 优先使用自定义参数,兼容原始逻辑
local use_coorddot = dj_coorddot
local use_distdot = dj_distdot
-- 若未设置自定义参数,读取CASS内置配置
if use_coorddot == nil then use_coorddot = callback:getDouble(1,"#dj_coorddot") end
if use_distdot == nil then use_distdot = callback:getDouble(1,"#dj_distdot") end
str_coorddot = string.format("%%.%df", use_coorddot)
str_distdot = string.format("%%.%df", use_distdot)
cursheet:setCellValueText(jzdrow, 4, string.format(str_coorddot, currentpos:at(0)))
cursheet:setCellValueText(jzdrow, 3, string.format(str_coorddot, currentpos:at(1)))
-- 距离填充
if 1 ~= j then
cursheet:setCellValueText(jzxrow, 5, string.format(str_distdot, dist(currentpos:at(0), currentpos:at(1), lastpos:at(0), lastpos:at(1))))
end
lastpos = currentpos
-- 分页最后一个点处理(保留原始正确逻辑)
local d_nextpageindex = (j) / (onepagenum)
local nextpageindex = getIntPart(d_nextpageindex)
if (d_nextpageindex - nextpageindex) < 0.01 and 1~= j then
callback:setDB(1, 1+index)
cursheet:setCellValueText(jzdrow, 1, tostring(index))
if dj_jzdorder==0 then
prefix = tostring(callback:getString(1, "south|1"))
jzdindex=tostring(callback:getString(1,"south|2"))
cursheet:setCellValueText(jzdrow, 2, prefix..jzdindex)
else
prefix=tostring(callback:getString(1,"#dj_prefix"))
cursheet:setCellValueText(jzdrow, 2, prefix..(index))
end
local currentpos, isok = callback:getDoubleList(1, "#xyz")
cursheet:setCellValueText(jzdrow, 4, string.format(str_coorddot, currentpos:at(0)))
cursheet:setCellValueText(jzdrow, 3, string.format(str_coorddot, currentpos:at(1)))
if 0 ~= j then
cursheet:setCellValueText(jzxrow+2, 5, " ")
end
end
end
end
end
-- 每处理完一个宗地,计数器+1(实现宗地一→宗地二)
zd_serial_num = zd_serial_num + 1
end
-- 替换制表人、审核人、日期(保留原始逻辑)
excel:replaceText("{1@dj_cgbzhibiao}",tostring(callback:getString(3,"ztz")))
excel:replaceText("{1@dj_cgbshenhe}",tostring(callback:getString(3,"shz")))
excel:replaceText("{3@RQ}",tostring(callback:getString(3,"rq")))
excel:removeSheet(1)--删除模板表
下面是AI对代码的解释
我用最简洁的语言,只讲这份最终版Lua代码的核心重点,不用复杂术语,让你一眼看懂关键逻辑和定制化改动:
一、代码核心作用
这是CASS生成「界址点成果表(Excel)」的核心脚本,核心是:读取CASS里的宗地/界址点数据,按规则填充到Excel模板,生成最终成果表。
二、核心定制化改动(重点中的重点)
| 改动点 | 作用/逻辑 |
|---|---|
| 1. 宗地编号改为“宗地一/二” | 新增计数器 zd_serial_num,从1开始,每处理一块地+1,配合 num_to_chinese函数转成“一/二”,替代原真实宗地号 |
| 2. 项目名称=权利人 | 读取CASS里宗地的`south |
| 3. 参数集中可自定义 | 顶部的 onepagenum(每页显示35个界址点)、dj_coorddot(坐标保留3位小数)等,改数值就能调整规则,不用翻代码 |
三、核心数据读取逻辑(CASS内置字段)
| 读取的字段/函数 | 取的是什么数据 |
|---|---|
south|2 |
宗地的权利人(核心,用来填项目名称) |
#area/#blarea |
宗地面积、建筑占地面积(自动填充到成果表) |
#xyz |
界址点的X/Y坐标(计算后显示,保留指定小数位) |
dist(X1,Y1,X2,Y2) |
两个界址点之间的距离(界址边长) |
四、核心执行流程
- 加载CASS的报表工具库 → 准备操作Excel;
- 读取要处理的宗地总数 → 逐个处理每一块地:
- 生成“宗地一/二”编号 → 写入Excel;
- 读取权利人 → 显示为“项目名称:XXX” → 写入Excel;
- 读取面积 → 写入Excel;
- 计算界址点要分几页 → 生成多页Excel;
- 逐个读取界址点坐标/边长 → 填充到Excel对应位置;
- 替换制表人/审核人/日期 → 删除模板表 → 生成最终成果表。
五、关键注意点
- 若想改回“真实宗地号”:取消注释原
zdID那行,注释“宗地一/二”那行即可; - 若想改“每页点数/小数位”:直接改顶部
onepagenum/dj_coorddot的数值; - 若权利人没显示:检查CASS里宗地属性是否填了“权利人”(
south|2字段)。
总结
核心就3件事:
- 宗地号自动编为“一/二”;
- 项目名称用的是CASS里的权利人;
- 每页点数、小数位等规则在顶部直接改,不用动核心逻辑。
其他代码都是CASS默认的分页、填坐标、算边长等基础逻辑,不用改,也不影响定制功能。