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批量更新报表里的数据集连接名就完成了👏👏👏👏👏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mors.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值