FineReport帆软报表:使用JAVA批量更新报表里的数据集连接名
最近接到业务需求,需要在正式环境中对大批量的报表进行数据测试,由于数据需要连接到测试的数据库连接,所以需要一张一张改,手工的方式效率慢且耗时,就想起能否通过程序刷新,毕竟帆软底层也是JAVA。
1.首先需要了解到:帆软的CPT文件其实就是XML,可以用过XML解析的方式修改;
我们可以右键用文本打开,可以看到其中<DatabaseName>就是我们数据集使用的连接名;
2.现在我们要把saphana替换成106测试并保存下来;
那思路就很清晰了,写个JAVA,读取CPT文件,然后解析获取<DataBaseName>并遍历,然后修改成你想要的连接名。
3.JAVA代码如下
需要注意:
使用DOM(Document Object Model)API直接设置Element
的textContent
属性来包含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批量更新报表里的数据集连接名就完成了👏👏👏👏👏。