溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot框架怎么管理Excel和PDF文件類型

發(fā)布時間:2021-09-03 16:47:42 來源:億速云 閱讀:104 作者:chen 欄目:編程語言

本篇內容介紹了“SpringBoot框架怎么管理Excel和PDF文件類型”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一、文檔類型簡介

1、Excel文檔

Excel一款電子表格軟件。直觀的界面、出色的計算功能和圖表工具,在系統(tǒng)開發(fā)中,經(jīng)常用來把數(shù)據(jù)轉存到Excel文件,或者Excel數(shù)據(jù)導入系統(tǒng)中,這就涉及數(shù)據(jù)轉換問題。

2、PDF文檔

PDF是可移植文檔格式,是一種電子文件格式,具有許多其他電子文檔格式無法相比的優(yōu)點。PDF文件格式可以將文字、字型、格式、顏色及獨立于設備和分辨率的圖形圖像等封裝在一個文件中。該格式文件還可以包含超文本鏈接、聲音和動態(tài)影像等電子信息,支持特長文件,集成度和安全可靠性都較高。

二、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); // 讀取行數(shù):不讀取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 ;   // 這里需根據(jù)實際業(yè)務情況處理   switch (cell.getCellType()) {    case XSSFCell.CELL_TYPE_NUMERIC:     //處理數(shù)值帶{.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、文件創(chuàng)建

public static void createExcel(String excelName, String[] headList,List<List<Object>> dataList)  throws Exception { // 創(chuàng)建 Excel 工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet(); // 創(chuàng)建表頭 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]); } //添加數(shù)據(jù) 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 { // 創(chuàng)建 Excel 工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet(); // 創(chuàng)建表頭 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]); } //添加數(shù)據(jù) 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、文件導出接口

@RestControllerpublic 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報表,客戶端可以通過超鏈接直接顯示或下載到本地,在系統(tǒng)開發(fā)中通常用來生成比較正式的報告或者合同類的電子文檔。

<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做一下表格、段落、圖片等基礎樣式的二次封裝,可以更好的適配業(yè)務。

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數(shù)據(jù)導出報告" ; // 基礎樣式 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 {  // 創(chuàng)建文檔  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("城市數(shù)據(jù)分布統(tǒng)計",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)) ;  // 數(shù)據(jù)表格  document.add(PdfFontUtil.getParagraph("\n· 數(shù)據(jù)詳情\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("數(shù)據(jù)報告可以監(jiān)控每天的推廣情況," +    "可以針對不同的數(shù)據(jù)表現(xiàn)進行分析,以提升推廣效果。",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("數(shù)量") ;  tableHeadList.add("百分比") ;  return tableHeadList ; } public static void main(String[] args) throws Exception {  createPdfPage () ; }}

四、網(wǎng)頁轉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();  } } /**  * 創(chuàng)建文檔  */ 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); }}

“SpringBoot框架怎么管理Excel和PDF文件類型”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI