当前位置: 首页 > article >正文

FineReport帆软报表:使用JAVA批量更新报表里的数据集连接名

最近接到业务需求,需要在正式环境中对大批量的报表进行数据测试,由于数据需要连接到测试的数据库连接,所以需要一张一张改,手工的方式效率慢且耗时,就想起能否通过程序刷新,毕竟帆软底层也是JAVA。

1.首先需要了解到:帆软的CPT文件其实就是XML,可以用过XML解析的方式修改;

我们可以右键用文本打开,可以看到其中<DatabaseName>就是我们数据集使用的连接名;

2.现在我们要把saphana替换成106测试并保存下来;

那思路就很清晰了,写个JAVA,读取CPT文件,然后解析获取<DataBaseName>并遍历,然后修改成你想要的连接名。

3.JAVA代码如下

需要注意:

使用DOM(Document Object Model)API直接设置ElementtextContent属性来包含CDATA区块(如<![CDATA[106测试]]>)并不会按预期工作,因为textContent属性是用来处理纯文本内容的。当你尝试将CDATA区块作为字符串赋值给textContent时,特殊字符(如<>等)会被转义,以符合XML的文本内容规则。要在Java中修改XML元素以包含CDATA区块,你需要创建一个CDATASection节点,并将其作为子节点添加到相应的元素中。以下代码示例:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
import java.io.File;
import java.nio.file.*;

public class UpdateCPT {

    public static void main(String[] args) {
        try {
            String module = "SM";
            //获取工程目录newfile/SD
            Path directoryPath = Paths.get("oldfile/"+ module);
            //创建文件流,循环读取cpt文件
            DirectoryStream<Path> stream = Files.newDirectoryStream(directoryPath, "*.cpt");
            for (Path filePath : stream) {
                // 读取CPT文件
                File file = new File("oldfile/"+module+"/"+filePath.getFileName());
                //新建文件工厂
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document document = builder.parse(file);
                // 获取CPT文件中<DatabaseName>的列表
                NodeList nList = document.getElementsByTagName("DatabaseName");
                //遍历<DatabaseName>的列表
                for (int temp = 0; temp < nList.getLength(); temp++) {
                    //创建子节点
                    Node nNode = nList.item(temp);
                    // 创建一个CDATA区块并设置其内容为106测试
                    CDATASection newCdata = document.createCDATASection("106测试");
                    //如果ELEMENT_CODE=1,1就是里面的内容时element参数
                    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                        Element eElement = (Element) nNode;
                        // 清空内容
                        eElement.setTextContent("");
                        //将saphana作为CDATE区块放入<DatabaseName>中
                        nNode.appendChild(newCdata);
                    }
                }
                // 保存修改后的CPT
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();
                transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                DOMSource source = new DOMSource(document);
                StreamResult result = new StreamResult(new File("newfile/"+module+"/"+filePath.getFileName()));
                transformer.transform(source, result);
                System.out.println(filePath.getFileName()+":文件已修改完成!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上述代码是将工程文件里的oldfile文件里的CPT全部按要求修改。

至此使用JAVA批量更新报表里的数据集连接名就完成了👏👏👏👏👏。


http://www.kler.cn/a/282891.html

相关文章:

  • FBX福币交易所恒指收跌1.96% 半导体股继续回调
  • FPGA学习(10)-数码管
  • 企业一站式管理系统odoo的研究——PLM插件的搭建
  • 使用Element UI实现前端分页,及el-table表格跨页选择数据,切换分页保留分页数据,限制多选数量
  • 【数学二】线性代数-线性方程组-齐次线性方程组、非齐次线性方程组
  • C语言入门到精通(第六版)——第十六章
  • 【python量化分析专题】最新整理的已经实测可用的各类免费股票数据接口之实时交易数据
  • 『大模型笔记』林纳斯·托瓦兹(Linux之父):谈论热议与人工智能的未来!
  • Linux 网络技术栈,看这篇就够了!!
  • 【ACM独立出版 | 厦大主办】第五届计算机科学与管理科技国际学术会议(ICCSMT 2024,10月18-20)
  • 基于web 在线影院系统网站设计与实现
  • 交通流量监测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
  • Qt 调用执行 Python 函数
  • zookeeper服务器动态上下线监听案例
  • 【MySQL数据库管理问答题】第4章 配置 MySQL
  • SpringBoot应用打成ZIP部署包
  • 18.神经网络 - 非线性激活
  • 【机器学习】梯度下降算法
  • 源码编译并安装Squid的方法
  • BEVDet4D:多帧时序信息融合方法详解
  • 富格林:正规方式顺利盈利出金
  • 性能测试的基本概念
  • Pycharm安装报错:Cannot detect a launch configuration 解决办法
  • 吴恩达机器学习笔记 四十五 基于内容的过滤的tensorFlow实现
  • 怎么解决 hash 碰撞,用 C++ 实现 hashMap?
  • Nosql数据库redis集群配置详解