All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.excel.poi.ExcelBoot Maven / Gradle / Ivy

/*
 * Copyright 2018 NingWei ([email protected])
 * 

* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *

*/ package com.excel.poi; import com.excel.poi.common.Constant; import com.excel.poi.entity.ExcelEntity; import com.excel.poi.excel.ExcelReader; import com.excel.poi.excel.ExcelWriter; import com.excel.poi.exception.ExcelBootException; import com.excel.poi.factory.ExcelMappingFactory; import com.excel.poi.function.ExportFunction; import com.excel.poi.function.ImportFunction; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import javax.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.xml.sax.SAXException; /** * @author NingWei */ @Slf4j public class ExcelBoot { private HttpServletResponse httpServletResponse; private OutputStream outputStream; private InputStream inputStream; private String fileName; private Class excelClass; private Integer pageSize; private Integer rowAccessWindowSize; private Integer recordCountPerSheet; private Boolean openAutoColumWidth; /** * 导入构造器 * * @param inputStream * @param excelClass */ protected ExcelBoot(InputStream inputStream, Class excelClass) { this(null, null, inputStream, null, excelClass, null, null, null, null); } /** * OutputStream导出构造器,一般用于导出到ftp服务器 * * @param outputStream * @param fileName * @param excelClass */ protected ExcelBoot(OutputStream outputStream, String fileName, Class excelClass) { this(null, outputStream, null, fileName, excelClass, Constant.DEFAULT_PAGE_SIZE, Constant.DEFAULT_ROW_ACCESS_WINDOW_SIZE, Constant.DEFAULT_RECORD_COUNT_PEER_SHEET, Constant.OPEN_AUTO_COLUM_WIDTH); } /** * HttpServletResponse导出构造器,一般用于浏览器导出 * * @param response * @param fileName * @param excelClass */ protected ExcelBoot(HttpServletResponse response, String fileName, Class excelClass) { this(response, null, null, fileName, excelClass, Constant.DEFAULT_PAGE_SIZE, Constant.DEFAULT_ROW_ACCESS_WINDOW_SIZE, Constant.DEFAULT_RECORD_COUNT_PEER_SHEET, Constant.OPEN_AUTO_COLUM_WIDTH); } /** * 构造器 * * @param response * @param outputStream * @param inputStream * @param fileName * @param excelClass * @param pageSize * @param rowAccessWindowSize * @param recordCountPerSheet * @param openAutoColumWidth */ protected ExcelBoot(HttpServletResponse response, OutputStream outputStream, InputStream inputStream , String fileName, Class excelClass, Integer pageSize, Integer rowAccessWindowSize, Integer recordCountPerSheet, Boolean openAutoColumWidth) { this.httpServletResponse = response; this.outputStream = outputStream; this.inputStream = inputStream; this.fileName = fileName; this.excelClass = excelClass; this.pageSize = pageSize; this.rowAccessWindowSize = rowAccessWindowSize; this.recordCountPerSheet = recordCountPerSheet; this.openAutoColumWidth = openAutoColumWidth; } /** * 通过HttpServletResponse,一般用于在浏览器中导出excel * * @param httpServletResponse * @param fileName * @param clazz * @return */ public static ExcelBoot ExportBuilder(HttpServletResponse httpServletResponse, String fileName, Class clazz) { return new ExcelBoot(httpServletResponse, fileName, clazz); } /** * 通过OutputStream生成excel文件,一般用于异步导出大Excel文件到ftp服务器或本地路径 * * @param outputStream * @param fileName * @param clazz * @return */ public static ExcelBoot ExportBuilder(OutputStream outputStream, String fileName, Class clazz) { return new ExcelBoot(outputStream, fileName, clazz); } /** * HttpServletResponse 通用导出Excel构造器 * * @param response * @param fileName * @param excelClass * @param pageSize * @param rowAccessWindowSize * @param recordCountPerSheet * @param openAutoColumWidth * @return */ public static ExcelBoot ExportBuilder(HttpServletResponse response, String fileName, Class excelClass, Integer pageSize, Integer rowAccessWindowSize, Integer recordCountPerSheet, Boolean openAutoColumWidth) { return new ExcelBoot(response, null, null , fileName, excelClass, pageSize, rowAccessWindowSize, recordCountPerSheet, openAutoColumWidth); } /** * OutputStream 通用导出Excel构造器 * * @param outputStream * @param fileName * @param excelClass * @param pageSize * @param rowAccessWindowSize * @param recordCountPerSheet * @param openAutoColumWidth * @return */ public static ExcelBoot ExportBuilder(OutputStream outputStream, String fileName, Class excelClass, Integer pageSize , Integer rowAccessWindowSize, Integer recordCountPerSheet, Boolean openAutoColumWidth) { return new ExcelBoot(null, outputStream, null , fileName, excelClass, pageSize, rowAccessWindowSize, recordCountPerSheet, openAutoColumWidth); } /** * 导入Excel文件数据 * * @param inputStreamm * @param clazz * @return */ public static ExcelBoot ImportBuilder(InputStream inputStreamm, Class clazz) { return new ExcelBoot(inputStreamm, clazz); } /** * 用于浏览器导出 * * @param param * @param exportFunction * @param ExportFunction * @param * @param */ public void exportResponse(R param, ExportFunction exportFunction) { SXSSFWorkbook sxssfWorkbook = null; try { try { verifyResponse(); sxssfWorkbook = commonSingleSheet(param, exportFunction); download(sxssfWorkbook, httpServletResponse, URLEncoder.encode(fileName + ".xlsx", "UTF-8")); } finally { if (sxssfWorkbook != null) { sxssfWorkbook.close(); } if (httpServletResponse != null && httpServletResponse.getOutputStream() != null) { httpServletResponse.getOutputStream().close(); } } } catch (Exception e) { throw new ExcelBootException(e); } } /** * 通过OutputStream导出excel文件,一般用于异步导出大Excel文件到本地路径 * * @param param * @param ExportFunction * @param exportFunction * @param * @param */ public void exportStream(R param, ExportFunction exportFunction) { OutputStream outputStream = null; try { try { outputStream = generateStream(param, exportFunction); write(outputStream); } finally { if (outputStream != null) { outputStream.close(); } } } catch (Exception e) { throw new ExcelBootException(e); } } /** * 通过OutputStream导出excel文件,一般用于异步导出大Excel文件到ftp服务器 * * @param param * @param exportFunction * @param ExportFunction * @param * @param * @return */ public OutputStream generateStream(R param, ExportFunction exportFunction) throws IOException { SXSSFWorkbook sxssfWorkbook = null; try { verifyStream(); sxssfWorkbook = commonSingleSheet(param, exportFunction); sxssfWorkbook.write(outputStream); return outputStream; } catch (Exception e) { log.error("生成Excel发生异常! 异常信息:", e); if (sxssfWorkbook != null) { sxssfWorkbook.close(); } throw new ExcelBootException(e); } } /** * 用于浏览器分sheet导出 * * @param param * @param exportFunction * @param ExportFunction * @param * @param */ public void exportMultiSheetResponse(R param, ExportFunction exportFunction) { SXSSFWorkbook sxssfWorkbook = null; try { try { verifyResponse(); sxssfWorkbook = commonMultiSheet(param, exportFunction); download(sxssfWorkbook, httpServletResponse, URLEncoder.encode(fileName + ".xlsx", "UTF-8")); } finally { if (sxssfWorkbook != null) { sxssfWorkbook.close(); } } } catch (Exception e) { throw new ExcelBootException(e); } } /** * 通过OutputStream分sheet导出excel文件,一般用于异步导出大Excel文件到本地路径 * * @param param * @param ExportFunction * @param exportFunction * @param * @param */ public void exportMultiSheetStream(R param, ExportFunction exportFunction) { OutputStream outputStream = null; try { try { outputStream = generateMultiSheetStream(param, exportFunction); write(outputStream); } finally { if (outputStream != null) { outputStream.close(); } } } catch (Exception e) { throw new ExcelBootException(e); } } /** * 通过OutputStream分sheet导出excel文件,一般用于异步导出大Excel文件到ftp服务器 * * @param param * @param exportFunction * @param ExportFunction * @param * @param * @return */ public OutputStream generateMultiSheetStream(R param, ExportFunction exportFunction) throws IOException { SXSSFWorkbook sxssfWorkbook = null; try { verifyStream(); sxssfWorkbook = commonMultiSheet(param, exportFunction); sxssfWorkbook.write(outputStream); return outputStream; } catch (Exception e) { log.error("分Sheet生成Excel发生异常! 异常信息:", e); if (sxssfWorkbook != null) { sxssfWorkbook.close(); } throw new ExcelBootException(e); } } /** * 导出-导入模板 * * @param data * @throws Exception */ public void exportTemplate() { SXSSFWorkbook sxssfWorkbook = null; try { try { verifyResponse(); verifyParams(); ExcelEntity excelMapping = ExcelMappingFactory.loadExportExcelClass(excelClass, fileName); ExcelWriter excelWriter = new ExcelWriter(excelMapping, pageSize, rowAccessWindowSize, recordCountPerSheet, openAutoColumWidth); sxssfWorkbook = excelWriter.generateTemplateWorkbook(); download(sxssfWorkbook, httpServletResponse, URLEncoder.encode(fileName + ".xlsx", "UTF-8")); } finally { if (sxssfWorkbook != null) { sxssfWorkbook.close(); } if (httpServletResponse != null && httpServletResponse.getOutputStream() != null) { httpServletResponse.getOutputStream().close(); } } } catch (Exception e) { throw new ExcelBootException(e); } } /** * 导入excel全部sheet * * @param inputStream * @param importFunction * @throws OpenXML4JException * @throws SAXException * @throws IOException */ public void importExcel(ImportFunction importFunction) { try { if (importFunction == null) { throw new ExcelBootException("excelReadHandler参数为空!"); } if (inputStream == null) { throw new ExcelBootException("inputStream参数为空!"); } ExcelEntity excelMapping = ExcelMappingFactory.loadImportExcelClass(excelClass); ExcelReader excelReader = new ExcelReader(excelClass, excelMapping, importFunction); excelReader.process(inputStream); } catch (Exception e) { throw new ExcelBootException(e); } } private SXSSFWorkbook commonSingleSheet(R param, ExportFunction exportFunction) throws Exception { verifyParams(); ExcelEntity excelMapping = ExcelMappingFactory.loadExportExcelClass(excelClass, fileName); ExcelWriter excelWriter = new ExcelWriter(excelMapping, pageSize, rowAccessWindowSize, recordCountPerSheet, openAutoColumWidth); return excelWriter.generateWorkbook(param, exportFunction); } private SXSSFWorkbook commonMultiSheet(R param, ExportFunction exportFunction) throws Exception { verifyParams(); ExcelEntity excelMapping = ExcelMappingFactory.loadExportExcelClass(excelClass, fileName); ExcelWriter excelWriter = new ExcelWriter(excelMapping, pageSize, rowAccessWindowSize, recordCountPerSheet, openAutoColumWidth); return excelWriter.generateMultiSheetWorkbook(param, exportFunction); } /** * 生成文件 * * @param out * @throws IOException */ private void write(OutputStream out) throws IOException { if (null != out) { out.flush(); } } /** * 构建Excel服务器响应格式 * * @param wb * @param response * @param filename * @throws IOException */ private void download(SXSSFWorkbook wb, HttpServletResponse response, String filename) throws IOException { OutputStream out = response.getOutputStream(); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-disposition", String.format("attachment; filename=%s", filename)); if (null != out) { wb.write(out); out.flush(); } } private void verifyResponse() { if (httpServletResponse == null) { throw new ExcelBootException("httpServletResponse参数为空!"); } } private void verifyStream() { if (outputStream == null) { throw new ExcelBootException("outputStream参数为空!"); } } private void verifyParams() { if (excelClass == null) { throw new ExcelBootException("excelClass参数为空!"); } if (fileName == null) { throw new ExcelBootException("fileName参数为空!"); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy