Разработка отчета Jasperreport

задняя часть база данных открытый источник Excel

Большинство веб-проектов будут иметь модуль разработки отчетов.Для клиентов они могут интуитивно понять создание и использование различных данных.Система малых кредитов, с которой я недавно связывался, также имеет модуль печати отчетов, и я также участвовал в разработке отчетов.Это впервые столкнулся с разработкой отчета.Эта статья-резюме завершения!

Инструментом, используемым автором для разработки отчетов, является ireport.iReport - это проект с открытым исходным кодом, который может создавать сложные отчеты.Он написан на чистой Java и имеет очень богатый графический интерфейс.Он может вызывать библиотеку JasperReports и применять ее к любому java Приложение JasperReports поддерживает форматы вывода файлов PDF, HTML, XLS, CSV и XML, которые обычно используются в инструментах отчетности с открытым исходным кодом.

Здесь я использую веб-проект, чтобы продемонстрировать, как распечатать отчет, включая PDF, формат Excel.

Подготовка инструмента

  • myeclipse
  • база данных
  • ireport5.6

Создайте новый веб-проект, структура каталогов и необходимые пакеты jar выглядят следующим образом.

项目结构

所需 jar 包

Это зависит от ситуации.Если вам нужно распечатать только pdf, вы можете удалить некоторые пакеты jar.Здесь я распечатал их в различных форматах, таких как excel, html, ttf и т. д., поэтому добавьте их все. Кроме того, версия должны соответствовать: я использую ireport5.6, jasperreports-5.6.0.jar, jasper-compiler-jdt-5.5.15.jar, iText-2.1.7.js2.jar также должен быть более высокой версии, иначе он будет сообщать ошибка, нулевой указатель и тому подобное.

Нарисуйте отчет и сохраните его по пути webroot/report/jrxml.

Работа с отчетом очень проста. Пока вы перетаскиваете и устанавливаете различные элементы управления, вы можете быстро получить нужный отчет, и вы можете получать различные диаграммы посредством ввода данных. Работа и использование инструмента ireport не будут описаны. подробно здесь.Интерфейс отчета выглядит следующим образом:

画报表

Установите путь компиляции отчета и сохраните его по пути webroot/report/jasper.

设置报表编译路径

Перейти со страницы на сервлет

Для простоты я написал две гиперссылки на странице index.jsp для печати отчета в формате PDF и EXCEL следующим образом:

 <body>
    <a href="TestReport?type=pdf">PDF导出</a>
    <br/>
    <a href="TestReport?type=excel">excel导出</a>
 </body>

Соединение с базой данных JDBC (перечислите здесь коды ключей)

Подключиться к базе данных

public static Connection getConnection() {
	Connection connection = null;
	try {
		Class.forName("com.mysql.jdbc.Driver");
		connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/loans", "root", "root");
	} catch (Exception e) {
		 e.printStackTrace();
	}
	return connection;
}

Запрос данных таблицы базы данных

public static List selectAll(String sql){
    ResultSet rs = null;
    Statement statement = null;
    Connection conn = null;
    List dataList = new ArrayList();
    try {
        conn = getConnection();
        statement = conn.createStatement();
        rs = statement.executeQuery(sql);
        MakeLoanDetail makeLoanDetail = null;
        while (rs.next()){
            makeLoanDetail = new MakeLoanDetail();
            //把值 set 到 javabean 对象
            makeLoanDetail.setCustName(rs.getString(1));
            makeLoanDetail.setCustIdNo(rs.getString(2));
            makeLoanDetail.setBrdName(rs.getString(3));
            makeLoanDetail.setApprAmt(rs.getDouble(4));
            makeLoanDetail.setApprTerm(rs.getInt(5));
            makeLoanDetail.setActvSysDt(rs.getDate(6));
            makeLoanDetail.setActvUserId(rs.getString(7));
            //最后把对象添加到 list 集合中去,dataList 将最终传到报表中去
            dataList.add(makeLoanDetail);
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally {
       //这里关闭 rs,statement,conn 资源
    }
    return dataList;
}

логическая обработка сервлета

public class TestReport extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    Map parameterMap = new HashMap();
		parameterMap.put("PRINT_DATE", new Date());//此处的键值对应报表 parameter 中的字段
		String reportMode = "";
		String type = request.getParameter("type");
		if (type.equals("pdf")) {
		    reportMode = "pdf";
        }else if (type.equals("excel")) {
            reportMode = "excel";
        }
		String reportName = "WhLoan_Detail_Report";//报表名字,打印出来的报表名
		String reportId = "WhLoan_Detail_Report";//报表Id,对应于webroot/report/jrxml 你保存的报表名
		String sql = "SELECT CI.CUST_NAME,CI.cust_id_no,LB.BRD_NAME,APPR_AMT,APPR_TERM,ACTV_SYS_DT,ACTV_USER_ID"
		           +" FROM loan,cust_info CI,LOAN_BRD LB"//注意 FROM 前要有空格
		           +" WHERE loan.CUST_ID_CTRY = CI.CUST_ID_CTRY"//空格
		           +" AND LOAN.CUST_ID_NO = CI.CUST_ID_NO"//空格
		           +" AND LOAN.CUST_ID_TYPE = CI.CUST_ID_TYPE"
		           +" AND LOAN.LOAN_BRD = LB.BRD_ID";
		try {
		    List dataList = SqlHelper.selectAll(sql);
			ReportExporter.exportReport(request, response, reportId, reportMode, parameterMap, dataList, reportName);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request, response);
	}
}

Принимая во внимание совместимость с основными браузерами, лучше использовать reportName на английском языке, а не на китайском.

Класс ReportExporter

