日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Spring Boot项目基于POI框架导出Excel表格

發(fā)布時(shí)間:2025/6/17 38 如意码农
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot项目基于POI框架导出Excel表格 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.    依賴

我的項(xiàng)目是基于Spring Boot的,這里只貼出POI框架需要依賴的兩個(gè)包,其他的都無所謂,只要能提供Controller讓瀏覽器訪問即可。在pom.xml配置文件中增加如下兩個(gè)包:

       <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>

2. 代碼實(shí)現(xiàn)

package com.eg.wiener.controller;

import com.eg.wiener.dto.User;
import com.eg.wiener.utils.ExcelUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream; /**
* @author Wiener
* @date 2020/9/5
*/
@Slf4j
@RestController
@RequestMapping("/excel")
public class ExcelExportController { private static HSSFWorkbook workbook = null;
// 代表一行記錄
private static HSSFCell cell = null;
private static HSSFRow row = null; @RequestMapping(value = "/exportExcel")
public Object exportExcel(HttpServletRequest request, HttpServletResponse response) throws Exception {
String fileSuffix = ".xls";
String fileName = "導(dǎo)出數(shù)據(jù)至Excel示例"+ "_" + (int) (Math.random() * 9000 + 1000) + ".xls"; //【1】創(chuàng)建excel
workbook = new HSSFWorkbook();
// 設(shè)置表頭的類型
HSSFCellStyle style = setCellStyle(workbook); // 創(chuàng)建一個(gè)sheet
HSSFSheet sheet = workbook.createSheet("sheet1"); try {
List<User> dataList = getUsers(); if (CollectionUtils.isNotEmpty(dataList)) {
//【2】 設(shè)置表頭:對(duì)Excel每列命名
String[] tableHeader = Stream.of("編號(hào)", "姓名", "年齡").toArray(String[]::new);
// 設(shè)置Excel表頭
row = ExcelUtils.getExcelRow(workbook, sheet, tableHeader);
//通過反射,獲取POJO對(duì)象。由于同一個(gè)dataList中,POJO相同,故定義在for循環(huán)外部,提高遍歷性能
Class cl = dataList.get(0).getClass();
//獲取類的所有字段
Field[] fields = cl.getDeclaredFields();
//寫入每一行的記錄
for (int i = 0; i < dataList.size(); i++) {
//創(chuàng)建新的一行,遞增
row = sheet.createRow(i + 1);
// 設(shè)置行高
row.setHeight((short) 400);
for (int j = 0; j < fields.length; j++) {
//設(shè)置字段可見,否則會(huì)報(bào)錯(cuò),禁止訪問
fields[j].setAccessible(true);
//創(chuàng)建單元格
cell = row.createCell(j);
cell.setCellValue(Objects.toString(fields[j].get(dataList.get(i)), ""));
cell.setCellStyle(style);
}
}
} else {
// 沒有查到數(shù)據(jù)提示行
row = ExcelUtils.getNotResultInfoRow(workbook, sheet, "記錄為空");
}
} catch (Exception e) {
log.error("導(dǎo)出數(shù)據(jù)失?。?, e);
// 寫入Excel失敗原因
row = ExcelUtils.getNotResultInfoRow(workbook, sheet, "導(dǎo)出數(shù)據(jù)失敗");
fileName = "導(dǎo)出數(shù)據(jù)失敗";
}
fileName = fileName + "_" + (int) (Math.random() * 9000 + 1000) + fileSuffix; //下載文件
ExcelUtils.outputExcelStream(request, response, workbook, fileName); return "導(dǎo)出成功";
} private List<User> getUsers() {
List<User> list = new ArrayList<>();
User aUser = new User();
aUser.setAge(18);
aUser.setId(1);
aUser.setName("Tony");
list.add(aUser); aUser = new User();
aUser.setAge(21);
aUser.setId(2);
aUser.setName("Tom");
list.add(aUser);
aUser = new User();
aUser.setAge(20);
aUser.setId(3);
aUser.setName("店小二");
list.add(aUser);
return list;
} private HSSFCellStyle setCellStyle(HSSFWorkbook myWorkbook) {
HSSFCellStyle style = myWorkbook.createCellStyle();
//設(shè)置自動(dòng)換行
style.setWrapText(true);
style.setAlignment(HorizontalAlignment.CENTER);
//設(shè)置邊框樣式
style.setBorderTop(BorderStyle.THIN);
style.setBorderBottom(BorderStyle.THIN);
style.setBorderLeft(BorderStyle.THIN);
style.setBorderRight(BorderStyle.THIN);
//設(shè)置邊框顏色
style.setTopBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
style.setBottomBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
style.setLeftBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
style.setRightBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); HSSFDataFormat format = workbook.createDataFormat();
// 設(shè)置文本格式
style.setDataFormat(format.getFormat("@"));
// 設(shè)置字體
HSSFFont font = workbook.createFont();
font.setColor(Font.COLOR_RED);
font.setFontName("宋體");
font.setFontHeightInPoints((short) 12);// 12號(hào)字體
style.setFont(font);
return style;
}
}

通過反射獲取POJO對(duì)象,故傳入不同類型的POJO對(duì)象的dataList就可以了。下面是依賴的一個(gè)工具類:

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder; /**
* 導(dǎo)出Excel工具類
*
* @author Wiener
* @date 2020/9/5
*/
@Slf4j
public class ExcelUtils { /**
* 設(shè)置Excel表頭
*
* @param workbook
* @param sheet
* @param tableHeader
* @return
*/
public static HSSFRow getExcelRow(HSSFWorkbook workbook, HSSFSheet sheet, String[] tableHeader) {
short cellNumber = (short) tableHeader.length;
// Excel的第一行表頭
HSSFRow row = sheet.createRow(0);
// 設(shè)置行高
row.setHeight((short) 560);
// Excel的列
HSSFCell cell = null;
HSSFFont font = workbook.createFont();
// 粗體顯示
font.setBold(Boolean.TRUE);
font.setFontHeightInPoints((short) 15);
// 設(shè)置單元格字體的顏色
font.setColor(HSSFFont.COLOR_NORMAL);
// 樣式
HSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
//設(shè)置邊框樣式
style.setBorderTop(BorderStyle.DOTTED);
style.setBorderBottom(BorderStyle.DOTTED);
style.setBorderLeft(BorderStyle.DOTTED);
style.setBorderRight(BorderStyle.DOTTED);
//設(shè)置邊框顏色
style.setTopBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
style.setBottomBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
style.setLeftBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex());
style.setRightBorderColor(HSSFColor.HSSFColorPredefined.BLACK.getIndex()); for (int k = 0; k < cellNumber; k++) {
int i = 0;
i += k;
short b = 6000;
cell = row.createCell(i); // 創(chuàng)建第0行第k列
cell.setCellValue(tableHeader[k]); // 設(shè)置第0行第k列的值
sheet.setColumnWidth(i, b); // 設(shè)置列的寬度
style.setFont(font); // 設(shè)置字體風(fēng)格
cell.setCellStyle(style);
}
return row;
} /**
* 設(shè)置Excel未獲取數(shù)據(jù)提示行
*
* @param workbook
* @param sheet
* @return
*/
public static HSSFRow getNotResultInfoRow(HSSFWorkbook workbook, HSSFSheet sheet, String message) {
// Excel的第一行表頭
HSSFRow row = sheet.createRow(0);
// Excel的列
HSSFCell cell = null;
// 設(shè)置表頭的類型
HSSFCellStyle style = workbook.createCellStyle();
//設(shè)置自動(dòng)換行
style.setWrapText(true);
style.setAlignment(HorizontalAlignment.CENTER); // 沒有查到數(shù)據(jù)
row = sheet.createRow((short) (0)); // 創(chuàng)建第j+1行
row.setHeight((short) 1000); // 設(shè)置行高
sheet.setColumnWidth(0, 10000);
cell = row.createCell(0); // 創(chuàng)建第i+1行第1列
cell.setCellValue(message);//
cell.setCellStyle(style); // 設(shè)置風(fēng)格 return row;
} /**
* 下載EXCEL,對(duì)不同瀏覽器做中文名稱兼容<br/>
* 如果不對(duì)文件名進(jìn)行編碼處理,那么有些瀏覽器無法識(shí)別下載文件
*
* @param request
* @param response
* @param workbook
* @param fileName
*/
public static void outputExcelStream(HttpServletRequest request, HttpServletResponse response, HSSFWorkbook workbook, String fileName) {
OutputStream out = null;
try {
String excelFileName = fileName + "_" + (int) (Math.random() * 9000 + 1000) + ".xls";
if (isMsBrowser(request)) {
// ie,edge 瀏覽器
excelFileName = URLEncoder.encode(excelFileName, "UTF-8");
} else {
//其他的瀏覽器
excelFileName = new String(excelFileName.getBytes("UTF-8"), "iso-8859-1");
}
//輸出流對(duì)象
out = response.getOutputStream();
// 設(shè)置文件頭編碼方式和文件名
response.setHeader("Content-Disposition", "attachment;filename=" + excelFileName);
// 設(shè)置類型
response.setContentType("application/msexcel;charset=UTF-8");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
workbook.write(out);
out.flush();
workbook.write(out);
} catch (IOException e) {
log.error("下載EXCEL失敗,", e);
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
log.error("下載EXCEL關(guān)閉文件流失敗,", e);
}
}
} //判斷是否是IE瀏覽器
private static boolean isMsBrowser(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
if (StringUtils.isBlank(userAgent)) {
return false;
}
String[] IEBrowserSignals = {"msie", "trident", "edge"};
for (String signal : IEBrowserSignals) {
if (userAgent.toLowerCase().contains(signal)) {
return true;
}
}
return false;
} }

在使用的時(shí)候,僅僅需要傳入不同的表頭集合、實(shí)體類集合,就能實(shí)現(xiàn)需求,這就是封裝的魅力所在。

總結(jié)

以上是生活随笔為你收集整理的Spring Boot项目基于POI框架导出Excel表格的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。