poi生成Workbook转成pdf(java实现excel转pdf)

这里excel转pdf实现的思想是:
先用poi生成workbook 然后转为pdf格式文件

controller:

CommenConstant.FILE_TYPE fileTypeEnum = CommenConstant.FILE_TYPE.getFileTypeEnum(fileType);
        if (null == fileTypeEnum) {
            return failure("文件类型不符合规范(pdf、excel)");
        }
XSSFWorkbook backBook;
        //数据库查出故障数据
        List<FaultRegisterVO> faultRegisterVOS = statisticsService.selectFaultRegisterMsg(date,timeType);
        //将数据生成workbook
        backBook = statisticsService.generateFaultRegisterMsgExcel(faultRegisterVOS,date,timeType);
        OutputStream osOut = response.getOutputStream();

        switch (fileTypeEnum) {
            case EXCLE:
                response.setHeader("Content-disposition", "attachment;filename="+ "故障排名报表"  +".xlsx");
                response.setContentType("application/vnd.ms-excel;charset=utf-8");
                backBook.write(osOut);
                osOut.close();
                osOut.flush();
                break;
            case PDF:
                ExcelConvertPdf.excelConvertPdf(backBook,osOut,response);
                osOut.close();
                osOut.flush();
                break;
            default:
                return null;
        }

枚举工具类:

    public enum FILE_TYPE{
        /**
         * 统计报表形式
         */
        PDF("pdf"),
        EXCLE("excle");

        String desc;

        FILE_TYPE(String desc){
            this.desc = desc;
        }
        public static FILE_TYPE getFileTypeEnum(String desc){
            for(FILE_TYPE fileType:FILE_TYPE.values()){
                if(fileType.desc.equals(desc)){
                    return fileType;
                }
            }
            return null;
        }
    }

excel转pdf工具类

import cn.hutool.core.date.DateTime;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.util.ResourceUtils;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author WangXinZhong
 * @Date 2021/12/31 17:31
 */
public class ExcelConvertPdf {
    public static void excelConvertPdf(XSSFWorkbook workbook, OutputStream osOut, HttpServletResponse response) throws DocumentException, IOException {
        //设置页面大小
        Rectangle rectPageSize = new Rectangle(PageSize.A3);// 定义A3页面大小
        rectPageSize = rectPageSize.rotate(); //横版
        Document document = new Document(rectPageSize, -80, -80, 50, 0); //边距

        //字体设置
        /*
         * 由于itext不支持中文,所以需要进行字体的设置,可以调用项目资源文件或者调用windows系统的中文字体,
         * 找到文件后,打开属性,将文件名及所在路径作为字体名即可。
         */
        //创建BaseFont对象,指明字体,编码方式,是否嵌入
        BaseFont bf=BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        //创建Font对象,将基础字体对象,字体大小,字体风格
        Font font = new Font(bf, 13, Font.NORMAL);
        int rowNum = 0;
        int colNum = 0;

        XSSFSheet sheet = workbook.getSheetAt(0);
        int column = sheet.getRow(1).getLastCellNum();
        int row = sheet.getPhysicalNumberOfRows();
        System.out.println(row);
        //下面是找出表格中的空行和空列
        List nullCol = new ArrayList<>();
        List nullRow = new ArrayList<>();
        for (int j = 0; j < column; j++) {
            int nullColNum = 0;
            for (int i = 0; i < row; i++) {
                XSSFCell cell = sheet.getRow(i).getCell(j);
                if (cell == null || (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) && "".equals(cell.getStringCellValue())) {
                    nullColNum++;
                }
            }
            if (nullColNum == row) {
                nullCol.add(j);
            }
        }
        for (int i = 0; i < row; i++) {
            int nullRowNum = 0;
            for (int j = 0; j < column; j++) {
                XSSFCell cell = sheet.getRow(i).getCell(j);
                if (cell == null || (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) && "".equals(cell.getStringCellValue())) {
                    nullRowNum++;
                }
            }
            if (nullRowNum == column) {
                nullRow.add(i);
            }
        }
        PdfWriter writer = PdfWriter.getInstance(document,osOut);
        document.open();

        PdfPTable table = new PdfPTable(column-sheet.getRow(1).getFirstCellNum());
        List<CellRangeAddress> ranges = new ArrayList();
        int sheetMergeCount = sheet.getNumMergedRegions();
        System.out.println("sheetMergeCount"+sheetMergeCount);
        for (int i = 0; i < sheetMergeCount; i++) {
            CellRangeAddress range = sheet.getMergedRegion(i);
            ranges.add(range);
        }

        PdfPCell cell1 = null;
        String str = null;
        boolean mergeFlag = true;

        for (int i = sheet.getFirstRowNum(); i < row; i++) {
            /*if (nullRow.contains(i)) { //如果这一行是空行,这跳过这一行
                continue;
            }*/

            for (int j = sheet.getRow(1).getFirstCellNum(); j < column; j++) {
                /*if (nullCol.contains(j)) { //如果这一列是空列,则跳过这一列
                    continue;
                }*/

                boolean flag = true;
                XSSFCell cell = sheet.getRow(i).getCell(j);
                if(null != cell) {
                    if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
                        str = (int) cell.getNumericCellValue() + "";
                    } else {
                        str = cell.getStringCellValue();
                    }

                    System.out.println("i ::"+i + "j::"+j);
                    System.out.println(str);

                    for (CellRangeAddress range : ranges) { //合并的单元格判断和处理

                        if (j >= range.getFirstColumn() && j <= range.getLastColumn() && i >= range.getFirstRow()
                                && i <= range.getLastRow()) {
                            /*if (str == null || "".equals(str)) {
                                flag = false;
                                if (ranges.size()>1){
                                    mergeFlag = true;
                                }else {
                                    mergeFlag = false;
                                }
                                break;
                            }*/
                            if(mergeFlag){
                                rowNum = range.getLastRow() - range.getFirstRow() + 1;
                                colNum = range.getLastColumn() - range.getFirstColumn() + 1;
                                cell1 = mergeCell(str, font, rowNum, colNum);
                                System.out.println("合并"+rowNum+"、"+colNum);
                                table.addCell(cell1);
                                flag = false;
                                if (ranges.size()>1){
                                    mergeFlag = true;
                                }else {
                                    mergeFlag = false;
                                }
                                break;
                            }
                            flag = false;
                            if (ranges.size()>1){
                                mergeFlag = true;
                            }else {
                                mergeFlag = false;
                            }
                        }
                    }

                    if (flag) {
                        table.addCell(getPDFCell(str, font));
                    }
                }

            }
        }

