Index: ssts-web/src/main/webapp/jasperRtp/exportReport.jsp =================================================================== diff -u -r13464 -r25891 --- ssts-web/src/main/webapp/jasperRtp/exportReport.jsp (.../exportReport.jsp) (revision 13464) +++ ssts-web/src/main/webapp/jasperRtp/exportReport.jsp (.../exportReport.jsp) (revision 25891) @@ -1,3 +1,4 @@ +<%@ page contentType="text/html; charset=UTF-8"%> <%@page import="net.sf.jasperreports.engine.export.JRXlsAbstractExporterParameter"%> <%@page import="net.sf.jasperreports.engine.export.JRXlsExporterParameter"%> <%@page import="java.net.URLEncoder"%> Index: build.gradle =================================================================== diff -u -r25786 -r25891 --- build.gradle (.../build.gradle) (revision 25786) +++ build.gradle (.../build.gradle) (revision 25891) @@ -492,6 +492,7 @@ compile group: 'javax.validation', name: 'validation-api', version: '1.1.0.Final' compile group: 'org.hibernate', name: 'hibernate-validator', version: '5.2.4.Final' compile group: 'com.fasterxml', name: 'classmate', version: '1.1.0' + compile group: 'com.itextpdf', name: 'itextpdf', version: '5.4.1' } Index: forgon-tools/src/main/java/com/forgon/tools/itextpdf/ExcelToPdf.java =================================================================== diff -u --- forgon-tools/src/main/java/com/forgon/tools/itextpdf/ExcelToPdf.java (revision 0) +++ forgon-tools/src/main/java/com/forgon/tools/itextpdf/ExcelToPdf.java (revision 25891) @@ -0,0 +1,217 @@ +package com.forgon.tools.itextpdf; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.List; + +import jxl.Cell; +import jxl.Range; +import jxl.Sheet; +import jxl.Workbook; +import jxl.read.biff.BiffException; + +import com.itextpdf.text.Document; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Element; +import com.itextpdf.text.Font; +import com.itextpdf.text.PageSize; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.pdf.BaseFont; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.pdf.PdfPTable; +import com.itextpdf.text.pdf.PdfWriter; + +/** + * excel文件转换成pdf文件(基于itexpdf组件) + * + * @author shuyongfu + * @since 2019-03-08 + */ +public class ExcelToPdf { + + /** + * excel转换成pdf + * + * @param excelInputStream + * @param pdfFilePath + * @throws DocumentException + * @throws IOException + */ + public static void excelToPdf(InputStream excelInputStream, + String pdfFilePath) throws DocumentException, IOException { + Document document = new Document(PageSize.A4, 0, 0, 50, 0); + OutputStream ous = new FileOutputStream(pdfFilePath); + PdfWriter writer = PdfWriter.getInstance(document, ous); + + // 字体设置 + + /** + * 由于itext不支持中文,所以需要进行字体的设置,我这里让itext调用windows系统的中文字体, + * 找到文件后,打开属性,将文件名及所在路径作为字体名即可。 + */ + + // 创建BaseFont对象,指明字体,编码方式,是否嵌入 + BaseFont bf = BaseFont.createFont("C:\\Windows\\Fonts\\simkai.ttf", + BaseFont.IDENTITY_H, false); + // 创建Font对象,将基础字体对象,字体大小,字体风格 + Font font = new Font(bf, 13, Font.NORMAL); + int rowNum = 0; + int colNum = 0; + try { + Workbook workbook = Workbook.getWorkbook(excelInputStream); + + Sheet sheet = workbook.getSheet(0); + int column = sheet.getColumns(); + + // 下面是找出表格中的空行和空列 + List nullCol = new ArrayList<>(); + List nullRow = new ArrayList<>(); + for (int j = 0; j < sheet.getColumns(); j++) { + int nullColNum = 0; + for (int i = 0; i < sheet.getRows(); i++) { + Cell cell = sheet.getCell(j, i); + String str = cell.getContents(); + if (str == null || "".equals(str)) { + nullColNum++; + } + } + if (nullColNum == sheet.getRows()) { + nullCol.add(j); + column--; + } + } + + for (int i = 0; i < sheet.getRows(); i++) { + int nullRowNum = 0; + for (int j = 0; j < sheet.getColumns(); j++) { + Cell cell = sheet.getCell(j, i); + String str = cell.getContents(); + if (str == null || "".equals(str)) { + nullRowNum++; + } + } + if (nullRowNum == sheet.getColumns()) { + nullRow.add(i); + } + } + PdfPTable table = new PdfPTable(column); + Range[] ranges = sheet.getMergedCells(); + + PdfPCell cell1 = new PdfPCell(); + for (int i = 0; i < sheet.getRows(); i++) { + if (nullRow.contains(i)) { // 如果这一行是空行,这跳过这一行 + continue; + } + for (int j = 0; j < sheet.getColumns(); j++) { + if (nullCol.contains(j)) { // 如果这一列是空列,则跳过这一列 + continue; + } + boolean flag = true; + Cell cell = sheet.getCell(j, i); + String str = cell.getContents(); + for (Range range : ranges) { // 合并的单元格判断和处理 + if (j >= range.getTopLeft().getColumn() + && j <= range.getBottomRight().getColumn() + && i >= range.getTopLeft().getRow() + && i <= range.getBottomRight().getRow()) { + if (str == null || "".equals(str)) { + flag = false; + break; + } + rowNum = range.getBottomRight().getRow() + - range.getTopLeft().getRow() + 1; + colNum = range.getBottomRight().getColumn() + - range.getTopLeft().getColumn() + 1; + if (rowNum > colNum) { + cell1 = mergeRow(str, font, rowNum); + cell1.setColspan(colNum); + table.addCell(cell1); + } else { + cell1 = mergeCol(str, font, colNum); + cell1.setRowspan(rowNum); + table.addCell(cell1); + } + // System.out.println(num1 + " " + num2); + flag = false; + break; + } + } + if (flag) { + table.addCell(getPDFCell(str, font)); + } + } + } + + workbook.close(); + document.open(); + document.add(table); + document.close(); + writer.close(); + writer.flush(); + ous.close(); + ous.flush(); + excelInputStream.close(); + } catch (BiffException | IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + // 合并行的静态函数 + private static PdfPCell mergeRow(String str, Font font, int i) { + + // 创建单元格对象,将内容及字体传入 + PdfPCell cell = new PdfPCell(new Paragraph(str, font)); + // 设置单元格内容居中 + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); + // 将该单元格所在列包括该单元格在内的i行单元格合并为一个单元格 + cell.setRowspan(i); + + return cell; + } + + // 合并列的静态函数 + private static PdfPCell mergeCol(String str, Font font, int i) { + + PdfPCell cell = new PdfPCell(new Paragraph(str, font)); + cell.setMinimumHeight(25); + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); + // 将该单元格所在行包括该单元格在内的i列单元格合并为一个单元格 + cell.setColspan(i); + + return cell; + } + + // 获取指定内容与字体的单元格 + private static PdfPCell getPDFCell(String string, Font font) { + // 创建单元格对象,将内容与字体放入段落中作为单元格内容 + PdfPCell cell = new PdfPCell(new Paragraph(string, font)); + + cell.setHorizontalAlignment(Element.ALIGN_CENTER); + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); + + // 设置最小单元格高度 + cell.setMinimumHeight(25); + return cell; + } + + /** + * main测试方法 + * @param args + * @throws DocumentException + * @throws IOException + */ + public static void main(String[] args) throws DocumentException, + IOException { + excelToPdf(new FileInputStream("C:\\forgon\\低温消毒记录.xls"), + "C:\\forgon\\低温消毒记录.pdf"); + System.out.println("excelToPdf finish..."); + } + +} Index: ssts-web/src/main/webapp/jasperRtp/jasperreportsView.jsp =================================================================== diff -u -r25889 -r25891 --- ssts-web/src/main/webapp/jasperRtp/jasperreportsView.jsp (.../jasperreportsView.jsp) (revision 25889) +++ ssts-web/src/main/webapp/jasperRtp/jasperreportsView.jsp (.../jasperreportsView.jsp) (revision 25891) @@ -174,6 +174,7 @@ + <% if (!reportName.equals("apparatusInfusionisType")) { Index: ssts-web/src/main/webapp/jasperRtp/exportPdfReport.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/jasperRtp/exportPdfReport.jsp (revision 0) +++ ssts-web/src/main/webapp/jasperRtp/exportPdfReport.jsp (revision 25891) @@ -0,0 +1,102 @@ +<%@ page contentType="text/html; charset=UTF-8"%> +<%@page import="java.text.SimpleDateFormat"%> +<%@page import="com.forgon.tools.date.DateTools"%> +<%@page import="java.util.Date"%> +<%@page import="java.io.File"%> +<%@page import="com.forgon.tools.itextpdf.ExcelToPdf"%> +<%@page import="java.io.FileInputStream"%> +<%@page import="java.io.InputStream"%> +<%@page import="java.io.FileOutputStream"%> +<%@page import="net.sf.jasperreports.engine.export.JRXlsAbstractExporterParameter"%> +<%@page import="net.sf.jasperreports.engine.export.JRXlsExporterParameter"%> +<%@page import="java.net.URLEncoder"%> +<%@page import="net.sf.jasperreports.engine.JRException"%> +<%@page import="net.sf.jasperreports.j2ee.servlets.ImageServlet"%> +<%@page import="java.io.IOException"%> +<%@page import="java.io.OutputStream"%> +<%@page import="net.sf.jasperreports.engine.JRExporterParameter"%> +<%@page import="net.sf.jasperreports.engine.export.JExcelApiExporter"%> +<%@page import="net.sf.jasperreports.engine.JasperPrint"%> +<% + +Object obj = session.getAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE); +JasperPrint jasperPrint = null; +if(obj instanceof JasperPrint){ + jasperPrint = (JasperPrint)obj; +} +String fileNameDate = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()); +String outputPath = application.getRealPath("/") + "download2/"; +//判断下载文件夹是否存在,如果不存在则创建 +File downloadFilePath = new File(outputPath); +if(!downloadFilePath.exists()){ + downloadFilePath.mkdir(); +} +String downloadXlsFileName = "xlsReport-" + fileNameDate + ".xls"; +String downloadPdfFileName = "xlsReport-" + fileNameDate + ".pdf"; +OutputStream excelOutputStream = null; +InputStream excelInputStream = null; +InputStream pdfFileInputStream = null; +OutputStream pdfResponseOutputStream = null; +File inputXlsFile = null;//输入的xls文件 +File outputPdfFile = null;//输出的pdf文件 + try { + excelOutputStream = new FileOutputStream(outputPath + downloadXlsFileName); + + JExcelApiExporter xlsExporter = new JExcelApiExporter(); + xlsExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); + xlsExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,excelOutputStream); + xlsExporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS,Boolean.TRUE); + xlsExporter.setParameter(JRXlsExporterParameter.IGNORE_PAGE_MARGINS,Boolean.TRUE); + xlsExporter.setParameter(JRXlsAbstractExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE); + //xlsExporter.setParameter(JRXlsExporterParameter.IS_DETECT_CELL_TYPE, Boolean.TRUE);//设置导出的Excel 数字显示成字符串问题 + //xlsExporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET,Boolean.FALSE); + //xlsExporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND,Boolean.FALSE); + xlsExporter.exportReport(); + excelOutputStream.close(); + excelOutputStream.flush(); + + + inputXlsFile = new File(outputPath + downloadXlsFileName); + outputPdfFile = new File(outputPath + downloadPdfFileName); + excelInputStream = new FileInputStream(inputXlsFile); + ExcelToPdf.excelToPdf(excelInputStream, outputPath + downloadPdfFileName); + try { + pdfFileInputStream = new FileInputStream(outputPath + downloadPdfFileName); + pdfResponseOutputStream = response.getOutputStream(); + response.setContentType("application/pdf"); + //response.setCharacterEncoding("UTF-8"); + String downloadFileName = session.getAttribute("fileName") + ".pdf"; + response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(downloadFileName, "UTF-8")); + byte[] b = new byte[1024]; + int read; + while((read = pdfFileInputStream.read(b)) != -1){ + pdfResponseOutputStream.write(b, 0, 1024); + } + }catch (IOException e) { + e.printStackTrace(); + }catch(Exception e){ + e.printStackTrace(); + } + } catch (JRException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try{ + //删除临时生成的两个文件 + try{ + inputXlsFile.delete(); + outputPdfFile.delete(); + }catch(Exception e){ + e.printStackTrace(); + } + pdfResponseOutputStream.close(); + pdfResponseOutputStream.flush(); + out.clear(); + out = pageContext.pushBody(); + }catch(Exception e){ + e.printStackTrace(); + } + } +%> + Index: ssts-web/src/main/webapp/jasperRtp/exportHtmlReport.jsp =================================================================== diff -u -r25889 -r25891 --- ssts-web/src/main/webapp/jasperRtp/exportHtmlReport.jsp (.../exportHtmlReport.jsp) (revision 25889) +++ ssts-web/src/main/webapp/jasperRtp/exportHtmlReport.jsp (.../exportHtmlReport.jsp) (revision 25891) @@ -1,3 +1,4 @@ +<%@ page contentType="text/html; charset=UTF-8"%> <%@page import="java.net.URLEncoder"%> <%@page import="net.sf.jasperreports.engine.JRException"%> <%@page import="net.sf.jasperreports.j2ee.servlets.ImageServlet"%>