目录
Jaspersoft Studio添加字体STSONG.TTF
Jaspersoft Studio-6.6.0用户指南-创建报表https://blog.csdn.net/steve_frank/article/details/88059014
Idea搭建spring boot环境https://blog.csdn.net/steve_frank/article/details/85650028
Jaspersoft Studio添加字体STSONG.TTF
设计出的报表不显示中文,需要导入字体。
点击window-Preferences-jaspersoft Studio-font-add
导出字体moses.jar
将moses.jar 安装到本地maven库
mvn install:install-file -Dfile=moses.jar -DgroupId=com.moses -DartifactId=myfont -Dversion=1.0.0 -Dpackaging=jar
pom.xml添加依赖
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.6.0</version>
</dependency>
<dependency>
<groupId>com.kevin</groupId>
<artifactId>myfont</artifactId>
<version>1.0.0</version>
</dependency>
添加ReportController
/*********************************************
*
* Copyright (C) 2019 IBM All rights reserved.
*
********* K*I*N*G ********** B*A*C*K *******/
package com.ibm.mosesboot.report.controller;
/**
* @author Moses *
* @Date 2019/1/2 23:34
*/
import com.ibm.mosesboot.report.util.JasperHelper;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
@Controller
public class ReportController {
@Resource
private DataSource dataSource;
/**
* 首页
*
* @return
*/
@RequestMapping("/report")
public String report() {
return "html/report";
}
/**
* 生成报表
*
* @param reportName 报表名称
* @param whereSql 查询条件
* @param inline 是否在线展示
* @param type 文件类型
* @param parameters 参数
* @param request
* @param response
* @throws SQLException
* @throws IOException
*/
@GetMapping("/{reportName}")
public void getReportByParam(
@PathVariable("reportName") final String reportName,
@RequestParam(required = false) String whereSql,
@RequestParam(required = false, defaultValue = "false") String inline,
@RequestParam(required = false, defaultValue = "pdf") String type,
@RequestParam(required = false) Map<String, Object> parameters,
HttpServletRequest request,
HttpServletResponse response) throws SQLException, IOException {
parameters = parameters == null ? new HashMap<>() : parameters;
ClassPathResource resource = new ClassPathResource("jaspers" + File.separator + reportName + ".jasper");
InputStream jasperStream = resource.getInputStream();
// parameters.put("whereSql", whereSql);
JasperHelper.export(type, reportName, jasperStream, inline, request, response, parameters, dataSource.getConnection());
}
}
添加JasperHelper
/*********************************************
*
* Copyright (C) 2018 IBM All rights reserved.
*
********* K*I*N*G ********** B*A*C*K *******/
package com.ibm.mosesboot.report.util;
import net.sf.jasperreports.engine.JRAbstractExporter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.base.JRBaseReport;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.export.JRRtfExporter;
import net.sf.jasperreports.engine.export.JRXmlExporter;
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
import net.sf.jasperreports.j2ee.servlets.ImageServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.sql.Connection;
import java.util.Map;
@SuppressWarnings("deprecation")
public class JasperHelper {
private static void prepareReport(JasperReport jasperReport, String docType) {
/*
* 如果导出的是excel,则需要去掉周围的margin
*/
if (DocType.XLS.name().equals(docType) || DocType.XLSX.name().equals(docType)) {
try {
Field margin = JRBaseReport.class
.getDeclaredField("leftMargin");
margin.setAccessible(true);
margin.setInt(jasperReport, 0);
margin = JRBaseReport.class.getDeclaredField("topMargin");
margin.setAccessible(true);
margin.setInt(jasperReport, 0);
margin = JRBaseReport.class.getDeclaredField("bottomMargin");
margin.setAccessible(true);
margin.setInt(jasperReport, 0);
Field pageHeight = JRBaseReport.class
.getDeclaredField("pageHeight");
pageHeight.setAccessible(true);
pageHeight.setInt(jasperReport, 2147483647);
} catch (Exception exception) {
}
}
}
@SuppressWarnings("rawtypes")
private static JRAbstractExporter getJRExporter(DocType docType) {
JRAbstractExporter exporter = null;
switch (docType) {
case PDF:
exporter = new JRPdfExporter();
break;
case DOC:
exporter = new JRDocxExporter();
break;
case DOCX:
exporter = new JRDocxExporter();
break;
case XLS:
exporter = new JRXlsxExporter();
break;
case XLSX:
exporter = new JRXlsxExporter();
break;
case XML:
exporter = new JRXmlExporter();
break;
case RTF:
exporter = new JRRtfExporter();
break;
}
return exporter;
}
/**
* 按照类型导出不同格式文件
*
* @param type 文件类型
* @param fileName 文件名称
* @param is jasper文件的来源
* @param request
* @param response
* @param parameters
* @param conn
*/
public static void export(String type, String fileName, InputStream is, String inline, HttpServletRequest
request, HttpServletResponse response, Map parameters, Connection conn) {
try {
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(is);
// prepareReport(jasperReport, type);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn);
// JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource());
request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
/*
* 设置头信息
*/
DocType docType = DocType.fromTypeName(type);
// request.setCharacterEncoding("utf-8");
// response.setCharacterEncoding("utf-8");
response.setContentType(docType.getTypeContent());
if ("true".equals(inline)) {
response.setHeader("Content-Disposition", "inline;");
} else {
response.setHeader("Content-Disposition", "attachment; filename=\""
+ URLEncoder.encode(fileName, "UTF-8") + docType.getTypeSuffix() + "\"");
}
// String fileName = new String(defaultname.getBytes("GBK"), "ISO8859_1");
final OutputStream outputStream = response.getOutputStream();
// ServletOutputStream outputStream = response.getOutputStream();
JRAbstractExporter exporter = getJRExporter(docType);
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStream));
exporter.exportReport();
outputStream.flush();
outputStream.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
添加DocType
/*********************************************
*
* Copyright (C) 2018 IBM All rights reserved.
*
********* K*I*N*G ********** B*A*C*K *******/
package com.ibm.mosesboot.report.util;
/**
* @author Moses *
* @Date 2019/3/11 17:59
*/
public enum DocType {
PDF("pdf", "application/pdf", ".pdf"),
HTML("html", "application/html", ".html"),
XLS("xls", "application/vnd.ms-excel", ".xls"),
XLSX("xlsx", "application/vnd.ms-excel", ".xlsx"),
DOC("doc", "application/msword;charset=utf-8", ".doc"),
DOCX("docx", "application/msword;charset=utf-8", ".docx"),
XML("xml", "application/pdf", ".xml"),
RTF("rtf", "application/pdf", ".rtf");
/**
* 类型名称
*/
private String typeName;
/**
* 类型内容
*/
private String typeContent;
/**
* 类型后缀
*/
private String typeSuffix;
DocType(String typeName) {
this.typeName = typeName;
}
DocType(String typeName, String typeContent, String typeSuffix) {
this.typeName = typeName;
this.typeContent = typeContent;
this.typeSuffix = typeSuffix;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getTypeContent() {
return typeContent;
}
public void setTypeContent(String typeContent) {
this.typeContent = typeContent;
}
public String getTypeSuffix() {
return typeSuffix;
}
public void setTypeSuffix(String typeSuffix) {
this.typeSuffix = typeSuffix;
}
/**
* 根据类型的名称,返回类型的枚举实例。
*
* @param typeName 类型名称
* @return
*/
public static DocType fromTypeName(String typeName) {
for (DocType docType : DocType.values()) {
if (docType.getTypeName().equals(typeName)) {
return docType;
}
}
return null;
}
}
完整结构如下:
访问crosstab
http://localhost:8889/crosstab?inline=true
访问汇总表
http://localhost:8889/product?whereSql=cost%3C15&inline=true