报表知识库
我要提问

润乾报表中如何动态的打开不同的XML数据集

在润乾报表中支持多种数据集类型,包括:SQL检索、存储过程、复杂SQL、TXT文件、XML数据集、自定义数据集等。

在自定义数据集的实际应用中,我们遇到这样一个问题:

客户的XML数据文件有很多,想通过设置一个XML数据集然后跟不同的情况打开不同的XML文件。从业务需求上分析,也就是通过动态读取不同XML文件中的数据,然后把数据返回给数据集的过程。

我们分析一下实现的过程是:

用自定义数据集,传入参数为xml文件路径。这样可以通过参数决定从哪个XML文件中读取数据。

下面是实现的demo源代码,其中PraseXML.java是用来解析XML文件,并得到XML的docment,XMLDataSetTest.java是自定义数据集。

PraseXML.java:

import java.io.FileInputStream;
import java.io.InputStream;

import org.jdom.Document;
import org.jdom.input.SAXBuilder;

public class PraseXML {

/**
* 解析XML文件,并得到XML的docment
* @param name 文件名称
* @return
*/
public Document getDoc(String name){
try{
SAXBuilder sb = new SAXBuilder();//使用默认的jdom解析器
Document doc = sb.build(new FileInputStream(name)); //解析XML文件,并得到XML的docment
return doc;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
}

XMLDataSetTest.java:

import java.util.List;
import java.util.Vector;

import org.jdom.Document;
import org.jdom.Element;

import com.runqian.report4.dataset.DataSet;
import com.runqian.report4.dataset.IDataSetFactory;
import com.runqian.report4.dataset.Row;
import com.runqian.report4.usermodel.Context;
import com.runqian.report4.usermodel.DataSetConfig;

public class XMLDataSetTest implements IDataSetFactory {

public DataSet createDataSet(Context context, DataSetConfig arg1,
boolean arg2) {
Document doc = null;
String filename = (String) context.getParamValue(”fileName”);
//String filename = “c:/b.xml”;
// 调用PraseXML().getDoc()把XML文件解析成Document,以便处理
doc = new PraseXML().getDoc(filename);
DataSet ds = new DataSet(”ds1″);
// 取得XML文件的根
Element root = doc.getRootElement();// root
List list = root.getChildren();// list coll_jj
// 对根目录下的每个子节点循环

for (int i = 0; i < list.size(); i++) {
// System.err.println(”i>>>>>>>>>>”+i);
// 得到根目录的下一级子节点
Element e = (Element) list.get(i);// 二级
if (”COLL_JJ”.equals(e.getName())) {
List child = e.getChildren();
int m = 0;
for (int j = 0; j < child.size(); j++) {
System.err.println(”j>>>>>>>>>>” + j);
Row row = null;
Element e2 = (Element) child.get(j);// 三级
List uvo = e2.getChildren();
Vector vrow = new Vector();

for (int n = 1; n <= uvo.size(); n++) {
Element e3 = (Element) uvo.get(n – 1);// 四级
if (j == 0) {
ds.addCol(e3.getName());
}
vrow.add(e3.getText());
System.out.println(e3.getText());
}
row = ds.addRow();
if (!vrow.isEmpty()) {
for (int k = 0; k < vrow.size(); k++) {
ds.setData(m + 1, k + 1, vrow.get(k));

}
m++;

}
//
}

}

}
System.out.println(ds.getData(1, 1));
System.out.println(ds.getData(2, 1));
return ds;
}

/**
* 转换列数据值类型
*
* @param value
* 列原值
* @param type
* 列数据类型
* @return Object
*/
public static Object getColValue(String value, String type) {
if (value == null || value.trim().length() == 0) {
return null;
}
if (type.equals(”int”)) {
return Integer.valueOf(value);
} else if (type.equals(”date”)) {
return java.sql.Date.valueOf(value);
} else if (type.equals(”double”)) {
return Double.valueOf(value);
} else {
return value;
}

}

public static void main(String args[]) {

XMLDataSetTest ts = new XMLDataSetTest();
Context cont = new Context();
DataSetConfig ds = null;
boolean arg2 = false;
ts.createDataSet(cont, ds, arg2);

}
}

然后把这两个文件编译成.class后,在报表文件中使用:

1.gif

然后在数据集中写入自定义数据集的类:

2.gif

然后我们就可以通过传参数来动态的打开不同的XML数据集了。