最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot框架如何操作Excel和PDF

 更新時間:2021年06月16日 17:30:13   作者:知了一笑  
Excel和PDF都是常見的辦公文件類型,在實際需求中有著較多的應用,excel經(jīng)常用來處理數(shù)據(jù),PDF文件格式可以將文字、字型、格式、顏色及獨立于設備和分辨率的圖形圖像等封裝在一個文件中,本文就講述下SpringBoot框架如何操作這兩種類型的文件

一、文檔類型簡介

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 表格內(nèi)容
    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、文件導出接口

@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報表,客戶端可以通過超鏈接直接顯示或下載到本地,在系統(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 ;
    }
    /**
     * 表格內(nèi)容
     */
    public static PdfPCell getPdfPCell (Phrase phrase){
        return new PdfPCell (phrase) ;
    }
    /**
     * 表格內(nèi)容帶樣式
     */
    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)) ;
        // 報告內(nèi)容
        // 段落標題 + 報表圖
        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 () ;
    }
}

4、頁面效果

四、網(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);
    }
}

4、轉換效果圖

五、源代碼地址

文中涉及文件類型,在該章節(jié)源碼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的詳細內(nèi)容,更多關于SpringBoot 管理Excel和PDF的資料請關注腳本之家其它相關文章!

相關文章

  • JAVA中DIFF算法實現(xiàn)

    JAVA中DIFF算法實現(xiàn)

    本文主要介紹了JAVA中DIFF算法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Spring 父類變量注入失敗的解決

    Spring 父類變量注入失敗的解決

    這篇文章主要介紹了Spring 父類變量注入失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Boot實現(xiàn)動態(tài)更新任務的方法

    Spring Boot實現(xiàn)動態(tài)更新任務的方法

    這篇文章主要介紹了Spring Boot實現(xiàn)動態(tài)更新任務的方法,文中給出了詳細的示例代碼供大家參考學習,對大家學習使用Spring Boot動態(tài)更新任務具有一定的參考價值,需要的朋友們來一起看看吧。
    2017-04-04
  • RabbitMQ中的Channel和Exchange詳解

    RabbitMQ中的Channel和Exchange詳解

    這篇文章主要介紹了RabbitMQ中的Channel和Exchange詳解,創(chuàng)建和銷毀TCP連接很耗時,打開太多TCP連接,耗操作系統(tǒng)資源,并發(fā)量大到一定程度,系統(tǒng)的吞吐量會降低,使用一個connection多channel的方式,可以提升連接的利用率,需要的朋友可以參考下
    2023-08-08
  • Java動態(tài)腳本Groovy獲取Bean技巧

    Java動態(tài)腳本Groovy獲取Bean技巧

    這篇文章主要給大家分享的是Java動態(tài)腳本Groovy獲取Bean技巧,在Java代碼中當我們需要一個Bean對象,通常會使用spring中@Autowired注解,用來自動裝配對象。下面我們一起進入文章學習個表格多 詳細內(nèi)容吧

    2021-12-12
  • JAVA設計模式之解釋器模式詳解

    JAVA設計模式之解釋器模式詳解

    這篇文章主要介紹了JAVA設計模式之解釋器模式詳解,解釋器模式是類的行為模式,給定一個語言之后,解釋器模式可以定義出其文法的一種表示,并同時提供一個解釋器,需要的朋友可以參考下
    2015-04-04
  • 因不會遠程debug調(diào)試我被項目經(jīng)理嘲笑了

    因不會遠程debug調(diào)試我被項目經(jīng)理嘲笑了

    這篇文章主要介紹了遠程debug調(diào)試的相關內(nèi)容,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • java處理解析帶有反斜杠的json

    java處理解析帶有反斜杠的json

    在Java中操作JSON數(shù)據(jù)是一項常見的任務,其中一個常見的問題是如何在JSON字符串中包含反斜杠,本文主要介紹了java處理解析帶有反斜杠的json,感興趣的可以了解一下
    2024-01-01
  • RestTemplate在Spring或非Spring環(huán)境下使用精講

    RestTemplate在Spring或非Spring環(huán)境下使用精講

    這篇文章主要為大家介紹了RestTemplate在Spring或非Spring環(huán)境下使用精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • 使用Autowired為什么會被IDEA警告最佳修改方法

    使用Autowired為什么會被IDEA警告最佳修改方法

    這篇文章主要介紹了使用Autowired為什么會被IDEA警告,應該怎么修改最佳,除了使用@Autowired以外,我們其實也有幾種好用的方式,使用@Resource替代@Autiwired方法是其中一種,只需要改變一個注解,這里就不展示了,需要的朋友可以參考下
    2023-02-02

最新評論

贵溪市| 宜宾市| 峨边| 南乐县| 谷城县| 南平市| 通渭县| 荥阳市| 克山县| 富蕴县| 楚雄市| 海宁市| 鹿泉市| 晴隆县| 彭泽县| 虹口区| 苗栗县| 慈利县| 乌拉特中旗| 白银市| 双桥区| 鄂伦春自治旗| 扶沟县| 屏边| 应用必备| 三亚市| 昭苏县| 五原县| 综艺| 渑池县| 南召县| 芮城县| 台湾省| 金沙县| 汶上县| 宁晋县| 陵川县| 徐州市| 青浦区| 民乐县| 延庆县|