最近有个客户需要报表实现动态列,我选择的报表工具是Ireport,经过一些资料的研究,基本上实现了动态列,下面是我写的测试代码,还有些需要完善,跟大家分享一下:
写道
public class RptDesign4SD {
public static JasperDesign getJasperDesign(String file)
{
JasperDesign design = null;
try {
design = JRXmlLoader.load(file);
//JRField[] fieldList = design.getFields();
JRElement[] elementList = design.getColumnHeader().getElements();
List<JRElement> arr = new ArrayList<JRElement>();
//不显示密码列
//int index = 0;
for(JRElement element : elementList)
{
String key = element.getKey();
System.out.println(key);
if("static_pwd".equals(key) || "staticText-static".equals(key))
{
continue;
}
arr.add(element);
}
JRDesignBand band = new JRDesignBand();
band.setHeight(30);
int currentX = 0;
for(JRElement element : arr)
{
element.setX(currentX);
currentX += element.getWidth();
band.addElement((JRDesignStaticText)element);
}
design.setColumnHeader(band);
band = new JRDesignBand();
band.setHeight(18);
JRElement[] elementDetailList = design.getDetail().getElements();
arr = new ArrayList<JRElement>();
currentX = 0;
for(JRElement field : elementDetailList)
{
String key = field.getKey();
if("textField_pwd".equals(key) || "textField_status".equals(key))
{
continue;
}
arr.add(field);
}
for(JRElement element : arr)
{
element.setX(currentX);
currentX += element.getWidth();
band.addElement((JRDesignTextField)element);
}
design.setDetail(band);
} catch (JRException e) {
e.printStackTrace();
}
return design;
}
public static void main(String[] args)
{
JasperDesign design = RptDesign4SD.getJasperDesign("E:\\testAutoColumn.jrxml");
try {
//JasperCompileManager.compileReportToFile(design, "E:\\achui.jrxml");
net.sf.jasperreports.engine.xml.JRXmlWriter.writeReport((JRReport)design, "E:\\achui.jrxml", "UTF-8");
} catch (JRException e) {
e.printStackTrace();
}
}
public static JasperDesign getJasperDesign(String file)
{
JasperDesign design = null;
try {
design = JRXmlLoader.load(file);
//JRField[] fieldList = design.getFields();
JRElement[] elementList = design.getColumnHeader().getElements();
List<JRElement> arr = new ArrayList<JRElement>();
//不显示密码列
//int index = 0;
for(JRElement element : elementList)
{
String key = element.getKey();
System.out.println(key);
if("static_pwd".equals(key) || "staticText-static".equals(key))
{
continue;
}
arr.add(element);
}
JRDesignBand band = new JRDesignBand();
band.setHeight(30);
int currentX = 0;
for(JRElement element : arr)
{
element.setX(currentX);
currentX += element.getWidth();
band.addElement((JRDesignStaticText)element);
}
design.setColumnHeader(band);
band = new JRDesignBand();
band.setHeight(18);
JRElement[] elementDetailList = design.getDetail().getElements();
arr = new ArrayList<JRElement>();
currentX = 0;
for(JRElement field : elementDetailList)
{
String key = field.getKey();
if("textField_pwd".equals(key) || "textField_status".equals(key))
{
continue;
}
arr.add(field);
}
for(JRElement element : arr)
{
element.setX(currentX);
currentX += element.getWidth();
band.addElement((JRDesignTextField)element);
}
design.setDetail(band);
} catch (JRException e) {
e.printStackTrace();
}
return design;
}
public static void main(String[] args)
{
JasperDesign design = RptDesign4SD.getJasperDesign("E:\\testAutoColumn.jrxml");
try {
//JasperCompileManager.compileReportToFile(design, "E:\\achui.jrxml");
net.sf.jasperreports.engine.xml.JRXmlWriter.writeReport((JRReport)design, "E:\\achui.jrxml", "UTF-8");
} catch (JRException e) {
e.printStackTrace();
}
}
主要思路是:做好的模版(这个模版包含了所有列)读取出来,然后动态的修改相应区域的表头信息,把需要显示的表头去掉,在将后面的表头迁移,最后再重新生成jrxml文件,从而实现动态表头