java 打印换列_Java中jasperReport实现动态列打印的实例

这篇文章主要介绍了Java 中jasperReport实现动态列打印的实现代码的相关资料,希望通过本文大家能掌握这部分内容,需要的朋友可以参考下

Java 中jasperReport实现动态列打印的实现代码

以下代码中注释说明很清楚,希望能帮助到大家,大家参考下。

示例代码:

public ActionResult projectPrint() {

String[] printValue = null;

// 从页面中获得要查询的字段

String reqPrintValue = getRequest().getParameter("printValue");

// 没有选择则默认全打印

if (null == reqPrintValue || StringUtils.isEmpty(reqPrintValue)) {

printValue = new String[] { "pnumber", "pname", "pdepart", "pdecision", "pthrow", "plastmonth", "pfund", "ploan" };

} else {

printValue = reqPrintValue.split(",");

}

// 查询统计数据

List projectList = getEntityManager().queryPrintProjectInfo(printValue);

// 将数据转换为Map对象,换化成Map对象

List reportDataList = new ArrayList();

for (int i = 0; i < projectList.size(); i++) {

Object[] personStr = projectList.get(i);

Map reportData = new HashMap();

for (int j = 0; j < personStr.length; j++) {

reportData.put("field_" + j, String.valueOf(personStr[j]));

}

reportDataList.add(reportData);

}

int columCount = 0;// 数据列

int fieldCount = 0;// 字段列数(因为pname比较长所以想让pname比其它的列长些,故设计这个变量)

int pnameCount = -1;// 记录下pname的序号

for (int i = 0; i < printValue.length; i++) {

// pthrow下面有两列

if ("pthrow".equals(printValue[i])) {

columCount = columCount + 2;

fieldCount = fieldCount + 2;

// ploan下面也有两列

} else if ("ploan".equals(printValue[i])) {

columCount = columCount + 2;

fieldCount = fieldCount + 2;

// 故意让pname也占两列

} else if ("pname".equals(printValue[i])) {

pnameCount = i;// 记录下pname的序号

columCount = columCount + 1;

fieldCount = fieldCount + 2;

} else {

// 其它的列都占一个单位

columCount = columCount + 1;

fieldCount = fieldCount + 1;

}

}

InputStream is = null;

try {

// 从资源文件中读取报表

is = this.getClass().getResourceAsStream("/reports/project.jrxml");

JasperDesign jasperDesign = (JasperDesign) JRXmlLoader.load(is);

Map styleMap = jasperDesign.getStylesMap();

// column header 对应的样式

JRDesignStyle theaderStyle = (JRDesignStyle) styleMap.get("theader");

// column detail 对应的样式

JRDesignStyle tbodyStyle = (JRDesignStyle) styleMap.get("tboby");

// pagefoot 对应的样式

JRDesignStyle tfootStyle = (JRDesignStyle) styleMap.get("tfoot");

int _START_X_ = 20;// x轴的起始位置

int startX = _START_X_; // x轴的起始位置

// 单列的宽度

// 535是jasepreReport报表column最大的宽度

int columnWidth = 535 / fieldCount;

// 20,24,15是报表中已设置的,一定与之相同

final int columnHeadBandHeight = 20;

final int detailHeight = 24;

final int pagefootHeight = 15;

// 设置报表字段

for (int idx = 0; idx < columCount; idx++) {

JRDesignField field = new JRDesignField();

field.setName("field_" + idx);

field.setValueClass(java.lang.String.class);

jasperDesign.addField(field);

}

JRDesignBand columnHeadBand = (JRDesignBand) jasperDesign.getColumnHeader();

// 绘制表头

for (int idx = 0; idx < printValue.length; idx++) {

if ("pnumber".equals(printValue[idx])) {

JRDesignStaticText staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

staticText.setWidth(columnWidth);

staticText.setY(0);

staticText.setX(startX);

staticText.setHeight(2 * columnHeadBandHeight);

staticText.setText("序号");

columnHeadBand.addElement(staticText);

startX += columnWidth;

} else if ("pname".equals(printValue[idx])) {

JRDesignStaticText staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

// 项目名称的宽度是其它的宽度的2倍

staticText.setWidth(columnWidth * 2);

staticText.setY(0);

staticText.setX(startX);

staticText.setHeight(2 * columnHeadBandHeight);

staticText.setText("项目名称");

columnHeadBand.addElement(staticText);

startX += columnWidth * 2;

} else if ("pdepart".equals(printValue[idx])) {

JRDesignStaticText staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

staticText.setWidth(columnWidth);

staticText.setY(0);

staticText.setX(startX);

staticText.setHeight(2 * columnHeadBandHeight);

staticText.setText("部门");

columnHeadBand.addElement(staticText);

startX += columnWidth;

} else if ("pdecision".equals(printValue[idx])) {

JRDesignStaticText staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

staticText.setWidth(columnWidth);

staticText.setY(0);

staticText.setX(startX);

staticText.setHeight(2 * columnHeadBandHeight);

staticText.setText("已决策");

columnHeadBand.addElement(staticText);

startX += columnWidth;

} else if ("pthrow".equals(printValue[idx])) {

// 投审会下面有两列

JRDesignStaticText staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

staticText.setWidth(columnWidth * 2);

staticText.setY(0);

staticText.setX(startX);

staticText.setHeight(columnHeadBandHeight);

staticText.setText("投审会");

columnHeadBand.addElement(staticText);

staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

columnHeadBand.addElement(staticText);

staticText.setWidth(columnWidth);

staticText.setY(columnHeadBandHeight);

staticText.setX(startX);

staticText.setHeight(columnHeadBandHeight);

staticText.setText("12月初");

staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

columnHeadBand.addElement(staticText);

staticText.setWidth(columnWidth);

staticText.setY(columnHeadBandHeight);

staticText.setX(startX + columnWidth);

staticText.setHeight(columnHeadBandHeight);

staticText.setText("12月中");

columnHeadBand.addElement(staticText);

startX += 2 * columnWidth;

} else if ("plastmonth".equals(printValue[idx])) {

// 投决会下面有一列

JRDesignStaticText staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

staticText.setWidth(columnWidth);

staticText.setY(0);

staticText.setX(startX);

staticText.setHeight(columnHeadBandHeight);

staticText.setText("投决会");

columnHeadBand.addElement(staticText);

staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

columnHeadBand.addElement(staticText);

staticText.setWidth(columnWidth);

staticText.setY(columnHeadBandHeight);

staticText.setX(startX);

staticText.setHeight(columnHeadBandHeight);

staticText.setText("12月下");

columnHeadBand.addElement(staticText);

startX += columnWidth;

} else if ("pfund".equals(printValue[idx])) {

JRDesignStaticText staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

staticText.setWidth(columnWidth);

staticText.setY(0);

staticText.setX(startX);

staticText.setHeight(2 * columnHeadBandHeight);

staticText.setText("基金投资额");

columnHeadBand.addElement(staticText);

startX += columnWidth;

} else if ("ploan".equals(printValue[idx])) {

// 投贷协同额下面有两列

JRDesignStaticText staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

staticText.setWidth(columnWidth * 2);

staticText.setY(0);

staticText.setX(startX);

staticText.setHeight(columnHeadBandHeight);

staticText.setText("投贷协同额");

columnHeadBand.addElement(staticText);

staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

columnHeadBand.addElement(staticText);

staticText.setWidth(columnWidth);

staticText.setY(columnHeadBandHeight);

staticText.setX(startX);

staticText.setHeight(columnHeadBandHeight);

staticText.setText("金额");

staticText = new JRDesignStaticText();

staticText.setStyle(theaderStyle);

columnHeadBand.addElement(staticText);

staticText.setWidth(columnWidth);

staticText.setY(columnHeadBandHeight);

staticText.setX(startX + columnWidth);

staticText.setHeight(columnHeadBandHeight);

staticText.setText("入库情况");

columnHeadBand.addElement(staticText);

startX += 2 * columnWidth;

}

}

// 绘制Detail部门

startX = _START_X_;

JRDesignBand columnDetailBand = (JRDesignBand) jasperDesign.getDetail();

for (int idx = 0; idx < columCount; idx++) {

JRDesignTextField textField = new JRDesignTextField();

textField.setStretchWithOverflow(true);

textField.setX(startX);

textField.setY(0);

if (pnameCount == idx) {

textField.setWidth(2 * columnWidth);

startX += 2 * columnWidth;

} else {

textField.setWidth(columnWidth);

startX += columnWidth;

}

textField.setHeight(detailHeight);

textField.setPositionType(JRElement.POSITION_TYPE_FLOAT);

textField.setStyle(tbodyStyle);

textField.setBlankWhenNull(true);

JRDesignExpression expression = new JRDesignExpression();

expression.setValueClass(java.lang.String.class);

expression.setText("$F{field_" + idx + "}");

textField.setExpression(expression);

columnDetailBand.addElement(textField);

}

JRDesignBand pageFootBand = (JRDesignBand) jasperDesign.getPageFooter();

// 合计数据,本应统计的

List pageCountList = new ArrayList();

Object[] obj = new String[] { "合计", "15299", "", "", "67121", "92420", "155877", };

pageCountList.add(obj);

obj = new String[] { "", "", "", "XXX小计", "", "24473", "16470", };

pageCountList.add(obj);

obj = new String[] { "", "", "", "WWW小计", "", "7289", "1674", };

pageCountList.add(obj);

obj = new String[] { "", "", "", "ZZZ小计", "", "32700", "13000", };

pageCountList.add(obj);

obj = new String[] { "", "", "", "YYY小计", "", "12733", "120733", };

pageCountList.add(obj);

obj = new String[] { "", "", "", "AAA小计", "", "2225", "120733", };

pageCountList.add(obj);

obj = new String[] { "", "", "", "BBB小计", "", "3000", "0", };

pageCountList.add(obj);

int footWidth = 535 / 7;

for (int p = 0; p < pageCountList.size(); p++) {

for (int k = 0; k < 7; k++) {

Object[] ob = pageCountList.get(p);

JRDesignStaticText staticText = new JRDesignStaticText();

staticText.setStyle(tfootStyle);

staticText.setWidth(footWidth);

staticText.setY(pagefootHeight * p);

staticText.setX(k * footWidth + _START_X_);

staticText.setHeight(pagefootHeight);

staticText.setText(String.valueOf(ob[k]));

pageFootBand.addElement(staticText);

}

}

// 编译报表

JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

String type = this.getRequest().getParameter("type");//pdf格式

JasperUtils.prepareReport(jasperReport, type);

// 报表数据源

JRDataSource dataSource = new JRBeanCollectionDataSource(reportDataList);

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, dataSource);

HttpServletResponse response = this.getResponse();

JasperUtils.export(jasperPrint, response, getRequest(), type);

} catch (Exception e) {

e.printStackTrace();

}