        document.add(table);
        response.setContentType("application/pdf");
        response.setHeader("Content-disposition", "attachment;filename="+ DateTime.now()  +".pdf");
        document.close();
        writer.close();
    }

    //合并
    public static PdfPCell mergeCell(String str, Font font, int i, int j) {

        PdfPCell cell = new PdfPCell(new Paragraph(str, font));
        cell.setMinimumHeight(25);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        cell.setRowspan(i);
        cell.setColspan(j);

        return cell;
    }
    //获取指定内容与字体的单元格
    public 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;
    }
}
  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
POI(Apache POI)是一个开源的Java库,用于处理Microsoft Office格式的文件。我们可以利用POI库来将Excel文件换为PDF格式。 首先,我们需要在Java项目中引入POI库的依赖。可以通过在项目的pom.xml文件中添加以下依赖项来实现: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 接下来,我们需要编写Java代码来完成ExcelPDF换。首先,我们需要加载Excel文件: ```java try(FileInputStream excelFile = new FileInputStream(new File("input.xlsx")); Workbook workbook = new XSSFWorkbook(excelFile)) { // 做一些Excel文件的操作,如读取或修改数据 ... } catch(IOException e) { e.printStackTrace(); } ``` 然后,我们创建一个PDF文档,并将Excel文件的内容写入到PDF中: ```java try(FileOutputStream pdfFile = new FileOutputStream(new File("output.pdf")); PdfDocument pdfDocument = new PdfDocument(new PdfWriter(pdfFile))) { Document document = new Document(pdfDocument); // 将Excel文件的内容写入PDF中 ... document.close(); } catch(IOException e) { e.printStackTrace(); } ``` 在"将Excel文件的内容写入PDF中"的部分,我们可以使用POI库提供的API来读取Excel文件中的内容,并将其写入PDF中的相应位置。 最后,我们使用POI库将Excel文件成功换为PDF文件,可以在指定的目标位置找到生成PDF文件。 综上所述,通过使用POI库,我们可以方便地将Excel文件换为PDF格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值