1、ExportUtil导出工具类(根据模板导出),支持/不同excel格式文件
package org.nercita.bcp.util;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import .URLEncoder;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Properties;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.jxls.transformer.XLSTransformer;import mons.io.IOUtils;import mons.lang.StringUtils;import org.apache.poi.hssf.usermodel.HSSFCellStyle;import org.apache.poi.hssf.usermodel.HSSFFont;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.openxml4j.exceptions.InvalidFormatException;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.ss.usermodel.Workbook;import org.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.xssf.usermodel.XSSFCellStyle;import org.apache.poi.xssf.usermodel.XSSFFont;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.springframework.core.io.ClassPathResource;import org.springframework.util.Assert;/*** 导出工具类*/public class ExportUtil {public static String EXCEL_ = "Excel";public static String EXCEL_ = "Excel";private volatile Properties props = new Properties();private boolean inited = false;private volatile static ExportUtil util = new ExportUtil();private ExportUtil() {init();}public Properties getProps() {if (!inited)init();return props;}public String getProp(String key) {if (!inited)init();return props.getProperty(key);}public String getProp(String key, String defaultValue) {if (!inited)init();return props.getProperty(key, defaultValue);}private void init() {try {InputStream is = new ClassPathResource("export.properties").getInputStream();props.load(is);is.close();inited = true;} catch (IOException e) {e.printStackTrace();}}public static ExportUtil getUtil() {if (util == null)util = new ExportUtil();return util;}/*** 设置下载文件中文件的名称** @param pFileName* @param request* @return*/public static String encodeFilename(String pFileName, HttpServletRequest request){String filename = null; String agent = request.getHeader("USER-AGENT");try {if (null != agent){ if (-1 != agent.indexOf("Firefox")) {//Firefox filename = "=?UTF-8?B?" + (new String(mons.codec.binary.Base64.encodeBase64(pFileName.getBytes("UTF-8"))))+ "?="; }else if (-1 != agent.indexOf("Chrome")) {//Chrome filename = new String(pFileName.getBytes(), "ISO8859-1"); } else {//IE7+ filename = URLEncoder.encode(pFileName, "UTF-8"); filename = StringUtils.replace(filename, "+", "%20");//替换空格 } } else { filename = pFileName; } } catch (Exception ex) {}return filename;}//导出public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response, String version, String templatePath, Map<String, Object> beanParams,Map<Integer,List<CellFill>> mapFill) {writeResponse(fileName, request, response, version, templatePath, beanParams, false, null, null, mapFill);}public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response, String version, String templatePath, Map<String, Object> beanParams) {writeResponse(fileName, request, response, version, templatePath, beanParams, false, null, null, null);}public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response, String version, String templatePath, Map<String, Object> beanParams,boolean innerCollectionAccess) {writeResponse(fileName, request, response, version, templatePath, beanParams, innerCollectionAccess, null, null, null);}public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response, String version, String templatePath, Map<String, Object> beanParams,boolean innerCollectionAccess, Map<Integer, List<CellRangeAddress>> rangeMap) {writeResponse(fileName, request, response, version, templatePath, beanParams, innerCollectionAccess, rangeMap, null, null);}public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response, String version, String templatePath, Map<String, Object> beanParams,Map<Integer, List<CellRangeAddress>> rangeMap, XLSTransformer transformer) {writeResponse(fileName, request, response, version, templatePath, beanParams, false, rangeMap, transformer, null);}//public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response, String version, String templatePath, Map<String, Object> beanParams,boolean innerCollectionAccess, Map<Integer, List<CellRangeAddress>> rangeMap, XLSTransformer trans,Map<Integer,List<CellFill>> mapFill) {Assert.isTrue(StringUtils.isNotBlank(templatePath), "templatePath不可以为空字符串");XLSTransformer transformer = null;if (trans != null) {transformer = trans;} else {transformer = new XLSTransformer();}transformer.setJexlInnerCollectionsAccess(innerCollectionAccess);response.setCharacterEncoding("utf-8");if (EXCEL_.equals(version)) {fileName = encodeFilename(fileName + ".xlsx", request);response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");} else {fileName = encodeFilename(fileName + ".xls", request);response.setContentType("application/vnd.ms-excel;charset=UTF-8");}response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);InputStream is = null;try {if("linux".equals(System.getProperty("os.name").toLowerCase())){if(!templatePath.startsWith("/")){templatePath="/"+templatePath;}}is = new FileInputStream(templatePath);Workbook book = transformer.transformXLS(is, beanParams);if (rangeMap != null) {Iterator<Integer> index = rangeMap.keySet().iterator();while (index.hasNext()) {Integer i = index.next();Sheet sheet = book.getSheetAt(i);Iterator<CellRangeAddress> cra = rangeMap.get(i).iterator();while (cra.hasNext()) {sheet.addMergedRegion(cra.next());}}}//==========填充颜色,add by psh if(mapFill!=null) {if (EXCEL_.equals(version)) {HSSFWorkbook workbook=(HSSFWorkbook)book;Iterator<Integer> sheetIndex = mapFill.keySet().iterator();while (sheetIndex.hasNext()) {Integer index = sheetIndex.next();Sheet sheet = workbook.getSheetAt(index);List<CellFill> list = mapFill.get(index);CellFill cellFill= null;for(int i=0;i<list.size();i++){cellFill= list.get(i);Row row = (Row)sheet.getRow(cellFill.getRow());if(row==null){continue;}Cell cell = row.getCell(cellFill.getCol());if(cell==null){continue;}HSSFCellStyle sheetStyle = workbook.createCellStyle();//Sheet样式sheetStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND); //填充模式sheetStyle.setFillForegroundColor(cellFill.getBgColor()); //前景色(单元格)的设定。HSSFColor.YELLOW.index——黄色HSSFFont font=workbook.createFont();font.setColor(cellFill.getFontColor());sheetStyle.setFont(font); cell.setCellStyle(sheetStyle);}}//end while}else {XSSFWorkbook workbook=(XSSFWorkbook)book;Iterator<Integer> sheetIndex = mapFill.keySet().iterator();while (sheetIndex.hasNext()) {Integer index = sheetIndex.next();Sheet sheet = workbook.getSheetAt(index);List<CellFill> list = mapFill.get(index);CellFill cellFill= null;for(int i=0;i<list.size();i++){cellFill= list.get(i);Row row = (Row)sheet.getRow(cellFill.getRow());if(row==null){continue;}Cell cell = row.getCell(cellFill.getCol());if(cell==null){continue;}XSSFCellStyle sheetStyle = workbook.createCellStyle();//Sheet样式sheetStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND); //填充模式sheetStyle.setFillForegroundColor(cellFill.getBgColor()); //前景色(单元格)的设定。HSSFColor.YELLOW.index——黄色XSSFFont font=workbook.createFont();font.setColor(cellFill.getFontColor());sheetStyle.setFont(font); cell.setCellStyle(sheetStyle);}}//end while} //end } //=====end 颜色===========book.write(response.getOutputStream()); } catch (IOException e) {e.printStackTrace();} catch (InvalidFormatException e) {e.printStackTrace();} finally {IOUtils.closeQuietly(is);}}public static String getProperty(String property) {return getUtil().getProp(property);}}
2、ImportUtil.java工具类,支持和不同格式excel文件。
package org.nercita.bcp.util;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;import java.util.List;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFDateUtil;import org.apache.poi.hssf.usermodel.HSSFWorkbook;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.ss.usermodel.Workbook;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.springframework.web.multipart.MultipartFile;/*** excel文件导入工具类*/public class ImportUtil {public static String EXCEL__ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";public static String EXCEL__ContentType = "application/vnd.ms-excel";/*** excel文件导入* @param file* @param ignoreRows 需要忽略掉的行数* @return* @throws FileNotFoundException* @throws IOException*/public static String[][] importFile(MultipartFile file, int ignoreRows) throws FileNotFoundException, IOException {List<String[]> result = new ArrayList<String[]>();String contentType = file.getContentType(); //内容类型InputStream stream = file.getInputStream(); //输入流Workbook wb=null;//根据inputStream建立一个Excel对象if (EXCEL__ContentType.equals(contentType)){wb =(Workbook) new HSSFWorkbook(stream);//}else if(EXCEL__ContentType.equals(contentType)) {wb =(Workbook) new XSSFWorkbook(stream);//}int rowSize = 0;Cell cell = null;for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {Sheet st = wb.getSheetAt(sheetIndex);for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {Row row = st.getRow(rowIndex);if (null == row) {continue;}int tempRowSize = row.getLastCellNum() + 1;if (tempRowSize > rowSize) {rowSize = tempRowSize;}String[] values = new String[rowSize];Arrays.fill(values, "");boolean hasValue = false;for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) {String value = "";cell = row.getCell(columnIndex);if (null != cell) {switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_STRING:value = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_NUMERIC:if (HSSFDateUtil.isCellDateFormatted(cell)) {Date date = cell.getDateCellValue();if (null != date) {value = new SimpleDateFormat("yyyy-MM-dd").format(date);} else {value = "";}} else {DecimalFormat df = new DecimalFormat("0.#######"); //value = df.format(cell.getNumericCellValue()); value = String.valueOf(df.format(cell.getNumericCellValue()));}break;case HSSFCell.CELL_TYPE_FORMULA:// 公式生成的数据if (!"".equals(cell.getStringCellValue())) {value = cell.getStringCellValue();} else {value = cell.getNumericCellValue() + "";}break;case HSSFCell.CELL_TYPE_BLANK:break;case HSSFCell.CELL_TYPE_ERROR:value = "";break;case HSSFCell.CELL_TYPE_BOOLEAN:value = (cell.getBooleanCellValue() == true ? "Y" : "N");break;default:value = "";}}if (columnIndex == 0 && value.trim().equals("")) {break;}values[columnIndex] = rightTrim(value);hasValue = true;}if (hasValue) {result.add(values);}}}stream.close();String[][] returnArray = new String[result.size()][rowSize];for (int i = 0; i < returnArray.length; i++) {returnArray[i] = (String[]) result.get(i);}return returnArray;}/*** excel文件导入* @param file* @param ignoreRows 需要忽略掉的行数* @return* @throws FileNotFoundException* @throws IOException*/public static String[][] importFile(MultipartFile file,int sheetIndex, int ignoreRows,Integer colCnt) throws FileNotFoundException, IOException {List<String[]> result = new ArrayList<String[]>();String contentType = file.getContentType(); //内容类型InputStream stream = file.getInputStream(); //输入流Workbook wb=null;//根据inputStream建立一个Excel对象if (EXCEL__ContentType.equals(contentType)){wb =(Workbook) new HSSFWorkbook(stream);//}else if(EXCEL__ContentType.equals(contentType)) {wb =(Workbook) new XSSFWorkbook(stream);//}int rowSize = 0;Cell cell = null;Sheet st = wb.getSheetAt(sheetIndex);for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {Row row = st.getRow(rowIndex);if (null == row) {continue;}//int tempRowSize = row.getLastCellNum() + 1;int tempRowSize = row.getPhysicalNumberOfCells();if(colCnt==null){if (tempRowSize > rowSize) {rowSize = tempRowSize;}colCnt=rowSize;}String[] values = new String[colCnt];Arrays.fill(values, "");boolean hasValue = false;for (short columnIndex = 0; columnIndex < colCnt; columnIndex++) {String value = "";cell = row.getCell(columnIndex);if (null != cell) {switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_STRING:value = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_NUMERIC:if (HSSFDateUtil.isCellDateFormatted(cell)) {Date date = cell.getDateCellValue();if (null != date) {value = new SimpleDateFormat("yyyy-MM-dd").format(date);} else {value = "";}} else {DecimalFormat df = new DecimalFormat("0.#######"); //value = df.format(cell.getNumericCellValue()); value = String.valueOf(df.format(cell.getNumericCellValue()));}break;case HSSFCell.CELL_TYPE_FORMULA:// 公式生成的数据if (!"".equals(cell.getStringCellValue())) {value = cell.getStringCellValue();} else {value = cell.getNumericCellValue() + "";}break;case HSSFCell.CELL_TYPE_BLANK:break;case HSSFCell.CELL_TYPE_ERROR:value = "";break;case HSSFCell.CELL_TYPE_BOOLEAN:value = (cell.getBooleanCellValue() == true ? "Y" : "N");break;default:value = "";}}if (columnIndex == 0 && value.trim().equals("")) {break;}values[columnIndex] = rightTrim(value);hasValue = true;}if (hasValue) {result.add(values);}}stream.close();String[][] returnArray = new String[result.size()][colCnt];for (int i = 0; i < returnArray.length; i++) {returnArray[i] = (String[]) result.get(i);}return returnArray;}/*** 去除字符串右侧空格(直接使用trim()将不能支持中间存在空格的单元格)* @param str* @return*/public static String rightTrim(String str) {if (str == null) {return "";}int length = str.length();for (int i = length - 1; i >= 0; i--) {if (0x20 != str.charAt(i)) {break;}length--;}return str.substring(0, length);}}
如果觉得《poi/jxls导入/导出Excel工具类(支持和)》对你有帮助,请点赞、收藏,并留下你的观点哦!