Java将数据集合转换为PDF

news2024/11/28 4:34:47

这里写自定义目录标题

  • 将数据集合转换为pdf
    • 引入包
    • 工具类
    • 测试代码
    • 导出效果

将数据集合转换为pdf

依赖itext7包将数据集合转换导出为PDF文件

引入包

<properties>
    <itext.version>7.1.11</itext.version>
</properties>

<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>${itext.version}</version>
    <type>pom</type>
</dependency>

工具类

package xxxxxxxxxxxxxxxxxxxxx;

import cn.hutool.core.date.DateTime;

import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;

import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Sheet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;

/**
 * TO PDF Utils
 *
 * @author linxifengbao
 * @Date 2023/7/14
 **/
public class ToPdfUtils {

    /**
     * excel 写入到 pdf
     * @param workbook      excel的workbook
     * @param outFilePath   要写入的pdf文件详细路径(带.pdf,例如写到项目根目录:"output.pdf")
     * @throws IOException
     */
    public static void excelToPdf(org.apache.poi.ss.usermodel.Workbook workbook, String outFilePath) throws IOException {
        PdfFont pdfFont = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", true);
        try (PdfDocument pdf = new PdfDocument(new PdfWriter(new FileOutputStream(outFilePath)));
             Document document = new Document(pdf, PageSize.A4.rotate())) {

            Sheet sheet = workbook.getSheetAt(0);
            int column = sheet.getRow(0).getLastCellNum();
            int row = sheet.getPhysicalNumberOfRows();

            Table table = new Table(column - sheet.getRow(0).getFirstCellNum());

            String str = null;
            for (int i = sheet.getFirstRowNum(); i < row; i++) {
                for (int j = sheet.getRow(0).getFirstCellNum(); j < column; j++) {
                    //获取excel单元格
                    org.apache.poi.ss.usermodel.Cell cell = sheet.getRow(i).getCell(j);
                    if (cell.getCellType() == CellType.NUMERIC) {
                        str = (int) cell.getNumericCellValue() + "";
                    } else {
                        str = cell.getStringCellValue();
                    }
                    Cell cells = new Cell().setFont(pdfFont).add(new Paragraph(str));
                    table.addCell(cells);
                }
            }
            document.add(table);

        } catch (Exception e) {
            throw new RuntimeException();
        }
    }

    /**
     * excel 写入到 pdf 点击浏览器直接下载 pdf
     * @param workbook      excel的workbook
     * @param response
     * @throws IOException
     */
    public static void excelToPdfForBrowserDownload(org.apache.poi.ss.usermodel.Workbook workbook,
                                                    HttpServletResponse response,
                                                    String fileName) throws ServletException, IOException {
        String currentTimeStr = cn.hutool.core.date.DateUtil.format(new DateTime(new Date().getTime()), "yyyyMMddHHmmss");
        fileName = fileName + currentTimeStr + ".pdf";
        // 设置响应头,告诉浏览器下载文件
        response.reset();
        response.setCharacterEncoding("utf-8");
        fileName = java.net.URLEncoder.encode(fileName,"UTF-8").replace("+", "%20");
        response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName);
        response.setContentType("application/pdf");
        // 将PDF内容写入响应输出流
        ServletOutputStream outputStream = response.getOutputStream();
        PdfFont pdfFont = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", true);
        try (PdfDocument pdf = new PdfDocument(new PdfWriter(outputStream));
             Document document = new Document(pdf, PageSize.A4.rotate())) {

            Sheet sheet = workbook.getSheetAt(0);
            int column = sheet.getRow(0).getLastCellNum();
            int row = sheet.getPhysicalNumberOfRows();

            Table table = new Table(column - sheet.getRow(0).getFirstCellNum());

            String str = null;
            for (int i = sheet.getFirstRowNum(); i < row; i++) {
                for (int j = sheet.getRow(0).getFirstCellNum(); j < column; j++) {
                    //获取excel单元格
                    org.apache.poi.ss.usermodel.Cell cell = sheet.getRow(i).getCell(j);
                    if (cell.getCellType() == CellType.NUMERIC) {
                        str = (int) cell.getNumericCellValue() + "";
                    } else {
                        str = cell.getStringCellValue();
                    }
                    Cell cells = new Cell().setFont(pdfFont).add(new Paragraph(str));
                    table.addCell(cells);
                }
            }
            document.add(table);

        } catch (Exception e) {
            throw new RuntimeException();
        } finally {
            outputStream.flush();
            outputStream.close();
        }
    }

    private static String getSuffix(String filePath) {
        int dotIndex = filePath.lastIndexOf(".");
        return filePath.substring(dotIndex + 1);
    }

    /**
     * 数据集合 写入到 pdf 点击浏览器直接下载 pdf
     * @param headList       表头数据
     * @param columnNameList 字段名数据
     * @param dataList       列表数据
     * @param fileName       文件名
     * @param response
     * @throws IOException
     */
    public static void dataToPdfForBrowserDownload(List<String> headList,
                                                   List<String> columnNameList,
                                                   List<Map<String, Object>> dataList,
                                                   HttpServletResponse response,
                                                   String fileName) throws ServletException, IOException {
        String currentTimeStr = cn.hutool.core.date.DateUtil.format(new DateTime(new Date().getTime()), "yyyyMMddHHmmss");
        fileName = fileName + currentTimeStr + ".pdf";
        // 设置响应头,告诉浏览器下载文件
        response.reset();
        response.setCharacterEncoding("utf-8");
        fileName = java.net.URLEncoder.encode(fileName,"UTF-8").replace("+", "%20");
        response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName);
        response.setContentType("application/pdf");
        // 将PDF内容写入响应输出流
        ServletOutputStream outputStream = response.getOutputStream();
        PdfFont pdfFont = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", true);
        try (PdfDocument pdf = new PdfDocument(new PdfWriter(outputStream));
             Document document = new Document(pdf, PageSize.A4.rotate())) {
            //设置表格列数
            Table table = new Table(headList.size());
            // 设置表格宽度为页面宽度的百分比
            table.useAllAvailableWidth();
            //添加表头数据
            for (String itemHead : headList) {
                table.addCell(new Cell().setFont(pdfFont).add(new Paragraph(itemHead)));
            }
            //添加表格内数据
            if(dataList != null && dataList.size() > 0) {
                for (Map<String, Object> itemDataMap : dataList) {
                    for (String columnName : columnNameList) {
                        String str = itemDataMap.get(columnName) == null ? "" : itemDataMap.get(columnName).toString();
                        Cell cell = new Cell().setFont(pdfFont).add(new Paragraph(str));
                        table.addCell(cell);
                    }
                }
            }
            document.add(table);
        } catch (Exception e) {
            throw new RuntimeException();
        } finally {
            outputStream.flush();
            outputStream.close();
        }
    }

    /**
     * 数据集合 写入到 pdf 点击浏览器直接下载 pdf
     * 带contentLength设置
     *
     * @param headList       表头数据
     * @param columnNameList 字段名数据
     * @param dataList       列表数据
     * @param fileName       文件名
     * @param response
     * @throws IOException
     */
    public static void dataToPdfForBrowserDownloadWithProgress(List<String> headList,
                                                               List<String> columnNameList,
                                                               List<Map<String, Object>> dataList,
                                                               HttpServletResponse response,
                                                               String fileName) throws ServletException, IOException {
        String currentTimeStr = cn.hutool.core.date.DateUtil.format(new DateTime(new Date().getTime()), "yyyyMMddHHmmss");
        fileName = fileName + currentTimeStr + ".pdf";
        // 设置响应头,告诉浏览器下载文件
        response.reset();
        response.setCharacterEncoding("utf-8");
        fileName = java.net.URLEncoder.encode(fileName,"UTF-8").replace("+", "%20");
        response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName);
        response.setContentType("application/pdf");
        // 响应输出流
        ServletOutputStream outputStream = response.getOutputStream();
        // 内存字节数组流对象
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfFont pdfFont = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", true);
        try {
            // 将pdfWriter与一个ByteArrayOutputStream对象关联起来,以便将PDF写入内存中的字节数组
            PdfWriter pdfWriter = new PdfWriter(baos);
            PdfDocument pdf = new PdfDocument(pdfWriter);
            Document document = new Document(pdf, PageSize.A4.rotate());
            //设置表格列数
            Table table = new Table(headList.size());
            // 设置表格宽度为页面宽度的百分比
            table.useAllAvailableWidth();
            //添加表头数据
            for (String itemHead : headList) {
                table.addCell(new Cell().setFont(pdfFont).add(new Paragraph(itemHead)));
            }
            //添加表格内数据
            if(dataList != null && dataList.size() > 0) {
                for (Map<String, Object> itemDataMap : dataList) {
                    for (String columnName : columnNameList) {
                        String str = itemDataMap.get(columnName) == null ? "" : itemDataMap.get(columnName).toString();
                        Cell cell = new Cell().setFont(pdfFont).add(new Paragraph(str));
                        table.addCell(cell);
                    }
                }
            }
            document.add(table);

            // 关闭文档
            document.close();
            // 获取PDF内容的字节数组
            byte[] byteArray = baos.toByteArray();
            // 设置response的内容长度
            response.setContentLength(byteArray.length);
            // 输出PDF内容到response的输出流中
            response.getOutputStream().write(byteArray);

        } catch (Exception e) {
            throw new RuntimeException();
        } finally {
            outputStream.flush();
            outputStream.close();
        }
    }


}

