使用Java編寫導出不確定行數(shù)列數(shù)數(shù)據(jù)的工具類
前言
這是導出不確定行數(shù)列數(shù)數(shù)據(jù)的導出工具類,導出的文件直接在瀏覽器下載,直接全部復制使用,下面有導出的數(shù)據(jù)樣式
一、導出的文件樣式
表頭不是固定的,可以根據(jù)需求,增加表頭和與之對應的列數(shù)據(jù),詳情代碼看下面

二、工具類的入?yún)⒃斍?/h2>
這是表頭

這是具體的每一行數(shù)據(jù)

三、具體代碼(直接復制使用)
這個是業(yè)務層 使用可以copy到你的業(yè)務層方法內(nèi),然后進行修修改改。
public void export(ExportExcelDto dto, HttpServletResponse response) {
XSSFWorkbook wb = null;
try {
//假設這一是查詢數(shù)據(jù)庫拿到的數(shù)據(jù)
List<MonitorDataImportQueryVo> vos = new ArrayList<>();
if (CollectionUtils.isEmpty(vos)) return;
// 文件名根據(jù)時間戳生成
String fileName = DateUtil.currentSeconds() + ".xlsx";
// 表頭
ArrayList<String> header = Lists.newArrayList(READ_HEAD1, READ_HEAD2, READ_HEAD3, READ_HEAD4);
//時間的動態(tài)表頭
List<String> collect = vos.stream()
.map(e -> e.getMonitorTime())
.distinct()
.sorted()
.collect(Collectors.toList());
//放到表頭list后面
header.addAll(collect);
// 創(chuàng)建一個導出的數(shù)據(jù)list
List<List> dataList = Lists.newArrayList();
// 根據(jù)查詢的數(shù)據(jù)進行分組戰(zhàn)后(根據(jù)你的業(yè)務去處理)
Map<String, List<MonitorDataImportQueryVo>> map = vos.stream()
.collect(Collectors.groupingBy(e -> e.getMonitorNumber()));
// 遍歷放入導出數(shù)據(jù)list里面(根據(jù)你的業(yè)務去處理)
for (String s : keySet) {
List<MonitorDataImportQueryVo> singleData = map.get(s);
List<String> data = new ArrayList<>();
data.add(singleData.get(0).getMonitorNumber());
data.add(singleData.get(0).getMileage());
data.add(singleData.get(0).getLink());
data.add(singleData.get(0).getInitialValue());
for (String thisValue : singleData.stream()
.map(e -> e.getThisValue())
.collect(Collectors.toList())) {
data.add(thisValue);
}
dataList.add(data);
}
// 調(diào)用工具類
wb = ExportExcelUtil.getXSSFWorkbook("監(jiān)測數(shù)據(jù)", header, dataList);
ExportExcelUtil.buildExcelDocument(fileName, wb, response);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != wb) {
try {
wb.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
具體的工具類,無需修改,也可根據(jù)需求改改
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
/**
* @Description: 導出工具類
* @Param:
* @return:
* @Author: 楊永卓
* @Date: 2021/9/26 15:47
*/
public class ExportExcelUtil {
/**
* @Description: [導出不確定行數(shù)列數(shù)監(jiān)測數(shù)據(jù)]
* @Param: [sheetName:sheet頁名稱, headers:第一行表頭, data:list里面是每一行數(shù)據(jù)]
* @return: org.apache.poi.XSSf.usermodel.XSSFWorkbook
* @Author: 楊永卓
* @Date: 2021/9/26 16:11
*/
public static XSSFWorkbook getXSSFWorkbook(String sheetName, List<String> headers, List<List> dataList) {
XSSFWorkbook workbook = new XSSFWorkbook();
//新建工作區(qū)并賦名
XSSFSheet sheet = workbook.createSheet(sheetName);
XSSFRow row = sheet.createRow(0);
//設置樣式
XSSFCellStyle cellStyle = workbook.createCellStyle();
//靠左
cellStyle.setAlignment(XSSFCellStyle.ALIGN_LEFT);
//垂直居中
cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
//設置邊框
cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
//還需要設置其他樣式可在此添加
//找出最大列數(shù):對數(shù)據(jù)進行排序,獲取最長那一行的size
int max = 0;
for (List l : dataList) {
if (l.size() > max) {
max = l.size();
}
}
XSSFCell cell = null;
//設置列名
for (int i = 0; i < max; i++) {
cell = row.createCell(i);
cell.setCellValue(headers.get(i));
cell.setCellStyle(cellStyle);
}
for (int i = 0; i < dataList.size(); i++) {
row = sheet.createRow(i + 1);
//以max作判斷-->實現(xiàn)空的單元格也有邊框
for (int j = 0; j < max; j++) {
cell = row.createCell(j);
cell.setCellStyle(cellStyle);
//防止下標越界
if (j < dataList.get(i).size()) {
//單元格數(shù)據(jù)類型可自行改變,我這里全部字符串化了
cell.setCellValue(dataList.get(i).get(j).toString());
}
}
}
//列寬自適應
for (int columnNum = 0; columnNum <= max; columnNum++) {
int columnWidth = sheet.getColumnWidth(columnNum) / 256;
for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
XSSFRow currentRow;
if (sheet.getRow(rowNum) == null) {
currentRow = sheet.createRow(rowNum);
} else {
currentRow = sheet.getRow(rowNum);
}
if (currentRow.getCell(columnNum) != null) {
XSSFCell currentCell = currentRow.getCell(columnNum);
if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
int length = currentCell.getStringCellValue().getBytes().length;
if (columnWidth < length) {
columnWidth = length;
}
}
}
}
sheet.setColumnWidth(columnNum, columnWidth * 256);
}
return workbook;
}
/**
* @Description: [導出到瀏覽器]
* @Param: [fileName, wb, response]
* @return: void
*
* @Author: 楊永卓
* @Date: 2021/9/26 15:47
*/
public static void buildExcelDocument(String fileName, Workbook wb, HttpServletResponse response) {
try {
// response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
// 定義輸出類型
response.setContentType("application/octet-stream");
// 可自行定義編碼格式
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
//清除jsp編譯html文件的空白,防止excel出現(xiàn)空行
response.flushBuffer();
//寫出
wb.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
}到此這篇關于使用Java編寫導出不確定行數(shù)列數(shù)數(shù)據(jù)的工具類的文章就介紹到這了,更多相關Java導出數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mybatis-flex與springBoot整合的實現(xiàn)示例
Mybatis-flex提供了簡單易用的API,開發(fā)者只需要簡單的配置即可使用,本文主要介紹了mybatis-flex與springBoot整合,具有一定的參考價值,感興趣的可以了解一下2024-01-01
解決springboot+activemq啟動報注解錯誤的問題
這篇文章主要介紹了解決springboot+activemq啟動報注解錯誤的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
IDEA Debug啟動tomcat報60659端口占用錯誤的解決
工作中將開發(fā)工具由Eclipse轉(zhuǎn)為IntelliJ IDEA,在使用過程中遇到許多問題,其中60659端口占用錯誤對于不熟悉IDEA的開發(fā)者來說或許會比較頭痛,本文就來解決一下這個問題2018-11-11
java讀取resources文件詳解及實現(xiàn)代碼
這篇文章主要介紹了java讀取resources文件詳解及實現(xiàn)代碼的相關資料,在開發(fā)項目的時候經(jīng)常會遇到讀取文件夾里面的內(nèi)容,需要的朋友可以參考下2017-07-07
關于ApplicationContext的三個常用實現(xiàn)類
這篇文章主要介紹了關于ApplicationContext的三個常用實現(xiàn)類,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
Maven工程搭建spring boot+spring mvc+JPA的示例
本篇文章主要介紹了Maven工程搭建spring boot+spring mvc+JPA的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01

