溫馨提示×

溫馨提示×

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

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

SpringBoot框架操作Excel和PDF的方法

發(fā)布時間:2021-06-17 09:14:22 來源:億速云 閱讀:284 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要介紹“SpringBoot框架操作Excel和PDF的方法”,在日常操作中,相信很多人在SpringBoot框架操作Excel和PDF的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”SpringBoot框架操作Excel和PDF的方法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

    一、文檔類型簡介

    1、Excel文檔

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

    2、PDF文檔

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

    二、Excel文件管理

    1、POI依賴

    Apache POI是Apache軟件基金會的開源類庫,POI提供API給Java程序?qū)icrosoft 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ù)實(shí)際業(yè)務(wù)情況處理
                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、文件導(dǎo)出

    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、文件導(dǎo)出接口

    @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", "用戶名", "手機(jī)號"} ;
            ExcelUtil.exportExcel(headList,dataList,response.getOutputStream()) ;
        }
    }

    三、PDF文件管理

    1、IText依賴

    iText是一種生成PDF報表的Java組件。通過在服務(wù)器端使用頁面或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做一下表格、段落、圖片等基礎(chǔ)樣式的二次封裝,可以更好的適配業(yè)務(wù)。

    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);
            // 設(shè)置表格寬度比例為%100
            table.setWidthPercentage(100);
            // 設(shè)置寬度:寬度平均
            table.setTotalWidth(totalWidth);
            // 鎖住寬度
            table.setLockedWidth(true);
            // 設(shè)置表格上面空白寬度
            table.setSpacingBefore(10f);
            // 設(shè)置表格下面空白寬度
            table.setSpacingAfter(10f);
            // 設(shè)置表格默認(rèn)為無邊框
            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 {
        // 基礎(chǔ)配置
        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ù)導(dǎo)出報告" ;
        // 基礎(chǔ)樣式
        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();
            // 報告標(biāo)題
            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)容
            // 段落標(biāo)題 + 報表圖
            document.add(PdfFontUtil.getParagraph("城市數(shù)據(jù)分布統(tǒng)計(jì)",NODE_FONT,-1)) ;
            document.add(PdfFontUtil.getParagraph("\n· 可視化圖表\n\n",BLOCK_FONT,-1)) ;
            // 設(shè)置圖片寬高
            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) ;
            // 設(shè)置表格
            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)進(jì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、頁面效果

    SpringBoot框架操作Excel和PDF的方法

    四、網(wǎng)頁轉(zhuǎn)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>
    項(xiàng)目信息:<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、轉(zhuǎn)換效果圖

    SpringBoot框架操作Excel和PDF的方法

    五、源代碼地址

    文中涉及文件類型,在該章節(jié)源碼ware18-file-parent/case-file-type目錄下。

    GitHub·地址
    https://github.com/cicadasmile/middle-ware-parent
    GitEE·地址
    https://gitee.com/cicadasmile/middle-ware-parent

    到此,關(guān)于“SpringBoot框架操作Excel和PDF的方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

    向AI問一下細(xì)節(jié)

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

    AI