测试代码

    @GetMapping("/testDataToPdf")
    public void testDataToPdf(HttpServletResponse httpServletResponse) throws ServletException, IOException {
        List<String> headList = Arrays.asList("姓名", "年龄");
        List<String> columnNameList = Arrays.asList("name", "age");
        List<Map<String, Object>> dataList = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            Map<String, Object> itemMap = new HashMap<>();
            itemMap.put("id", i);
            itemMap.put("name", "张" + i);
            itemMap.put("age", new Random().nextInt(50) + 1);
            dataList.add(itemMap);
        }
        String fileName = "测试";
        ToPdfUtils.dataToPdfForBrowserDownloadWithProgress(headList, columnNameList, dataList, httpServletResponse, fileName);
    }

导出效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring、Springboot、SpringMVC之间的关系

他们之间没有明确的区分。一个项目&#xff0c;可以说是SpringMVC,又是Sprigboot,又是Spring项目。 首先简单看一下他们的定义&#xff1a; Spring是包含众多容器的IOC(控制反转)容器&#xff0c;是一个分层的轻量级框架&#xff0c;为了简化Java程序的开发。Springboot在Spr…

实例022 非矩形窗体

实例说明 大部分Windows窗体都是一个矩形区域&#xff0c;读者是否已经厌倦了这种中规中矩的矩形窗体&#xff1f;本例中的窗体是一个打破传统矩形的异型窗体&#xff0c;运行该例会看到一个非常可爱的窗体&#xff0c;单击【X】按钮就会使窗口关闭。实例效果如图1.22所示。 …

基于MATLAB的无人机遥感数据预处理与农林植被性状估算实践

遥感技术作为一种空间大数据手段&#xff0c;能够从多时、多维、多地等角度&#xff0c;获取大量的农情数据。数据具有面状、实时、非接触、无伤检测等显著优势&#xff0c;是智慧农业必须采用的重要技术之一。本内容主要针对农业、林业、生态、遥感背景的对无人机遥感有兴趣的…

低代码平台协同OA升级,促进金融企业信息化建设

编者按&#xff1a;数字化办公是信息化时代每个企业不可避免的&#xff0c;OA系统是数字化办公的关键环节。如何与时俱进&#xff0c;保持企业的活力&#xff0c;增强企业综合竞争力&#xff1f;本文分析了企业OA系统为什么需要升级&#xff0c;并进一步指出如何实现升级。 关…

git stash 内容丢失找回【亲测好用】

直接将下列代码复制到 终端 会出现所有列表 也包括你删除/丢失的stash git log --graph --oneline --decorate $( git fsck --no-reflog | awk /dangling commit/ {print $3} ) 前面的黄色就是他的编号 例如我想回复 自己编辑修改项目 将编号复制重链即可 git stash apply …

MySQL使用

目录 1 MySQL的登录 1.1 服务的启动和终止 1.2 自带客户端的登录与退出 2 MySQL演示使用 2.1 MySQL的使用演示 2.2 MySQL的编码设置 1 MySQL的登录 1.1 服务的启动和终止 MySQL安装完毕以后&#xff0c;需要启动服务器进程&#xff0c;不然客户端无法连接数据库。 在前面…

用html+javascript打造公文一键排版系统7:落款排版

一、公文落款的格式 公文落款包括单位署名和成文日期两个部分&#xff0c;其中成文日期中的数字 用阿拉伯数字将年、月、日标全&#xff0c;年份应标全称&#xff0c;月、日不编虚位&#xff08;即 1 不编为 01&#xff09;。 在实际应用工作中分为三种情况&#xff1a; &am…

(36)转速传感器

文章目录 前言 36.1 RPM库如何工作(TYPE AUXPIN) 36.2 霍尔效应传感器 36.3 电调遥测 - 电机平均转速 36.4 电气换向传感器 36.5 光学传感器 36.6 谐波陷波中心频率 前言 ArduPilot 支持使用众多类型的转速传感器。它们通常用于传统的直升机&#xff0c;测量主旋翼速度…

java Spring Boot上线运维 启动jar时控制台调整零时变量

前面的文章 java 打包Spring Boot项目&#xff0c;并运行在windows系统中和将Spring Boot项目打包部署到阿里云linux服务器讲述了Spring Boot项目打包部署的过程 但是 这里 我们可能会遇到一种情况 此时 我们服务器 java项目占用了 80端口 但我们需要放上去一个更重要的东西&am…

