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——迷你熊爱你

原文地址:https://www.cnblogs.com/wgfp/p/13183826.html