[EasyExcel] EasyExcel의 우아한 조작 Excel을 어떻게 활용하는지 백그라운드 개발
37964 단어 개발 도구
기사 목록
인용문
Easy Excel은 현재 성능이 가장 좋은 Excel 내보내기 도구입니다. 이 소협은 백그라운드 개발에서 Easy Excel을 우아하게 사용할 수 있도록 안내합니다.
우아한 Excel 읽기
백그라운드 인터페이스 읽기 문서는 일반적으로 MultipartFile 형식을 사용하며, 이 형식을 통해 InputStream 흐름을 구성할 수 있습니다.Easy Excel을 이용하여 Excel을 읽으려면 먼저 감청기를 만들어야 합니다. 훈남 루피는 이미 당신들을 도와 준비를 했습니다.
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
/**
* @author Carson
* @date 2020/6/4 21:26
*/
public class ExcelReaderListener<T> extends AnalysisEventListener<T> {
/**
*
*/
private List<T> list = new ArrayList<>(1 << 6);
/**
* spring, 。 Listener spring
*/
public ExcelReaderListener() {
}
/**
*
*
* @param data
* @param context Excel
*/
@Override
public void invoke(T data, AnalysisContext context) {
System.out.printf(" :{%s}", JSON.toJSONString(data));
System.out.println();
list.add(data);
}
/**
*
*
* @param context Excel
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}
모니터를 만들면 Excel을 읽기 위한 도구 클래스를 수동으로 작성해야 합니다. 소협은 다음과 같은 두 가지 읽기 방식을 준비했습니다.
import com.alibaba.excel.EasyExcel;
import java.io.InputStream;
import java.util.List;
/**
* @author Carson
* @date 2020/6/4 21:31
*/
public class ExcelReaderUtil<T> {
private Class<T> clazz;
public ExcelReaderUtil(Class<T> clazz) {
this.clazz = clazz;
}
public List<T> readByStream(InputStream inputStream) {
ExcelReaderListener<T> readerListener = new ExcelReaderListener<>();
EasyExcel.read(inputStream, clazz, readerListener).sheet().doRead();
return readerListener.getList();
}
public List<T> readByPath(String fileName) {
ExcelReaderListener<T> readerListener = new ExcelReaderListener<>();
EasyExcel.read(fileName, clazz, readerListener).sheet().doRead();
return readerListener.getList();
}
}
비고: 소협 이곳의 코드는 모두 범용적이어서 자세히 보기 싫은 것은 직접 복사해서 사용할 수 있다.
기본 읽기 도구 클래스가 완성되었습니다. 그 다음은 템플릿 클래스의 생성입니다. 템플릿 클래스는 무엇입니까? 각 Excel 헤더에 따라 다른 매개 변수가 표시된 클래스입니다. 매개 변수는 @Excel Property 주석으로 수식되고 주석의 괄호 안의 내용은 Excel 헤더입니다.
@Data
public class GoodsReaderModel {
@ExcelProperty(" SKU")
public Long skuId;
@ExcelProperty(" ")
public String startTime;
@ExcelProperty(" ")
public String finishTime;
}
인터페이스에서 읽기:
@RequestMapping(value = "/import", method = RequestMethod.POST, produces = {"application/json;charset=UTF-8"})
@ApiOperation(value = " ", httpMethod = "POST", notes = " ")
@ResponseBody
public List<GoodsReaderModel > importGoodsFromExcel(@RequestParam("excel") MultipartFile multipartFile, HttpServletRequest request) {
if (multipartFile == null) {
LOGGER.info(" Excel ");
return null;
}
ExcelReaderUtil<GoodsReaderModel> excelReader = new ExcelReaderUtil<>(GoodsReaderModel.class);
List<GoodsReaderModel> modelList = Lists.newArrayList();
try {
InputStream inputStream = multipartFile.getInputStream();
modelList = excelReader.readByStream(inputStream);
} catch (IOException e) {
LOGGER.info(" , ");
return null;
}
//
}
우아한 쓰기 Excel
인터페이스에서 Excel을 다운로드하는 것도 마찬가지로 우아할 수 있습니다. 먼저 일반적인 형식 처리 클래스를 첨부하십시오.
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.handler.WriteHandler;
import com.alibaba.excel.write.metadata.WriteWorkbook;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.google.common.collect.Lists;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import javax.servlet.ServletOutputStream;
import java.util.List;
/**
* @author Carson
* @date 2020/6/5 19:39
*/
public class ExcelWriterUtil {
public WriteWorkbook workbookGenerator(ServletOutputStream outputStream) {
WriteWorkbook workbook = new WriteWorkbook();
workbook.setOutputStream(outputStream);
workbook.setExcelType(ExcelTypeEnum.XLSX);
workbook.setNeedHead(true);
//
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
//
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
headWriteCellStyle.setBorderTop(BorderStyle.THIN);
headWriteCellStyle.setBorderBottom(BorderStyle.THIN);
headWriteCellStyle.setBorderLeft(BorderStyle.THIN);
headWriteCellStyle.setBorderRight(BorderStyle.THIN);
headWriteCellStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.getIndex());
//
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
//
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
WriteFont writeFont = new WriteFont();
writeFont.setFontName(" ");
contentWriteCellStyle.setWriteFont(writeFont);
contentWriteCellStyle.setFillPatternType(FillPatternType.NO_FILL);
contentWriteCellStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.getIndex());
//
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
List<WriteHandler> customWriteHandlerList = Lists.newArrayList();
customWriteHandlerList.add(horizontalCellStyleStrategy);
workbook.setCustomWriteHandlerList(customWriteHandlerList);
return workbook;
}
}
그리고 인터페이스 요청에 이렇게 쓸 수 있습니다.
@RequestMapping(value = "export", method = RequestMethod.GET, produces = {"application/json;charset=UTF-8"})
@ApiOperation(value = " ", httpMethod = "GET", notes = " ")
@ResponseBody
public void exportData() {
// , List
List<List<String>> resList = Lists.newArrayList();
try{
ServletOutputStream outputStream = response.getOutputStream();
WriteWorkbook workbook = new ExcelWriterUtil().workbookGenerator(outputStream);
ExcelWriter writer = new ExcelWriter(workbook);
String fileName = new String("data");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
WriteSheet writeSheet = new WriteSheet();
writeSheet.setSheetName(" ");
writeSheet.setAutoTrim(true);
writer.write(resList, writeSheet);
writer.finish();
} catch (IOException e) {
LOGGER.error(" ", e);
}
}
우아한 매듭
EasyExcel은 도구류일 뿐 개인적으로는 스레드 탱크, 메시지 대기열 등 내용보다 중요성이 낮지만 개발 과정에서 능숙하게 사용할 수 있다는 것도 향기롭다.개인적으로 이것은 우리가 사용한 적이 있는 가장 유용하고 효율이 높은 Excel 도구 종류라고 생각한다.소협은 테스트를 한 적이 있다. EasyExcel은 백만 개의 데이터를 내보내는 데 60초 정도(현재 Excel은 최대 104만 개의 데이터를 수용), 전통적인 POI 기술은 몇 시간이 걸리고 메모리 최적화가 좋지 않아 큰 대상이 제때에 회수하지 못해 JVM의 FULL GC를 만들기 쉽다.
조금만 관심을 가져도 길을 잃지 않는다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로컬 개발 환경을 Git/GitHub 관리로벌써 그 만마. 그 이상도 이하도 아닙니다. 모처럼 헤매어 와 주신 분에게, 본 기사의 골을 알려 드리겠습니다. GitHub에 push하여 잔디 야생 w OS:Windows10 64bit IDE:Eclipse Neo...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.