Java后端導出Excel


1、技術概述,描述這個技術是做什么?學習該技術的原因,技術的難點在哪里。

1.1技術概述

使用Apache POI實現JAVA后端導出Excel文件。

1.2原因

學習該技術主要是因為,我負責的部分要完成Java后端導出Excel文件到前端,為完成此功能而學習。

1.3難點

我認為該技術的難點在於Apache POI的引用jar包的導入和Excel導出文件格式的設計。

2、技術詳述

2.1Apache POI的下載和導入

首先下載poi-3.6-20091214.jar,下載地址如下:https://download.csdn.net/detail/evangel_z/3895051

或者使用Maven倉庫管理,在pom文件添加坐標

<!--poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.1</version>
        </dependency>

2.2依賴包

commons-io-2.4.jar
poi-4.0.1.jar

2.3Excel生成工具類代碼

package com.example.team.util;

import com.example.team.util.DataVo;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ExcelWriter {
    private static List<String> CELL_HEADS; //列頭

    static {
        // 類裝載時就載入指定好的列頭信息,如有需要,可以考慮做成動態生成的列頭
        // 這里是我個人使用的類的名稱,可以進行修改
        CELL_HEADS = new ArrayList<>();
        CELL_HEADS.add("用戶名");
        CELL_HEADS.add("待辦集");
        CELL_HEADS.add("待辦");
        CELL_HEADS.add("待辦完成情況");
        CELL_HEADS.add("待辦集完成情況");
    }

    /**
     * 生成Excel並寫入數據信息
     *
     * @param dataList 數據列表
     * @return 寫入數據后的工作簿對象
     */
    public static HSSFWorkbook exportData(List<DataVo> dataList) {
        // 生成xlsx的Excel
        HSSFWorkbook workbook = new HSSFWorkbook();

        // 如需生成xls的Excel,請使用下面的工作簿對象,注意后續輸出時文件后綴名也需更改為xls
        //Workbook workbook = new HSSFWorkbook();

        // 生成Sheet表,寫入第一行的列頭
        Sheet sheet = buildDataSheet(workbook);
        //構建每行的數據內容
        int rowNum = 1;
        for (Iterator<DataVo> it = dataList.iterator(); it.hasNext(); ) {
            DataVo data = it.next();
            if (data == null) {
                continue;
            }
            //輸出行數據
            Row row = sheet.createRow(rowNum++);
            convertDataToRow(data, row);
        }
        return workbook;
    }

    /**
     * 生成sheet表,並寫入第一行數據(列頭)
     *
     * @param workbook 工作簿對象
     * @return 已經寫入列頭的Sheet
     */
    private static Sheet buildDataSheet(Workbook workbook) {
        Sheet sheet = workbook.createSheet();
        // 設置列頭寬度
        for (int i = 0; i < CELL_HEADS.size(); i++) {
            sheet.setColumnWidth(i, 4000);
        }
        // 設置默認行高
        sheet.setDefaultRowHeight((short) 400);
        // 構建頭單元格樣式
        CellStyle cellStyle = buildHeadCellStyle(sheet.getWorkbook());
        // 寫入第一行各列的數據
        Row head = sheet.createRow(0);
        for (int i = 0; i < CELL_HEADS.size(); i++) {
            Cell cell = head.createCell(i);
            cell.setCellValue(CELL_HEADS.get(i));
            cell.setCellStyle(cellStyle);
        }
        return sheet;
    }

    /**
     * 設置第一行列頭的樣式
     *
     * @param workbook 工作簿對象
     * @return 單元格樣式對象
     */
    private static CellStyle buildHeadCellStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        //對齊方式設置
        style.setAlignment(HorizontalAlignment.CENTER);
        //邊框顏色和寬度設置
        style.setBorderBottom(BorderStyle.THIN);
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下邊框
        style.setBorderLeft(BorderStyle.THIN);
        style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左邊框
        style.setBorderRight(BorderStyle.THIN);
        style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右邊框
        style.setBorderTop(BorderStyle.THIN);
        style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上邊框
        //設置背景顏色
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //粗體字設置
        Font font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);
        return style;
    }

    /**
     * 將數據轉換成行
     *
     * @param data 源數據
     * @param row  行對象
     * @return
     */
    private static void convertDataToRow(DataVo data, Row row) {
        int cellNum = 0;
        Cell cell;
        // 用戶名
        cell = row.createCell(cellNum++);
        if (null != data.getUserName()) {
            cell.setCellValue(data.getUserName());
        } else {
            cell.setCellValue("");
        }
        // 待辦集名
        cell = row.createCell(cellNum++);
        if (null != data.getSName()) {
            cell.setCellValue(data.getSName());
        } else {
            cell.setCellValue("");
        }
        // 待辦名
        cell = row.createCell(cellNum++);
        cell.setCellValue(null == data.getName() ? "" : data.getName());
        // 待辦情況記錄(0未完成,1完成)
        cell = row.createCell(cellNum++);
        if (null != data.getRecord()) {
            cell.setCellValue(data.getRecord());
        } else {
            cell.setCellValue("");
        }
        // 待辦集情況記錄(0未完成,1完成)
        cell = row.createCell(cellNum++);
        if (null != data.getSetRecord()) {
            cell.setCellValue(data.getSetRecord());
        } else {
            cell.setCellValue("");
        }
    }
}

dataVo類

package com.example.team.util;

/**
 * 讀取Excel時,封裝讀取的每一行的數據
 */
public class DataVo {
    /**
     * 用戶名
     */
    private String userName;

    /**
     * 待辦名
     */
    private String name;

    /**
     * 待辦集名
     */
    private String sName;

    /**
     * 待辦情況記錄
     */
    private String record;

    /**
     * 待辦情況記錄
     */
    private String setRecord;

    /**
     * 待辦完成度
     */
    private String completion;

    public String getUserName() { return userName; }

    public void setUserName(String userName) { this.userName = userName; }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSName() {
        return sName;
    }

    public void setSName(String sName) {
        this.sName = sName;
    }

    public String getRecord() {
        return record;
    }

    public void setRecord(String record) {
        this.record = record;
    }

    public String getSetRecord() {
        return setRecord;
    }

    public void setSetRecord(String setRecord) {
        this.setRecord = setRecord;
    }

    public String getCompletion(){
        return completion;
    }

    public void setCompletion(String completion){
        this.completion = completion;
    }

}

3、技術使用中遇到的問題和解決過程。

1.在技術使用過程中,因為我下載的是較新版本的Apache POI的jar包,導致我從網上找到的工具類和版本不匹配,這導致我需要按這我的版本去修改這個工具類,這樣才可以使用。
2.在第一次寫好后,使用時發現,excel導出只能導出到本地的文件夾里,不可以進行傳輸,后面有上網去查找資料,將其改成了HSSFWorkbook的,傳遞的是數據流,這樣就可以將后端的excel打包傳到異地的前端。

4、進行總結。

之前沒有進行過后端的Excel生成,起初的時候感覺挺難的,但是當我看了網上的其他人寫的解析以后,對於Java后端導出Excel有了概念,並且借助於網上熱心網友提供的工具類,讓我可以更好的借鑒和應用。現在,我將這些東西進行一個總結,在這謝謝那些大佬們的幫助。

5、列出參考文獻、參考博客

我的博客中內容較少,如要更詳細的,可以看以下的博客
Java導出Excel(Poi詳解)——養只狗名叫貓
JAVA實現創建Excel表並導出——D_shine
JAVA實現文件導出Excel——迷你熊愛你


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM