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