M1安装服务一条龙Mysql (解决PID的不存在的方法)

遇到的各种奇葩离谱问题 dev.mysql.com/downloads/mysql/&#xff0c;登入下载就行&#xff0c;下载这块最简单&#xff0c;就不详细说明了 首先注意一个点M1可以下载ARM&#xff0c;也可以X86&#xff0c;目前暂时不用考虑效率能用就行&#xff0c;5.7也可以用哈 然后下载完&…

【公考-判断推理】定义判断04

【国考判断推理】定义判断04 1.读得准1.1找主客体1.2 句式1.3解释说明 2.读得快2.1 优先看概念2.2多定义先看问题 3.小技巧3.1拆词3.2 同构 解题思维 在这里插入代码片 1.读得准 1.1找主客体 看主体 1.2 句式 出现多个的时候要就注意多个主体。 定义题&#xff0c;出现或…

Mac系统下配置环境变量:Javajdk、maven、tomcat 环境变量配置及对应配置文件

文章目录 前言一、配置环境变量路径问题1、macOS 下环境变量的配置文件2、解决环境变量在 zsh shell 无效的问题3、查看 macOS 全部环境变量4、设置系统环境变量 二、JDK下载&配置环境变量1、下载2、配置环境变量3、测试 三、maven下载&配置环境变量1、下载2、环境变量…

day28-Github Profiles(获取Github用户概要)

50 天学习 50 个项目 - HTMLCSS and JavaScript day28-Github Profiles&#xff08;获取Github用户概要&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewp…

第三章:C语言的循环控制结构

文章目录 1.While2.do...while...3.for循环 1.While 标准格式&#xff1a;while() 括号后面如果直接写1则表示是死循环&#xff1a;while(1) 括号后面也可以是执行条件&#xff0c;比如下面的代码是只有当i<10时才会进入循环执行&#xff0c;执行完毕后自动退出 运行结果 …

Qgis二次开发-QgsMapTool地图交互工具详解

1.简介 QgsMapTool地图工具是用于操作地图画布的用户交互式工具。例如&#xff0c;地图平移和缩放功能被实现为地图工具。 QgsMapTool是抽象基类&#xff0c;以下是类的继承关系&#xff1a; 2.常用接口 virtual void canvasDoubleClickEvent (QgsMapMouseEvent *e)重写鼠标…

【Matlab】基于遗传算法优化 BP 神经网络的数据回归预测(Excel可直接替换数据)

【Matlab】基于遗传算法优化 BP 神经网络的数据回归预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.文件结构3.Excel数据4.分块代码4.1 arithXover.m4.2 delta.m4.3 ga.m4.4 gabpEval.m4.5 initializega.m4.6 maxGenTerm.m4.7 nonUnifMutation.m4.8 normGeomSel…

Hadoop简介以及集群搭建详细过程

Hadoop简介以及集群搭建详细过程 hadoop集群简介hadoop部署模式Hadoop集群安装1.集群角色规划2.服务器基础环境准备3.上传安装包hadoop安装包目录结构5.编辑hadoop配置文件6.分发安装包7.配置hadoop环境变量8.NameNode format(格式化操作) hadoop集群启动关闭-手动逐个进程启停…

数字孪生in电力终端:高效虚拟环境实现测试“左移”

电力资源是现代社会发展必不可少的清洁型可再生资源&#xff0c;在清洁性、高效性、便捷性和适用性等方面优于传统化石能源&#xff0c;是如期实现2030年前碳达峰、2060年前碳中和的“双碳”目标的关键。2006至2019年前&#xff0c;电力行业累计为全社会减少了约159.4亿吨的碳排…

VSCode_常用插件_最新推荐

本文介绍前端开发领域常用的一些VSCode插件&#xff0c;插件是VSCode最重要的组成部分之一&#xff0c;本文列出了个人觉得是有用或有趣的一些插件。 一、代码管理相关插件 1、GitLens — Git supercharged 该插件增强了 VS Code 中的 Git&#xff0c;通过丰富的可视化和强…

【大厂直通车】百度2024届测开提前批一面面经(烫).

&#x1f4ec;&#x1f4ec;哈喽&#xff0c;大家好&#xff0c;我是小浪。那么最近24届提前批的公司陆续开了大大小小有好几十家了。有很多的同学已经制作好了简历&#xff0c;陆续开始投递了。但是结果&#xff0c;确实很不尽人意&#xff0c;在某论坛上面看到很多同学简历这…