return null;

}

public static void export(JasperPrint jasperPrint, HttpServletResponse response, HttpServletRequest request,

String type) throws IOException {

if (EXCEL_TYPE.equals(type)) {

exportExcel(jasperPrint, response, request);

} else if (PDF_TYPE.equals(type)) {

exportPDF(jasperPrint, response, request);

} else if (HTML_TYPE.equals(type)) {

exportHTML(jasperPrint, response, request);

} else {

exportPrint(jasperPrint, response, request);

}

}

public static void exportExcel(JasperPrint jasperPrint, HttpServletResponse response, HttpServletRequest request)

throws IOException {

response.setContentType("application/vnd.ms-excel");

String filename = DownloadHelper.encodeFilename("未命名.xls", request);

response.setHeader("Content-disposition", "attachment;filename=" + filename);

ServletOutputStream ouputStream = response.getOutputStream();

JRXlsExporter exporter = new JRXlsExporter();

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);

exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);

exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);

exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);

try {

exporter.exportReport();

} catch (JRException e) {

e.printStackTrace();

}

ouputStream.flush();

ouputStream.close();

}

public static void exportPDF(JasperPrint jasperPrint, HttpServletResponse response, HttpServletRequest request)

throws IOException {

response.setContentType("application/pdf");

String filename = DownloadHelper.encodeFilename("未命名.pdf", request);

response.setHeader("Content-disposition", "attachment;filename=" + filename);

ServletOutputStream ouputStream = response.getOutputStream();

try {

JasperExportManager.exportReportToPdfStream(jasperPrint, ouputStream);

} catch (JRException e) {

e.printStackTrace();

}

ouputStream.flush();

ouputStream.close();

}

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
评论

打赏作者

Youlink L

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值