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