基于SpringBoot框架管理Excel和PDF文件类型

一、文档类型简介

1、Excel文档

Excel一款电子表格软件。直观的界面、出色的计算功能和图表工具,在系统开发中,经常用来把数据转存到Excel文件,或者Excel数据导入系统中,这就涉及数据转换问题。

2、PDF文档

PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点。PDF文件格式可以将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。该格式文件还可以包含超文本链接、声音和动态影像等电子信息,支持特长文件,集成度和安全可靠性都较高。

二、Excel文件管理

1、POI依赖

Apache POI是Apache软件基金会的开源类库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

<!-- Excel 依赖 -->
<dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi</artifactId>
 <version>3.9</version>
</dependency>
<!-- 2007及更高版本 -->
<dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi-ooxml</artifactId>
 <version>3.9</version>
</dependency>

2、文件读取

public static List<List<Object>> readExcel(String path) throws Exception {
 File file = new File(path) ;
 List<List<Object>> list = new LinkedList<>();
 XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));
 // 读取 Sheet1 表格内容
 XSSFSheet sheet = xwb.getSheetAt(0);
 // 读取行数:不读取Excel表头
 for (int i = (sheet.getFirstRowNum()+1); i <= (sheet.getPhysicalNumberOfRows()-1); i++) {
  XSSFRow row = sheet.getRow(i);
  if (row == null) { continue; }
  List<Object> linked = new LinkedList<>();
  for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
   XSSFCell cell = row.getCell(j);
   if (cell == null) { continue; }
   Object value ;
   // 这里需根据实际业务情况处理
   switch (cell.getCellType()) {
    case XSSFCell.CELL_TYPE_NUMERIC:
     //处理数值带{.0}问题
     value = Double.valueOf(String.valueOf(cell)).longValue() ;
     break;
    default:
     value = cell.toString();
   }
   linked.add(value);
  }
  if (linked.size()!= 0) {
   list.add(linked);
  }
 }
 return list;
}

3、文件创建

public static void createExcel(String excelName, String[] headList,List<List<Object>> dataList)
  throws Exception {
 // 创建 Excel 工作簿
 XSSFWorkbook workbook = new XSSFWorkbook();
 XSSFSheet sheet = workbook.createSheet();
 // 创建表头
 XSSFRow row = sheet.createRow(0);
 for (int i = 0; i < headList.length; i++) {
  XSSFCell cell = row.createCell(i);
  cell.setCellType(XSSFCell.CELL_TYPE_STRING);
  cell.setCellValue(headList[i]);
 }
 //添加数据
 for (int line = 0; line < dataList.size(); line++) {
  XSSFRow rowData = sheet.createRow(line+1);
  List<Object> data = dataList.get(line);
  for (int j = 0; j < headList.length; j++) {
   XSSFCell cell = rowData.createCell(j);
   cell.setCellType(XSSFCell.CELL_TYPE_STRING);
   cell.setCellValue((data.get(j)).toString());
  }
 }
 FileOutputStream fos = new FileOutputStream(excelName);
 workbook.write(fos);
 fos.flush();
 fos.close();
}

4、文件导出

public static void exportExcel(String[] headList, List<List<Object>> dataList,
        OutputStream outputStream) throws Exception {
 // 创建 Excel 工作簿
 XSSFWorkbook workbook = new XSSFWorkbook();
 XSSFSheet sheet = workbook.createSheet();
 // 创建表头
 XSSFRow row = sheet.createRow(0);
 for (int i = 0; i < headList.length; i++) {
  XSSFCell cell = row.createCell(i);
  cell.setCellType(XSSFCell.CELL_TYPE_STRING);
  cell.setCellValue(headList[i]);
 }
 //添加数据
 for (int line = 0; line < dataList.size(); line++) {
  XSSFRow rowData = sheet.createRow(line+1);
  List<Object> data = dataList.get(line);
  for (int j = 0; j < headList.length; j++) {
   XSSFCell cell = rowData.createCell(j);
   cell.setCellType(XSSFCell.CELL_TYPE_STRING);
   cell.setCellValue((data.get(j)).toString());
  }
 }
 workbook.write(outputStream);
 outputStream.flush();
 outputStream.close();
}

