基于SpringBoot框架管理Excel和PDF文件类型
一、文档类型简介
1、Excel文档
Excel一款电子表格软件。直观的界面、出色的计算功能和图表工具,在系统开发中,经常用来把数据转存到Excel文件,或者Excel数据导入系统中,这就涉及数据转换问题。
2、PDF文档
PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点。PDF文件格式可以将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。该格式文件还可以包含超文本链接、声音和动态影像等电子信息,支持特长文件,集成度和安全可靠性都较高。
二、Excel文件管理
1、POI依赖
ApachePOI是Apache软件基金会的开源类库,POI提供API给Java程序对MicrosoftOffice格式档案读和写的功能。
org.apache.poi poi 3.9 org.apache.poi poi-ooxml 3.9
2、文件读取
publicstaticList>readExcel(Stringpath)throwsException{ Filefile=newFile(path); List
>list=newLinkedList<>(); XSSFWorkbookxwb=newXSSFWorkbook(newFileInputStream(file)); //读取Sheet1表格内容 XSSFSheetsheet=xwb.getSheetAt(0); //读取行数:不读取Excel表头 for(inti=(sheet.getFirstRowNum()+1);i<=(sheet.getPhysicalNumberOfRows()-1);i++){ XSSFRowrow=sheet.getRow(i); if(row==null){continue;} List
3、文件创建
publicstaticvoidcreateExcel(StringexcelName,String[]headList,List>dataList) throwsException{ //创建Excel工作簿 XSSFWorkbookworkbook=newXSSFWorkbook(); XSSFSheetsheet=workbook.createSheet(); //创建表头 XSSFRowrow=sheet.createRow(0); for(inti=0;i
data=dataList.get(line); for(intj=0;j 4、文件导出
publicstaticvoidexportExcel(String[]headList,List>dataList, OutputStreamoutputStream)throwsException{ //创建Excel工作簿 XSSFWorkbookworkbook=newXSSFWorkbook(); XSSFSheetsheet=workbook.createSheet(); //创建表头 XSSFRowrow=sheet.createRow(0); for(inti=0;i
data=dataList.get(line); for(intj=0;j 5、文件导出接口
@RestController publicclassExcelWeb{ @RequestMapping("/web/outExcel") publicvoidoutExcel(HttpServletResponseresponse)throwsException{ StringexportName="2020-01-user-data"; response.setContentType("application/vnd.ms-excel"); response.addHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(exportName,"UTF-8")+".xlsx"); List>dataList=ExcelUtil.readExcel("F:\\file-type\\user-excel.xlsx"); String[]headList=newString[]{"用户ID","用户名","手机号"}; ExcelUtil.exportExcel(headList,dataList,response.getOutputStream()); } }
三、PDF文件管理
1、IText依赖
iText是一种生成PDF报表的Java组件。通过在服务器端使用页面或API封装生成PDF报表,客户端可以通过超链接直接显示或下载到本地,在系统开发中通常用来生成比较正式的报告或者合同类的电子文档。
com.itextpdf itextpdf 5.5.11 com.itextpdf.tool xmlworker 5.5.11 2、API二次封装
首先对于Itext提供的API做一下表格、段落、图片等基础样式的二次封装,可以更好的适配业务。
publicclassPdfFontUtil{ privatePdfFontUtil(){} /** *段落样式获取 */ publicstaticParagraphgetParagraph(Stringcontent,Fontfont,Integeralignment){ Paragraphparagraph=newParagraph(content,font); if(alignment!=null&&alignment>=0){ paragraph.setAlignment(alignment); } returnparagraph; } /** *图片样式 */ publicstaticImagegetImage(StringimgPath,floatwidth,floatheight)throwsException{ Imageimage=Image.getInstance(imgPath); image.setAlignment(Image.MIDDLE); if(width>0&&height>0){ image.scaleAbsolute(width,height); } returnimage; } /** *表格生成 */ publicstaticPdfPTablegetPdfPTable01(intnumColumns,floattotalWidth)throwsException{ //表格处理 PdfPTabletable=newPdfPTable(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); returntable; } /** *表格内容 */ publicstaticPdfPCellgetPdfPCell(Phrasephrase){ returnnewPdfPCell(phrase); } /** *表格内容带样式 */ publicstaticvoidaddTableCell(PdfPTabledataTable,Fontfont,ListcellList){ for(Stringcontent:cellList){ dataTable.addCell(getParagraph(content,font,-1)); } } } 3、生成PDF文件
这里基于上面的工具类,画一个PDF页面作为参考。
publicclassPdfPage01{ //基础配置 privatestaticStringPDF_SITE="F:\\file-type\\PDF页面2020-01-15.pdf"; privatestaticStringFONT="C:/Windows/Fonts/simhei.ttf"; privatestaticStringPAGE_TITLE="PDF数据导出报告"; //基础样式 privatestaticFontTITLE_FONT=FontFactory.getFont(FONT,BaseFont.IDENTITY_H,20,Font.BOLD); privatestaticFontNODE_FONT=FontFactory.getFont(FONT,BaseFont.IDENTITY_H,15,Font.BOLD); privatestaticFontBLOCK_FONT=FontFactory.getFont(FONT,BaseFont.IDENTITY_H,13,Font.BOLD,BaseColor.BLACK); privatestaticFontINFO_FONT=FontFactory.getFont(FONT,BaseFont.IDENTITY_H,12,Font.NORMAL,BaseColor.BLACK); privatestaticFontCONTENT_FONT=FontFactory.getFont(FONT,BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED); privatestaticvoidcreatePdfPage()throwsException{ //创建文档 Documentdocument=newDocument(); PdfWriterwriter=PdfWriter.getInstance(document,newFileOutputStream(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)); //设置图片宽高 floatdocumentWidth=document.getPageSize().getWidth()-document.leftMargin()-document.rightMargin(); floatdocumentHeight=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)); PdfPTabledataTable=PdfFontUtil.getPdfPTable01(4,400); //设置表格 ListtableHeadList=tableHead(); List >tableDataList=getTableData(); PdfFontUtil.addTableCell(dataTable,CONTENT_FONT,tableHeadList); for(List
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(); } privatestaticList >getTableData(){ List
>tableDataList=newArrayList<>(); for(inti=0;i<3;i++){ List
tableData=newArrayList<>(); tableData.add("浙江"+i); tableData.add("杭州"+i); tableData.add("276"+i); tableData.add("33.3%"); tableDataList.add(tableData); } returntableDataList; } privatestaticList tableHead(){ List tableHeadList=newArrayList<>(); tableHeadList.add("省份"); tableHeadList.add("城市"); tableHeadList.add("数量"); tableHeadList.add("百分比"); returntableHeadList; } publicstaticvoidmain(String[]args)throwsException{ createPdfPage(); } } 4、页面效果
四、网页转PDF
1、页面Jar包依赖
org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-freemarker 2、编写页面样式
Title 项目信息:
名称:${name}
作者:${author}