cass导出界址点成果表的模板可以改成我自己的吗


cass导出界址点成果表的模板可以改成我自己的吗

可以改成你自己的模板,CASS(尤其是10.0及以上版本)完全支持界址点成果表的自定义修改,包括表头、列、样式、每页行数、小数位等,通过自带的模板编辑工具即可操作。

一、核心修改入口(CASS 10.x/11.x)

  1. 打开CASS,进入菜单:地籍 → 启动模板编辑工具。 命令是 RUNSMARTTABLETOOL

  2. 在模板编辑器中点打开,选择安装目录下 report 文件夹里的界址点成果表模板(如 界址点成果表_excel.zip 或 Word 版)。

  1. 双击左侧模板名,会自动打开对应的 Excel/Word 模板文件,直接编辑样式、表头、列宽、字体、页边距等。

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

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

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

![](Pasted image 20260204090329.png)

  1. 如需调整每页界址点行数、分页规则、小数位数,编辑同目录下的 .lua 脚本文件,修改对应参数后保存。 (这个我还没测试)
  2. 先保存 Excel/Word,再在模板编辑器中点保存,退出后重新生成成果表即生效。

二、可自定义的内容

  • 表头、标题、单位、落款、日期等文字与格式 - 列的增减、顺序调整、列名修改(点号、X、Y、H、边长、界标类型等) - 坐标/面积小数位数、字体、颜色、对齐方式 - 每页显示行数、分页空行、纸张大小与方向 - 页眉页脚、水印、边框样式

三、关键注意事项

  • 备份原模板(复制整个 report 文件夹),避免改错无法恢复。
  • 动态字段(如 [ZD_ZDH] 宗地号、[JZD_DH] 界址点号)不要删除或乱改字段名,只改格式与位置,否则数据无法填充。
  • 复杂字段新增需先在 cassconfig.db 确认字段名,再在模板中按规范插入,避免导出空白或报错。
  • 旧版CASS(如 9.1及以下)部分模板为固定文件,修改有限,建议升级到10.x以上。

四、最简操作流程(Excel版)

  1. 备份 CASS安装目录\report
  2. 地籍→启动模板编辑工具→打开 界址点成果表_excel.zip
  3. 双击左侧模板名,打开Excel,改表头、列、样式后保存关闭。
  4. 如需改每页行数,编辑 .lua 里的分页参数。
  5. 模板编辑器内点保存,退出。
  6. 重新执行 地籍→生成界址点成果表,即可按新模板导出。 需要我按你的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) 两个界址点之间的距离(界址边长)

四、核心执行流程

  1. 加载CASS的报表工具库 → 准备操作Excel;
  2. 读取要处理的宗地总数 → 逐个处理每一块地:
    • 生成“宗地一/二”编号 → 写入Excel;
    • 读取权利人 → 显示为“项目名称:XXX” → 写入Excel;
    • 读取面积 → 写入Excel;
    • 计算界址点要分几页 → 生成多页Excel;
    • 逐个读取界址点坐标/边长 → 填充到Excel对应位置;
  3. 替换制表人/审核人/日期 → 删除模板表 → 生成最终成果表。

五、关键注意点

  1. 若想改回“真实宗地号”:取消注释原 zdID那行,注释“宗地一/二”那行即可;
  2. 若想改“每页点数/小数位”:直接改顶部 onepagenum/dj_coorddot的数值;
  3. 若权利人没显示:检查CASS里宗地属性是否填了“权利人”(south|2字段)。

总结

核心就3件事:

  1. 宗地号自动编为“一/二”;
  2. 项目名称用的是CASS里的权利人;
  3. 每页点数、小数位等规则在顶部直接改,不用动核心逻辑。

其他代码都是CASS默认的分页、填坐标、算边长等基础逻辑,不用改,也不影响定制功能。


文章作者: 摸鱼
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 摸鱼 !
  目录