SpringBoot 에서 EasyExcel 은 Excel 파일 가 져 오기 내 보 내기 를 실현 합 니 다.
17795 단어 SpringBootExcel가 져 오기도 출
우리 가 일상적인 개발 과정 에서
Excel
파일 의 형식 으로 다운로드 시스템 데 이 터 를 대량으로 업로드 합 니 다.우리 가 가장 자주 사용 하 는 도 구 는 Apache poi
입 니 다.그러나 데이터 가 수백 만 에 달 할 때 메모리 가 넘 치 는 문 제 를 초래 할 수 있 습 니 다.그러면 우 리 는 어떻게 백만 데 이 터 를 대량으로 가 져 와 내 보 낼 수 있 습 니까?본문
Easyexcel
Easyexcel 은 알 리 바 바 의 오픈 소스 프로젝트 로
Excel
파일 처리 과정 을 최적화 합 니 다.Excel
비교적 유명한 프레임 워 크 는 Apache poi
,jxl
이다.그러나 그들 은 모두 심각 한 문제 가 존재 한다.바로 매우 많은 메모 리 를 소모 하 는 것 이다.poi
은 SAX
모델 의 API
이 어느 정도 에 메모리 가 넘 치 는 문 제 를 해결 할 수 있 지만 poi
은 아직도 일부 결함 이 있다.예 를 들 어 07 판 Excel
의 압축 해제 와 압축 해제 후 저장 은 모두 메모리 에서 이 루어 졌 고 메모리 소 모 는 여전히 매우 크다.poi
대 07 판 Excel
의 분석 을 다시 썼 습 니 다.원래 3M 이 었 던 excel
은 POI sax
으로 100 M 정도 의 메모리 가 필요 하고 더 큰 excel
은 메모리 가 넘 치지 않 습 니 다.SpringBoot+EasyExcel 에서 Excel 파일 가 져 오기 내 보 내기 실현
가 져 오기 의존
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
<!--easyExcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.2-beat1</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
Excel 파일 이 파괴 되 는 것 을 방지 하기 위해 pom.xml
에 다음 과 같은 내용 을 추가 합 니 다.
<build>
<plugins>
<!-- maven xls , -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
</plugins>
</build>
application.properties:프로필
#temp files
project.tmp.files.path=/Users/mac/Desktop/image/tmp/files/
SpringBoot 시작 클래스 에 임시 파일 설정 추가
@Value("${project.tmp.files.path}")
public String filesPath;
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
// xxx
factory.setLocation(filesPath);
return factory.createMultipartConfig();
}
Excel Util:Excel 도구 클래스
@Slf4j
public class ExcelUtil {
private static Sheet initSheet;
static {
initSheet = new Sheet(1, 0);
initSheet.setSheetName("sheet");
//
initSheet.setAutoWidth(Boolean.TRUE);
}
public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
workbook.write(response.getOutputStream());
} catch (IOException e) {
// throw new NormalException(e.getMessage());
}
}
/**
* 1000
*
* @param filePath
* @return
*/
public static List<Object> readLessThan1000Row(String filePath) {
return readLessThan1000RowBySheet(filePath, null);
}
/**
* 1000 ,
* filePath
* initSheet :
* sheetNo: sheet , 1
* headLineMun: , 0,
* clazz: List<Object> Object
*/
public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet) {
if (!StringUtils.hasText(filePath)) {
return null;
}
sheet = sheet != null ? sheet : initSheet;
InputStream fileStream = null;
try {
fileStream = new FileInputStream(filePath);
return EasyExcelFactory.read(fileStream, sheet);
} catch (FileNotFoundException e) {
log.info(" , :{}", filePath);
} finally {
try {
if (fileStream != null) {
fileStream.close();
}
} catch (IOException e) {
log.info("excel , :{}", e);
}
}
return null;
}
/**
* 1000
*
* @param filePath
* @return
*/
public static List<Object> readMoreThan1000Row(String filePath) {
return readMoreThan1000RowBySheet(filePath, null);
}
/**
* 1000 ,
*
* @param filePath
* @return
*/
public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet) {
if (!StringUtils.hasText(filePath)) {
return null;
}
sheet = sheet != null ? sheet : initSheet;
InputStream fileStream = null;
try {
fileStream = new FileInputStream(filePath);
ExcelListener excelListener = new ExcelListener();
EasyExcelFactory.readBySax(fileStream, sheet, excelListener);
return excelListener.getDatas();
} catch (FileNotFoundException e) {
log.error(" , :{}", filePath);
} finally {
try {
if (fileStream != null) {
fileStream.close();
}
} catch (IOException e) {
log.error("excel , :{}", e);
}
}
return null;
}
/**
* 1000 ,
*
* @return
*/
public static List<Object> readMoreThan1000RowBySheetFromInputStream(InputStream inputStream, Sheet sheet) {
sheet = sheet != null ? sheet : initSheet;
InputStream fileStream = null;
ExcelListener excelListener = new ExcelListener();
EasyExcelFactory.readBySax(inputStream, sheet, excelListener);
return excelListener.getDatas();
}
/**
* excle
*
* @param filePath
* @param data
* @param head
*/
public static void writeBySimple(String filePath, List<List<Object>> data, List<String> head) {
writeSimpleBySheet(filePath, data, head, null);
}
/**
* excle
*
* @param filePath
* @param data
* @param sheet excle
* @param head
*/
public static void writeSimpleBySheet(String filePath, List<List<Object>> data, List<String> head, Sheet sheet) {
sheet = (sheet != null) ? sheet : initSheet;
if (head != null) {
List<List<String>> list = new ArrayList<>();
head.forEach(h -> list.add(Collections.singletonList(h)));
sheet.setHead(list);
}
OutputStream outputStream = null;
ExcelWriter writer = null;
try {
outputStream = new FileOutputStream(filePath);
writer = EasyExcelFactory.getWriter(outputStream);
writer.write1(data, sheet);
} catch (FileNotFoundException e) {
log.error(" , :{}", filePath);
} finally {
try {
if (writer != null) {
writer.finish();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
log.error("excel , :{}", e);
}
}
}
/**
* excle
*
* @param filePath
* @param data
*/
public static void writeWithTemplate(String filePath, List<? extends BaseRowModel> data) {
writeWithTemplateAndSheet(filePath, data, null);
}
/**
* excle
*
* @param filePath
* @param data
* @param sheet excle
*/
public static void writeWithTemplateAndSheet(String filePath, List<? extends BaseRowModel> data, Sheet sheet) {
if (CollectionUtils.isEmpty(data)) {
return;
}
sheet = (sheet != null) ? sheet : initSheet;
sheet.setClazz(data.get(0).getClass());
OutputStream outputStream = null;
ExcelWriter writer = null;
try {
outputStream = new FileOutputStream(filePath);
writer = EasyExcelFactory.getWriter(outputStream);
writer.write(data, sheet);
} catch (FileNotFoundException e) {
log.error(" , :{}", filePath);
} finally {
try {
if (writer != null) {
writer.finish();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
log.error("excel , :{}", e);
}
}
}
/**
* Sheet excle
*
* @param filePath
* @param multipleSheelPropetys
*/
public static void writeWithMultipleSheel(String filePath, List<MultipleSheelPropety> multipleSheelPropetys) {
if (CollectionUtils.isEmpty(multipleSheelPropetys)) {
return;
}
OutputStream outputStream = null;
ExcelWriter writer = null;
try {
outputStream = new FileOutputStream(filePath);
writer = EasyExcelFactory.getWriter(outputStream);
for (MultipleSheelPropety multipleSheelPropety : multipleSheelPropetys) {
Sheet sheet = multipleSheelPropety.getSheet() != null ? multipleSheelPropety.getSheet() : initSheet;
if (!CollectionUtils.isEmpty(multipleSheelPropety.getData())) {
sheet.setClazz(multipleSheelPropety.getData().get(0).getClass());
}
writer.write(multipleSheelPropety.getData(), sheet);
}
} catch (FileNotFoundException e) {
log.error(" , :{}", filePath);
} finally {
try {
if (writer != null) {
writer.finish();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
log.error("excel , :{}", e);
}
}
}
/********************* , ******************************/
@Data
public static class MultipleSheelPropety {
private List<? extends BaseRowModel> data;
private Sheet sheet;
}
/**
* ,
* invoke() 。
* excel doAfterAllAnalysed()
*
* @author: chenmingjian
* @date: 19-4-3 14:11
*/
@Getter
@Setter
public static class ExcelListener extends AnalysisEventListener {
private List<Object> datas = new ArrayList<>();
/**
*
* object :
*/
@Override
public void invoke(Object object, AnalysisContext context) {
//
// context.getCurrentRowNum()
if (object != null) {
datas.add(object);
}
}
/**
*
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//
}
}
/************************ , ***************************/
}
CommonUtil:도구 류
public class CommonUtil {
/**
* 32 ,
*
* @return uuid
*/
public static String getUUID() {
String uuid = UUID.randomUUID().toString().trim().replaceAll("-", "");
return uuid.toUpperCase();
}
/**
* , :yyyy-MM-dd( - - )
* @return
*/
public static String getTodayStr(){
return new SimpleDateFormat("yyyy-MM-dd").format(new Date()) ;
}
/**
* json
*
* @param t
* @return
* @throws JsonProcessingException
*/
public static <T> String toJson(T t) throws JsonProcessingException {
return OBJECT_MAPPER.get().writeValueAsString(t);
}
}
UserPojoRes:실체 클래스
@Setter
@Getter
@ToString
public class UserPojoRes extends BaseRowModel implements Serializable {
private static final long serialVersionUID = -2145503717390503506L;
/**
*
*/
@ExcelProperty(value = "ID", index = 0)
private String id;
/**
*
*/
@ExcelProperty(value = " ", index = 1)
private String name;
public UserPojoRes(String id, String name) {
this.id = id;
this.name = name;
}
public UserPojoRes(){
}
}
검증 하 다.템 플 릿 다운로드
여기에 템 플 릿 파일 을
resources
에 놓 습 니 다.
@GetMapping("/exportExcelTempalte")
@ApiOperation(value = " ")
public void exportExcelTempalte(HttpServletResponse response) throws Exception {
//Resource
String filePath = "/excels/ .xlsx";
ClassPathResource classPathResource = new ClassPathResource(filePath);
Workbook workbook=WorkbookFactory.create(classPathResource.getInputStream());
ExcelUtil.downLoadExcel(" .xlsx", response, workbook);
}
Excel 파일 가 져 오기
@PostMapping("/importExcel")
@ApiOperation(value = "Excel ")
public Response importExcel(HttpServletRequest request, MultipartFile file, HttpServletResponse response) throws Exception {
List<Object> objects = ExcelUtil.readMoreThan1000RowBySheetFromInputStream(file.getInputStream(),null);
List<UserPojoRes> list = new ArrayList<>();
for (Object o : objects) {
UserPojoRes userPojoRes = new UserPojoRes();
List<String> stringList = (List<String>) o;
userPojoRes.setId(stringList.get(0) != null ? stringList.get(0).toString() : "");
userPojoRes.setName(stringList.get(1) != null ? stringList.get(0).toString() : "");
list.add(userPojoRes);
}
String json = CommonUtil.toJson(list);
return new Response(json);
}
Excel 파일 내 보 내기
@Value("${project.tmp.files.path}")
public String filesPath;
@GetMapping("/exportExcel")
@ApiOperation(value = "Excel ")
public void exportExcel(HttpServletResponse response) throws Exception {
//
String path = filesPath + CommonUtil.getUUID() + ".xlsx";
List<UserPojoRes> list = new ArrayList<>();
UserPojoRes userPojoRes = new UserPojoRes("009", " ");
UserPojoRes userPojoRes1 = new UserPojoRes("009", " ");
list.add(userPojoRes);
list.add(userPojoRes1);
ExcelUtil.writeWithTemplate(path, list);
// excel
Workbook workbook = WorkbookFactory.create(new FileInputStream(path));
String fileName = " " + CommonUtil.getTodayStr() + ".xlsx";
ExcelUtil.downLoadExcel(fileName, response, workbook);
}
SpringBoot 에서 Easy Excel 이 Excel 파일 의 가 져 오기 내 보 내기 를 실현 하 는 것 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 Excel 파일 가 져 오기 내 보 내기 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java・SpringBoot・Thymeleaf】 에러 메세지를 구현(SpringBoot 어플리케이션 실천편 3)로그인하여 사용자 목록을 표시하는 응용 프로그램을 만들고, Spring에서의 개발에 대해 공부하겠습니다 🌟 마지막 데이터 바인딩에 계속 바인딩 실패 시 오류 메시지를 구현합니다. 마지막 기사🌟 src/main/res...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.