文件系統(01):基於SpringBoot管理Excel和PDF

一、文檔類型簡介

1、Excel文檔

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

2、PDF文檔

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

二、Excel文件管理

1、POI依賴

Apache POI是Apache軟件基金會的開源類庫,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。

<code>
<dependency>
<groupid>org.apache.poi/<groupid>
<artifactid>poi/<artifactid>
<version>3.9/<version>
/<dependency>

<dependency>
<groupid>org.apache.poi/<groupid>
<artifactid>poi-ooxml/<artifactid>
<version>3.9/<version>

/<dependency>/<code>

2、文件讀取

<code>public static List<list>> readExcel(String path) throws Exception {
File file = new File(path) ;
List<list>> 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;
}/<object>/<list>/<list>/<code>

3、文件創建

<code>public static void createExcel(String excelName, String[] headList,List<list>> 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();
}/<object>/<list>/<code>

4、文件導出

<code>public static void exportExcel(String[] headList, List<list>> 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();
}/<object>/<list>/<code>

5、文件導出接口

<code>@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>> dataList = ExcelUtil.readExcel("F:\\\\file-type\\\\\\user-excel.xlsx") ;
String[] headList = new String[]{"用戶ID", "用戶名", "手機號"} ;
ExcelUtil.exportExcel(headList,dataList,response.getOutputStream()) ;
}
}/<list>/<code>

三、PDF文件管理

1、IText依賴

iText是一種生成PDF報表的Java組件。通過在服務器端使用頁面或API封裝生成PDF報表,客戶端可以通過超鏈接直接顯示或下載到本地,在系統開發中通常用來生成比較正式的報告或者合同類的電子文檔。

<code><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>/<code>

2、API二次封裝

首先對於Itext提供的API做一下表格、段落、圖片等基礎樣式的二次封裝,可以更好的適配業務。

<code>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));
}
}
}/<string>/<code>

3、生成PDF文件

這裡基於上面的工具類,畫一個PDF頁面作為參考。

<code>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>> 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>> getTableData (){
List<list>> 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 () ;
}
}/<string>/<string>/<string>/<list>/<list>/<string>/<list>/<string>/<code>

4、頁面效果

文件系統(01):基於SpringBoot管理Excel和PDF

四、網頁轉PDF

1、頁面Jar包依賴

<code><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>/<code>

2、編寫頁面樣式

<code>



<title>Title/<title>



項目信息:

名稱:${name}

作者:${author}


class="lazy" src="//p2.ttnews.xyz/loading.gif" data-original="https://img2018.cnblogs.com/blog/1691717/201906/1691717-20190603213911854-1098366582.jpg"/>




/<code>

3、核心配置類

<code>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> 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> data = new HashMap<> ();
data.put("name","smile");
data.put("author","知了") ;
String content = PageConfig.freeMarkerRender(data,HTML);
PageConfig.createPdf(content,DEST);
}
}/<string>/<string>/<code>

4、轉換效果圖

文件系統(01):基於SpringBoot管理Excel和PDF

文件系統(01):基於SpringBoot管理Excel和PDF


分享到:


相關文章: