spring boot2.1集成Jaspersoft Studio-6.6.0报表

目录

Jaspersoft Studio添加字体STSONG.TTF

导出字体moses.jar

将moses.jar 安装到本地maven库

pom.xml添加依赖

添加ReportController

添加JasperHelper

添加DocType

访问crosstab

访问汇总表


 

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

代码地址:https://github.com/glory2018/moses-boot-jasper.git

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值