ホームページ Java &#&チュートリアル Java の jasperReport によって実装された動的列印刷の例

Java の jasperReport によって実装された動的列印刷の例

Sep 18, 2017 am 09:41 AM
java 印刷する

この記事では、動的列印刷を実装するための Java での jasperReport の実装コードに関する関連情報を主に紹介します。この記事を通じて、この部分の内容をマスターできることを願っています。

実装コード。 Java で jasperReport を使用して動的列印刷を実装します

次のコードのコメントが非常にわかりやすいので、ぜひ参考にしてください。

サンプルコード:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

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<Object[]> projectList = getEntityManager().queryPrintProjectInfo(printValue);

  

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

  List<Map> reportDataList = new ArrayList<Map>();

  

  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<Object[]> pageCountList = new ArrayList<Object[]>();

   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;

 }

ログイン後にコピー


1

2

3

4

5

6

7

8

9

10

11

12

13

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);

  }

  

 }

ログイン後にコピー


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

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();

 }

ログイン後にコピー

以上がJava の jasperReport によって実装された動的列印刷の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

Javaの平方根

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Javaの完全数

Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

Java の乱数ジェネレーター

Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

Javaのアームストロング数

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

ジャワのウェカ

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

Java Springのインタビューの質問

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8 Stream Foreachから休憩または戻ってきますか?

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Javaのスミス番号

See all articles