ReportExporter инкапсулирует метод экспорта всех форматов, таких как pdf, excel, html и т. д., который можно вызывать напрямую.

public class ReportExporter {
    /**
     * 获取打印报表
     */
    public static void exportReport(HttpServletRequest request, HttpServletResponse response, String reportId,
            String exportMode, Map parameterMap, List dataList, String downloadFileName) throws Exception {
        Connection connection = null;
        try {
            if (dataList == null) {
                connection = SqlHelper.getConnection();
            }
            ServletContext servletContext = request.getSession().getServletContext();
            File jasperFile = new File(servletContext.getRealPath("/report/jasper/" + reportId + ".jasper"));
            if (!jasperFile.exists())
                throw new IOException("Report file can't be found");

            if (parameterMap == null)
                parameterMap = new HashMap();
            //ireport3.0用这个
            // JasperReport jasperReport = (JasperReport)JRLoader.loadObject(jasperFile.getPath());
            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(jasperFile);
            JasperPrint jasperPrint = null;
            if (dataList == null) {
                jasperPrint = JasperFillManager.fillReport(jasperReport, parameterMap, connection);
            } else {
                JRDataSource source = new JRBeanCollectionDataSource(dataList);
                jasperPrint = JasperFillManager.fillReport(jasperReport, parameterMap, source);
            }

            if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0)
                downloadFileName = new String(downloadFileName.getBytes("UTF-8"), "ISO8859-1");// firefox浏览器
            else if (request.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0)
                downloadFileName = new String(downloadFileName.getBytes("gb2312"), "ISO8859-1");// IE浏览器

            if (ReportExportMode.EXP_PDF_MODE.equalsIgnoreCase(exportMode)) {
                exportPdf(response, jasperPrint, downloadFileName);
            } else if (ReportExportMode.EXP_EXCEL_MODE.equalsIgnoreCase(exportMode)) {
                exportExcel(response, jasperPrint, downloadFileName);
            } else if ("word".equals(exportMode)) {
                exportWord(response, jasperPrint, downloadFileName);
            } else if ("rtf".equals(exportMode)) {
                exportRTF(response, jasperPrint, downloadFileName);
            } else if ("html".equals(exportMode)) {
                exportHtml(response, jasperPrint, downloadFileName);
            }
        } finally {
            if (dataList == null && connection != null)
                try {
                    connection.close();
                } catch (SQLException e) {
                }
        }
    }

    /**
     * pdf导出
     */
    private static void exportPdf(HttpServletResponse response, JasperPrint jasperPrint, String downloadFileName)
            throws JRException, IOException {
        ServletOutputStream ouputStream = response.getOutputStream();

        try {
            JRPdfExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);

            response.setContentType("application/pdf;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName + ".pdf");
            exporter.exportReport();
            ouputStream.flush();
        } finally {
            try {
                ouputStream.close();
            } catch (Exception e) {
            }
        }
    }

    /**
     * excel导出
     */
    private static void exportExcel(HttpServletResponse response, JasperPrint jasperPrint, String downloadFileName)
            throws JRException, IOException {
        ServletOutputStream ouputStream = response.getOutputStream();

        try {
            JRXlsExporter exporter = new JRXlsExporter();
            exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, ouputStream);
            response.setContentType("application/vnd_ms-excel;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName + ".xls");
            exporter.exportReport();
            ouputStream.flush();
        } finally {
            try {
                ouputStream.close();
            } catch (Exception e) {
            }
        }
    }

    /**
     * 导出word
     */
    private static void exportWord(HttpServletResponse response, JasperPrint jasperPrint, String downloadFileName)
            throws JRException, IOException {
        ServletOutputStream ouputStream = response.getOutputStream();

        try {
            JRExporter exporter = new JRRtfExporter();
            exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, ouputStream);

            response.setContentType("application/msword;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName + ".doc");
            exporter.exportReport();
            ouputStream.flush();
        } finally {
            try {
                ouputStream.close();
            } catch (Exception e) {
            }
        }
    }

    /**
     * 导出RTF
     */
    private static void exportRTF(HttpServletResponse response, JasperPrint jasperPrint, String downloadFileName)
            throws JRException, IOException {
        ServletOutputStream ouputStream = response.getOutputStream();

        try {
            JRExporter exporter = new JRRtfExporter();
            exporter.setParameter(JRXlsExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRXlsExporterParameter.OUTPUT_STREAM, ouputStream);

            response.setContentType("application/rtf;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + downloadFileName + ".rtf");
            exporter.exportReport();
            ouputStream.flush();
        } finally {
            try {
                ouputStream.close();
            } catch (Exception e) {
            }
        }
    }

    /**
     * 导出html
     */
    private static void exportHtml(HttpServletResponse response, JasperPrint jasperPrint, String downloadFileName)
            throws JRException, IOException {
        ServletOutputStream ouputStream = response.getOutputStream();

        try {
            JRHtmlExporter exporter = new JRHtmlExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
            exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
            exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
            response.setContentType("text/html;charset=utf-8");
            exporter.exportReport();
            ouputStream.flush();
        } finally {
            try {
                ouputStream.close();
            } catch (Exception e) {
            }
        }
    }
}

Класс репортэкспортмоде

public class ReportExportMode {

	public static String EXP_PDF_MODE="PDF";
	public static String EXP_EXCEL_MODE="EXCEL";
	public static boolean isPDF(String mode){
		return EXP_PDF_MODE.equals(mode);
	}
	public static boolean isEXCEL(String mode){
		return EXP_EXCEL_MODE.equals(mode);
	}
}

запустить программу

Нажмите экспорт PDF и экспорт EXCEL

运行程序导出

экспорт в пдф

导出PDF格式

Экспорт Эксель

导出PDF格式