feat: 导出
This commit is contained in:
@@ -19,12 +19,18 @@ import cn.hutool.core.io.IoUtil;
|
|||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.poi.excel.BigExcelWriter;
|
import cn.hutool.poi.excel.BigExcelWriter;
|
||||||
import cn.hutool.poi.excel.ExcelUtil;
|
import cn.hutool.poi.excel.ExcelUtil;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import org.apache.poi.ss.usermodel.Cell;
|
||||||
|
import org.apache.poi.ss.usermodel.Row;
|
||||||
|
import org.apache.poi.ss.usermodel.Sheet;
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
import org.apache.poi.xssf.streaming.SXSSFSheet;
|
import org.apache.poi.xssf.streaming.SXSSFSheet;
|
||||||
|
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
|
||||||
import org.nl.common.exception.BadRequestException;
|
import org.nl.common.exception.BadRequestException;
|
||||||
import org.nl.config.language.LangProcess;
|
import org.nl.config.language.LangProcess;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import javax.servlet.ServletOutputStream;
|
import javax.servlet.ServletOutputStream;
|
||||||
@@ -34,9 +40,7 @@ import java.io.*;
|
|||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* File工具类,扩展 hutool 工具包
|
* File工具类,扩展 hutool 工具包
|
||||||
@@ -45,6 +49,7 @@ import java.util.Map;
|
|||||||
* @date 2018-12-27
|
* @date 2018-12-27
|
||||||
*/
|
*/
|
||||||
public class FileUtil extends cn.hutool.core.io.FileUtil {
|
public class FileUtil extends cn.hutool.core.io.FileUtil {
|
||||||
|
private static final Integer BATCH_WRITE_EXCEL_ROW_AMOUNT = 500;
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(FileUtil.class);
|
private static final Logger log = LoggerFactory.getLogger(FileUtil.class);
|
||||||
|
|
||||||
@@ -227,6 +232,86 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
|
|||||||
IoUtil.close(out);
|
IoUtil.close(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 流导出
|
||||||
|
* @param list
|
||||||
|
* @param response
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public void downloadExcelIO(List<Map<String, String>> list, String[] columnExcelNameArr, HttpServletResponse response) {
|
||||||
|
List<Map<String, String>> lastRestDataList = list;
|
||||||
|
int blockNum = 0;
|
||||||
|
List<String> allFileLocations = new ArrayList<>();
|
||||||
|
ServletOutputStream out = null;
|
||||||
|
try {
|
||||||
|
boolean allFinish = false;
|
||||||
|
while (!allFinish) {
|
||||||
|
int thisFileRowNumber = 1;
|
||||||
|
SXSSFWorkbook wb = null;
|
||||||
|
try {
|
||||||
|
// 流式写入EXCEL,只保留少数行(比如50行)数据在内存,防止内存溢出
|
||||||
|
wb = new SXSSFWorkbook(BATCH_WRITE_EXCEL_ROW_AMOUNT);
|
||||||
|
Sheet sh = wb.createSheet();
|
||||||
|
Row titleRow = sh.createRow(0);
|
||||||
|
for (int cellNum = 0; cellNum < columnExcelNameArr.length; cellNum++) {
|
||||||
|
Cell cell = titleRow.createCell(cellNum);
|
||||||
|
cell.setCellValue(columnExcelNameArr[cellNum]);
|
||||||
|
}
|
||||||
|
if (!CollectionUtils.isEmpty(lastRestDataList)) {
|
||||||
|
for (int i = 0; i < lastRestDataList.size(); i++) {
|
||||||
|
Row dataRow = sh.createRow(thisFileRowNumber);
|
||||||
|
Map<String, String> columnMap = lastRestDataList.get(i);
|
||||||
|
for (int cellNum = 0; cellNum < columnExcelNameArr.length; cellNum++) {
|
||||||
|
Cell cell = dataRow.createCell(cellNum);
|
||||||
|
String valueStr = columnMap.get(columnExcelNameArr[cellNum]);
|
||||||
|
cell.setCellValue(valueStr);
|
||||||
|
}
|
||||||
|
thisFileRowNumber++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String localFilePath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + blockNum + ".xlsx";
|
||||||
|
allFileLocations.add(localFilePath);
|
||||||
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
|
||||||
|
response.setHeader("Content-Disposition", "attachment;filename=" + localFilePath);
|
||||||
|
out = response.getOutputStream();
|
||||||
|
wb.write(out);
|
||||||
|
// 必须清理流式写入Excel生成的临时文件
|
||||||
|
wb.dispose();
|
||||||
|
allFinish = true;
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.warn(ex.getMessage());
|
||||||
|
throw new BadRequestException(ex.getMessage());
|
||||||
|
} finally {
|
||||||
|
if (out != null) {
|
||||||
|
try {
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.warn(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (wb != null) {
|
||||||
|
try {
|
||||||
|
wb.dispose();
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warn(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (out != null) {
|
||||||
|
try {
|
||||||
|
out.flush();
|
||||||
|
out.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.warn(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static String getFileType(String type) {
|
public static String getFileType(String type) {
|
||||||
String documents = "txt doc pdf ppt pps xlsx xls docx";
|
String documents = "txt doc pdf ppt pps xlsx xls docx";
|
||||||
String music = "mp3 wav wma mpa ram ra aac aif m4a";
|
String music = "mp3 wav wma mpa ram ra aac aif m4a";
|
||||||
@@ -343,5 +428,4 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
|
|||||||
public static String getMd5(File file) {
|
public static String getMd5(File file) {
|
||||||
return getMd5(getByte(file));
|
return getMd5(getByte(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user