5、文件导出接口

@RestController
public class ExcelWeb {
 @RequestMapping("/web/outExcel")
 public void outExcel (HttpServletResponse response) throws Exception {
  String exportName = "2020-01-user-data" ;
  response.setContentType("application/vnd.ms-excel");
  response.addHeader("Content-Disposition", "attachment;filename="+
        URLEncoder.encode(exportName, "UTF-8") + ".xlsx");
  List<List<Object>> dataList = ExcelUtil.readExcel("F:\\file-type\\user-excel.xlsx") ;
  String[] headList = new String[]{"用户ID", "用户名", "手机号"} ;
  ExcelUtil.exportExcel(headList,dataList,response.getOutputStream()) ;
 }
}

三、PDF文件管理

1、IText依赖

iText是一种生成PDF报表的Java组件。通过在服务器端使用页面或API封装生成PDF报表,客户端可以通过超链接直接显示或下载到本地,在系统开发中通常用来生成比较正式的报告或者合同类的电子文档。

<dependency>
 <groupId>com.itextpdf</groupId>
 <artifactId>itextpdf</artifactId>
 <version>5.5.11</version>
</dependency>
<dependency>
 <groupId>com.itextpdf.tool</groupId>
 <artifactId>xmlworker</artifactId>
 <version>5.5.11</version>
</dependency>

2、API二次封装

首先对于Itext提供的API做一下表格、段落、图片等基础样式的二次封装,可以更好的适配业务。

public class PdfFontUtil {
 private PdfFontUtil(){}

 /**
  * 段落样式获取
  */
 public static Paragraph getParagraph (String content, Font font,Integer alignment){
  Paragraph paragraph = new Paragraph(content,font) ;
  if (alignment != null && alignment >= 0){
   paragraph.setAlignment(alignment);
  }
  return paragraph ;
 }
 /**
  * 图片样式
  */
 public static Image getImage (String imgPath,float width,float height) throws Exception {
  Image image = Image.getInstance(imgPath);
  image.setAlignment(Image.MIDDLE);
  if (width > 0 && height > 0){
   image.scaleAbsolute(width, height);
  }
  return image ;
 }
 /**
  * 表格生成
  */
 public static PdfPTable getPdfPTable01 (int numColumns,float totalWidth) throws Exception {
  // 表格处理
  PdfPTable table = new PdfPTable(numColumns);
  // 设置表格宽度比例为%100
  table.setWidthPercentage(100);
  // 设置宽度:宽度平均
  table.setTotalWidth(totalWidth);
  // 锁住宽度
  table.setLockedWidth(true);
  // 设置表格上面空白宽度
  table.setSpacingBefore(10f);
  // 设置表格下面空白宽度
  table.setSpacingAfter(10f);
  // 设置表格默认为无边框
  table.getDefaultCell().setBorder(0);
  table.setPaddingTop(50);
  table.setSplitLate(false);
  return table ;
 }
 /**
  * 表格内容
  */
 public static PdfPCell getPdfPCell (Phrase phrase){
  return new PdfPCell (phrase) ;
 }
 /**
  * 表格内容带样式
  */
 public static void addTableCell (PdfPTable dataTable,Font font,List<String> cellList){
  for (String content:cellList) {
   dataTable.addCell(getParagraph(content,font,-1));
  }
 }
}

3、生成PDF文件

这里基于上面的工具类,画一个PDF页面作为参考。

public class PdfPage01 {
 // 基础配置
 private static String PDF_SITE = "F:\\file-type\\PDF页面2020-01-15.pdf" ;
 private static String FONT = "C:/Windows/Fonts/simhei.ttf";
 private static String PAGE_TITLE = "PDF数据导出报告" ;
 // 基础样式
 private static Font TITLE_FONT = FontFactory.getFont(FONT, BaseFont.IDENTITY_H,20, Font.BOLD);
 private static Font NODE_FONT = FontFactory.getFont(FONT, BaseFont.IDENTITY_H,15, Font.BOLD);
 private static Font BLOCK_FONT = FontFactory.getFont(FONT, BaseFont.IDENTITY_H,13, Font.BOLD, BaseColor.BLACK);
 private static Font INFO_FONT = FontFactory.getFont(FONT, BaseFont.IDENTITY_H,12, Font.NORMAL,BaseColor.BLACK);
 private static Font CONTENT_FONT = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

