复杂表格、多sheet页表格转换pdf 、展示

1.要求:到复杂表格后原模原样在前台展示。

2.思路

  1. 上传表格
  2. 将表格转换成pdf
  3. 将pdf文件以二进制的方式反给前端

3. 代码

1.引入maven 依赖

        <!--pdf-->
        <dependency>
            <groupId>com.aspose</groupId>
            <artifactId>aspose-cells</artifactId>
            <version>22.11</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        
  <repositories>
        <!--PDF私库一定要引入-->
        <repository>
            <id>AsposeJavaAPI</id>
            <name>Aspose Java API</name>
            <url>https://releases.aspose.com/java/repo/</url>
        </repository>
    </repositories>

2.创建PdfUtil工具类

package com.xhl.xhldongrong.utils;

import com.aspose.cells.License;
import com.aspose.cells.PdfSaveOptions;
import com.aspose.cells.Workbook;

import java.io.FileOutputStream;
import java.io.InputStream;

public class PdfUtil {

    /**
     * excel 转 pdf
     *
     * @param excelFilePath excel文件路径
     */
    public static void excel2pdf(String excelFilePath) {
        excel2pdf(excelFilePath, null, null);
    }

    /**
     * excel 转 pdf
     *
     * @param excelFilePath excel文件路径
     * @param convertSheets 需要转换的sheet
     */
    public static void excel2pdf(String excelFilePath, int[] convertSheets) {
        excel2pdf(excelFilePath, null, convertSheets);
    }

    /**
     * excel 转 pdf
     *
     * @param excelFilePath excel文件路径
     * @param pdfFilePath   pdf文件路径
     */
    public static void excel2pdf(String excelFilePath, String pdfFilePath) {
        excel2pdf(excelFilePath, pdfFilePath, null);
    }

    /**
     * excel 转 pdf
     *
     * @param excelFilePath excel文件路径
     * @param pdfFilePath   pdf文件路径
     * @param convertSheets 需要转换的sheet
     */
    public static void excel2pdf(String excelFilePath, String pdfFilePath, int[] convertSheets) {
        try {
            pdfFilePath = pdfFilePath == null ? getPdfFilePath(excelFilePath) : pdfFilePath;
            // 验证 License
//            getLicense();
            Workbook wb = new Workbook(excelFilePath);
            FileOutputStream fileOS = new FileOutputStream(pdfFilePath);
            PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
            pdfSaveOptions.setOnePagePerSheet(true);
            if (null != convertSheets) {
                printSheetPage(wb, convertSheets);
            }
            wb.save(fileOS, pdfSaveOptions);
            fileOS.flush();
            fileOS.close();
            System.out.println("convert success");
        } catch (Exception e) {
            System.out.println("convert failed");
            e.printStackTrace();
        }
    }

    /**
     * 获取 生成的 pdf 文件路径,默认与源文件同一目录
     *
     * @param excelFilePath excel文件
     * @return 生成的 pdf 文件
     */
    private static String getPdfFilePath(String excelFilePath) {
        return excelFilePath.split(".")[0] + ".pdf";
    }

    /**
     * 获取 license 去除水印
     * 若不验证则转化出的pdf文档会有水印产生
     */
    private static void getLicense() {
        String licenseFilePath = "excel-license.xml";
        try {
            InputStream is = PdfUtil.class.getClassLoader().getResourceAsStream(licenseFilePath);
            License license = new License();
            license.setLicense(is);
        } catch (Exception e) {
            System.out.println("license verify failed");
            e.printStackTrace();
        }
    }

    /**
     * 隐藏workbook中不需要的sheet页。
     *
     * @param sheets 显示页的sheet数组
     */
    private static void printSheetPage(Workbook wb, int[] sheets) {
        for (int i = 1; i < wb.getWorksheets().getCount(); i++) {
            wb.getWorksheets().get(i).setVisible(false);
        }
        if (null == sheets || sheets.length == 0) {
            wb.getWorksheets().get(0).setVisible(true);
        } else {
            for (int i = 0; i < sheets.length; i++) {
                wb.getWorksheets().get(i).setVisible(true);
            }
        }
    }
}

3.创建ExcelReadController

public class ExcelReadController {
// 存储文件夹
  @Value("${escelRead}")
    private String fileConfig;
@PostMapping("/uploadFile")
    @ApiOperation("上传")
    public ApiResponse<String> uploadFile(@RequestParam MultipartFile file) {
        String fileName = file.getOriginalFilename();
        //系统目录
        String filePath = System.getProperty("user.dir") + fileConfig;
        java.io.File dest = new java.io.File(filePath + fileName);
        java.io.File pfile = new java.io.File(filePath);
        if (!pfile.exists()) {
            pfile.mkdirs();
        }
        if (dest.exists()) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddmmss");
            fileName = sdf.format(Calendar.getInstance().getTime()) + fileName;
            dest = new java.io.File(filePath + fileName);
        }
        try {
            file.transferTo(dest);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ApiResponse.ofSuccess(fileName);
    }

/**
     * 下载
     *
     * @param filename
     * @param response
     */
    @ApiOperation("下载")
    @GetMapping("/{filename}")
    @ResponseBody
    public void outPic(@PathVariable String filename, HttpServletResponse response) {
		// 重新定义文件后缀为pdf
        String name = filename.replaceAll("[.](.*)", "");
        String filePath = System.getProperty("user.dir") + fileConfig;
        String pdfName = filePath + name + ".pdf";
        File file = new File(pdfName);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 将表格转化为pdf
        PdfUtil.excel2pdf(System.getProperty("user.dir") + fileConfig + filename, pdfName);
          //pdf转二进制
        try {
            try {
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                FileInputStream fis = new FileInputStream(pdfName);
                byte[] b = new byte[1024];
                int t = 0;


                while ((t = fis.read(b)) != -1) {
                    byteArrayOutputStream.write(b, 0, t);
                }
                response.getOutputStream().write(byteArrayOutputStream.toByteArray());
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值