本文源码:GitHub·点这里 || GitEE·点这里

一、文档类型简介

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

推荐往期阅读:

微服务架构专题

1、项目技术选型简介,架构图解说明

2、业务架构设计,系统分层管理

3、数据库选型简介,业务数据规划设计

4、中间件集成,公共服务封装

5、SpringCloud 基础组件应用设计

6、通过业务、应用、技术、存储方面,聊聊架构

文件系统(01):基于SpringBoot框架,管理Excel和PDF文件类型的更多相关文章

  1. Office系列---将Office文件(Word、PPT、Excel)转换为PDF文件,提取Office文件(Word、PPT)中的所有图片

    将Office文件转换为PDF文件,提取Office文件中的所有图片 1.Office系列---将Office文件(Word.PPT.Excel)转换为PDF文件 1.1 基于Office实现的解决方 ...

  2. C#中 Excel和其他文件类型的Content-Type/mime-type

    C#中 Excel和其他文件类型的Content-Type/mime-type For BIFF .xls files application/vnd.ms-excel For Excel2007 a ...

  3. 【.Net 学习系列】-- 利用Aspose转换Excel为PDF文件

    功能: 从数据库中查询出数据 利用Aspose.cell + Excel模板绑定数据源生成Excel文件 通过Aspose.pdf + 生成好的Excel生成PDF文件 实现: 查询数据,根据Exce ...

  4. java操作Excel、PDF文件

    java操作Excel.PDF文件 分享者:Vashon 分享来源:CSDN博客 下面这些是在开发中用到的一些东西,有的代码贴的不是完整的,只是贴出了关于操作EXCEL的代码: jxl是一个*国人写的 ...

  5. 文件系统(02):基于SpringBoot框架,管理Xml和CSV文件类型

    本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.XML文档 XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.标记指计算机所能理解的信息符号,通过 ...

  6. 如何用SpringBoot框架来接收multipart/form-data文件

    https://blog.csdn.net/linzhiqiang0316/article/details/77016997 ************************************* ...

  7. Springboot 上传excel并解析文件内容

    最近在做一个物业的系统,需要通过excel上传业主的信息,解析并入库. 参考:https://www.cnblogs.com/jyyjava/p/8074322.html 话不多说,直接上核心代码 i ...

  8. Office系列(1)---将Office文件(Word、PPT、Excel)转换为PDF文件

    需求: 将Office文件作为文章并在网页上预览,主要为(Word.PPT.Excel)3种类型文件. 研究了一下,找到了两种解决方案 直接调用微软的在线预览功能实现(预览前提:预览资源必须可以直接通 ...

  9. 利用java实现excel转pdf文件

    在有些需求当中我们需要抓取字段并且填充到excel表格里面,最后将excel表格转换成pdf格式进行输出,我第一次接触这个需求时,碰到几个比较棘手的问题,现在一一列出并且提供解决方案. 1:excel ...

随机推荐

  1. 洛谷$P4318$ 完全平方数 容斥+二分

    正解:容斥/杜教筛+二分 解题报告: 传送门$QwQ$ 首先一看这数据范围显然是考虑二分这个数然后$check$就计算小于等于它的不是讨厌数的个数嘛. 于是考虑怎么算讨厌数的个数? 看到这个讨厌数说, ...

  2. C++简单项目--贪吃蛇

    在800*600的地图上,蛇的初始长度为3节,用数组记录每一节的位置(每个正方形左上角的坐标),每一节为长度为10的正方形,初始方向向右.随机生成30个障碍物的的位置,随机生成食物的位置.吃到食物之后 ...

  3. Echarts大数据可视化物流航向省份流向迁徙动态图,开发全解+完美参数注释

    最近在研究Echarts的相关案例,毕竟现在大数据比较流行,比较了D3.js.superset等相关的图表插件,还是觉得echarts更简单上手些. 本文是以原生JS为基础,如果使用Vue.js的话, ...

  4. 大量SQL的解决方案——sdmap

    大量SQL的解决方案--sdmap 最近看到群里面经常讨论大型应用中SQL的管理办法,有人说用EF/EF Core,但很多人不信任它生成SQL的语句:有人说用Dapper,但将SQL写到代码中有些人觉 ...

  5. html 鼠标指针讲解

    html 鼠标指针 详情可以看https://www.w3school.com.cn/tiy/t.asp?f=csse_cursor 测试代码: <html> <body> & ...

  6. MySQL 基础 SQL 操作

    MySQL 用户 --登录 mysql -u<用户名> -p[密码] --修改密码 mysqladmin -u<用户名> -p[密码] password <new_pas ...

  7. 关于Element对话框组件Dialog在使用时的一些问题及解决办法

    Element对话框组件Dialog在我们的实际项目开发中可以说是一个使用频率较高的组件,它能为我们展示提示的功能,如:业务模块提交前展示我们曾经输入或选择过的业务信息,或者展示列表信息中某项业务的具 ...

  8. TensorFlow——tensorflow编程基础

    0.tensorflow中的模型运行基础 tensorflow的运行机制属于定义和运行相分离,在操作层面可以抽象成两种:模型构建和模型运行. 在模型构建中的常见概念: 张量(tensor):数据,即某 ...

  9. 图解kubernetes调度器ScheduleAlgorithm核心实现学习框架设计

    ScheduleAlgorithm是一个接口负责为pod选择一个合适的node节点,本节主要解析如何实现一个可扩展.可配置的通用算法框架来实现通用调度,如何进行算法的统一注册和构建,如何进行metad ...

  10. python方法的重写

    方法的重写: 在子类中重写定义一个父类拥有的方法, 调用时使用子类中重写定义的方法. 效果图: 代码: class Animal: def run(self): print('动物会跑~~~') de ...