 private static void createPdfPage () throws Exception {
  // 创建文档
  Document document = new Document();
  PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(PDF_SITE));
  document.open();
  // 报告标题
  document.add(PdfFontUtil.getParagraph(PAGE_TITLE,TITLE_FONT,1)) ;
  document.add(PdfFontUtil.getParagraph("\n商户名称:XXX科技有限公司",INFO_FONT,-1)) ;
  document.add(PdfFontUtil.getParagraph("\n生成时间:2020-01-15\n\n",INFO_FONT,-1)) ;
  // 报告内容
  // 段落标题 + 报表图
  document.add(PdfFontUtil.getParagraph("城市数据分布统计",NODE_FONT,-1)) ;
  document.add(PdfFontUtil.getParagraph("\n· 可视化图表\n\n",BLOCK_FONT,-1)) ;
  // 设置图片宽高
  float documentWidth = document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin();
  float documentHeight = documentWidth / 580 * 320;
  document.add(PdfFontUtil.getImage("F:\\file-type\\myChart.jpg",documentWidth-80,documentHeight-80)) ;
  // 数据表格
  document.add(PdfFontUtil.getParagraph("\n· 数据详情\n\n",BLOCK_FONT,-1)) ;
  PdfPTable dataTable = PdfFontUtil.getPdfPTable01(4,400) ;
  // 设置表格
  List<String> tableHeadList = tableHead () ;
  List<List<String>> tableDataList = getTableData () ;
  PdfFontUtil.addTableCell(dataTable,CONTENT_FONT,tableHeadList);
  for (List<String> tableData : tableDataList) {
   PdfFontUtil.addTableCell(dataTable,CONTENT_FONT,tableData);
  }
  document.add(dataTable);
  document.add(PdfFontUtil.getParagraph("\n· 报表描述\n\n",BLOCK_FONT,-1)) ;
  document.add(PdfFontUtil.getParagraph("数据报告可以监控每天的推广情况," +
    "可以针对不同的数据表现进行分析,以提升推广效果。",CONTENT_FONT,-1)) ;
  document.newPage() ;
  document.close();
  writer.close();
 }
 private static List<List<String>> getTableData (){
  List<List<String>> tableDataList = new ArrayList<>() ;
  for (int i = 0 ; i < 3 ; i++){
   List<String> tableData = new ArrayList<>() ;
   tableData.add("浙江"+i) ;
   tableData.add("杭州"+i) ;
   tableData.add("276"+i) ;
   tableData.add("33.3%") ;
   tableDataList.add(tableData) ;
  }
  return tableDataList ;
 }
 private static List<String> tableHead (){
  List<String> tableHeadList = new ArrayList<>() ;
  tableHeadList.add("省份") ;
  tableHeadList.add("城市") ;
  tableHeadList.add("数量") ;
  tableHeadList.add("百分比") ;
  return tableHeadList ;
 }
 public static void main(String[] args) throws Exception {
  createPdfPage () ;
 }
}

4、页面效果

四、网页转PDF

1、页面Jar包依赖

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

2、编写页面样式

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
 <meta charset="UTF-8"/>
 <title>Title</title>
 <style>
  body{font-family:SimSun;}
 </style>
</head>
<body>
项目信息:<br/>
名称:${name}<br/>
作者:${author}<br/><br/>
<img
src="https://img2018.cnblogs.com/blog/1691717/201906/1691717-20190603213911854-1098366582.jpg"/>
<br/>
</body>
</html>

3、核心配置类

public class PageConfig {
 private static final String DEST = "F:\\file-type\\HTML页面2020-01-15.pdf";
 private static final String HTML = "/pdf_page_one.html";
 private static final String FONT = "C:/Windows/Fonts/simsun.ttc";
 private static Configuration freemarkerCfg = null ;
 static {
  freemarkerCfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
  //freemarker的模板目录
  try {
   String path = "TODO:模板路径{自定义}" ;
   freemarkerCfg.setDirectoryForTemplateLoading(new File(path));
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 /**
  * 创建文档
  */
 private static void createPdf(String content,String dest) throws Exception {
  Document document = new Document();
  PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
  document.open();
  XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
  fontImp.register(FONT);
  XMLWorkerHelper.getInstance().parseXHtml(writer, document,
    new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"), fontImp);
  document.close();
 }
 /**
  * 页面渲染
  */
 private static String freeMarkerRender(Map<String, Object> data, String htmlTmp) throws Exception {
  Writer out = new StringWriter();
  Template template = freemarkerCfg.getTemplate(htmlTmp,"UTF-8");
  template.process(data, out);
  out.flush();
  out.close();
  return out.toString();
 }
 /**
  * 方法入口
  */
 public static void main(String[] args) throws Exception {
  Map<String,Object> data = new HashMap<> ();
  data.put("name","smile");
  data.put("author","知了") ;
  String content = PageConfig.freeMarkerRender(data,HTML);
  PageConfig.createPdf(content,DEST);
 }
}

4、转换效果图

五、源代码地址

文中涉及文件类型,在该章节源码ware18-file-parent/case-file-type目录下。

GitHub·地址
https://github.com/cicadasmile/middle-ware-parent
GitEE·地址
https://gitee.com/cicadasmile/middle-ware-parent

总结

以上所述是小编给大家介绍的基于SpringBoot框架管理Excel和PDF文件类型,希望对大家有所帮助!

(0)

相关推荐

  • Springboot使用POI实现导出Excel文件示例

    前面讲述了使用POI导出Word文件和读取Excel文件,这两个例子都相对简单,接下来要讲述的使用POI导出Excel文件要复杂得多,内容也会比较长. 创建表头信息 表头信息用于自动生成表头结构及排序 public class ExcelHeader implements Comparable<ExcelHeader>{ /** * excel的标题名称 */ private String title; /** * 每一个标题的顺序 */ private int order; /** * 说对

  • Springboot上传excel并将表格数据导入或更新mySql数据库的过程

    本文主要描述,Springboot-mybatis框架下上传excel,并将之导入mysql数据库的过程,如果用户id已存在,则进行更新修改数据库中该项信息,由于用到的是前后端分离技术,这里记录的主要是后端java部分,通过与前端接口进行对接实现功能,使用layui等前端框架与之对接,也可以自己写前端代码,本文以Controller开始,从导入过程开始讲述,其中包括字典表的转换 1.在pom.xml文件中导入注解,主要利用POI <dependency> <groupId>org.

  • java springboot poi 从controller 接收不同类型excel 文件处理

    根据poi接收controller层的excel文件导入 可使用后缀名xls或xlsx格式的excel. 1.pom引入 <!-- poi 操作Excel --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <d

  • 基于SpringBoot框架管理Excel和PDF文件类型

    一.文档类型简介 1.Excel文档 Excel一款电子表格软件.直观的界面.出色的计算功能和图表工具,在系统开发中,经常用来把数据转存到Excel文件,或者Excel数据导入系统中,这就涉及数据转换问题. 2.PDF文档 PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点.PDF文件格式可以将文字.字型.格式.颜色及独立于设备和分辨率的图形图像等封装在一个文件中.该格式文件还可以包含超文本链接.声音和动态影像等电子信息,支持特长文件,集成度和安全可靠性都较高.

  • java编程之基于SpringBoot框架实现扫码登录

    目录 项目简介 实现思路 二次认证的原因 实现步骤 用户访问网页端,选择扫码登录 使用手机扫码,二维码状态改变 手机确认登录 效果演示 完整代码已上传到GitHub. Web端体验地址:http://47.116.72.33/(只剩一个月有效期) apk下载地址:https://github.com/zhangjiwei1221/qrscan/releases/tag/0.0.1. 用户名:非空即可,密码:123456,效果见文末,整体实现如有不妥之处,欢迎交流讨论 实现部分参考二维码扫码登录是

  • 如何基于PHP实现微信小程序pdf文件的预览功能

    目录 知识点 问题描述 探索过程 实现思路 最终效果 实现步骤 总结 知识点 微信小程序预览pdf文件 这都是一些实际项目的开发经验,不是东拼西凑的网上水文.如果这篇文章帮到了你,麻烦动动你发财的小手给点个赞,留下个评论. 问题描述 前段时间文库类微信小程序开发中遇到个问题,就是要在小程序中预览阿里云OSS中的pdf文件.微信官方给的方案就一个,就是把文档缓存到本地然后用资源管理器打开. 这样写问题很明显,pdf文件小的话还可以,当pdf文件很大的时候,加载速度就会很慢.而且我只是需要预览单纯的

  • SpringBoot框架如何操作Excel和PDF

    目录 一.文档类型简介 1.Excel文档 Excel一款电子表格软件.直观的界面.出色的计算功能和图表工具,在系统开发中,经常用来把数据转存到Excel文件,或者Excel数据导入系统中,这就涉及数据转换问题. 2.PDF文档 PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点.PDF文件格式可以将文字.字型.格式.颜色及独立于设备和分辨率的图形图像等封装在一个文件中.该格式文件还可以包含超文本链接.声音和动态影像等电子信息,支持特长文件,集成度和安全可靠性都较

  • 解决vue-pdf查看pdf文件及打印乱码的问题

    前言 vue中简单使用vue-pdf预览pdf文件,解决打印预览乱码问题 vue-pdf 使用 安装 npm install --save vue-pdf 引入 import pdf from "vue-pdf 自定义封装pdf预览组件 <template> <el-dialog :visible.sync="pdfDialog" :close-on-click-modal="false" :show-close="false&

  • 利用Python的Django框架生成PDF文件的教程

    便携文档格式 (PDF) 是由 Adobe 开发的格式,主要用于呈现可打印的文档,其中包含有 pixel-perfect 格式,嵌入字体以及2D矢量图像. You can think of a PDF document as the digital equivalent of a printed document; indeed, PDFs are often used in distributing documents for the purpose of printing them. 可以方

  • 基于spring-boot和docker-java实现对docker容器的动态管理和监控功能[附完整源码下载]

    docker简介 Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者喜爱.随着基于docker的开发者越来越多,docker的镜像也原来越丰富,未来各种企业级的完整解决方案都可以直接通过下载镜像拿来即用.因此docker变得越来越重要. 本文目的 本文通过一个项目实例来介绍如果通过docker对外接口来实现对docker容器的管理和监控. 应用场景: 对服务器资源池通过docker进行统一管理,按需分配资源和创建容器,达到资源最大化利

  • SpringBoot框架如何管理Xml和CSV

    目录 一.文档类型简介 1.XML文档 XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如数据结构,格式等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.适合网络传输,提供统一的方法来描述和交换应用程序的结构化数据. 2.CSV文档 CSV文档,以逗号分隔文档内容值,其文件以纯文本形式存储结构数据.CSV文件由任意数目的记录组成,记录间以某种换行符分隔:每条

  • thinkPHP5框架导出Excel文件简单操作示例

    本文实例讲述了thinkPHP5框架导出Excel文件简单操作.分享给大家供大家参考,具体如下: 1. 首先安装PHPExcel 这里用composer安装 composer require phpoffice/phpexcel 2. 在控制类引用 use PHPExcel_IOFactory; use PHPExcel; 3. 在控制其中书写导出方法 /** * 导出迟到数据 */ public function export_later() { $date = explode("-"

  • Yii2框架实现利用mpdf创建pdf文件功能示例

    本文实例讲述了Yii2框架实现利用mpdf创建pdf文件功能.分享给大家供大家参考,具体如下: 安装mPDF 使用 Composer安装 在yii2的 'composer.json' 加入"mpdf/mpdf":"*" "require": { "php": ">=5.4.0", "yiisoft/yii2": "*", "yiisoft/yii2-b

随机推荐