1 /**
2 * Jun 25, 20123 */
4
5 importjava.io.File;6 importjava.io.FileInputStream;7 importjava.io.IOException;8 importjava.io.InputStream;9 importjava.util.ArrayList;10 importjava.util.List;11
12 importorg.apache.commons.io.FilenameUtils;13 importorg.apache.poi.hssf.usermodel.HSSFWorkbook;14 import org.apache.poi.ss.usermodel.*;15 importorg.apache.poi.xssf.usermodel.XSSFWorkbook;16
17 /**
18 * Excel组件19 *20 *@authorSnowolf21 *@version1.022 *@since1.023 */
24 public abstract classExcelHelper {25
26 /**
27 * Excel 200328 */
29 private final static String XLS = "xls";30 /**
31 * Excel 200732 */
33 private final static String XLSX = "xlsx";34 /**
35 * 分隔符36 */
37 private final static String SEPARATOR = "|";38
39 /**
40 * 由Excel文件的Sheet导出至List41 *42 *@paramfile43 *@paramsheetNum44 *@return
45 */
46 public static List exportListFromExcel(File file, intsheetNum)47 throwsIOException {48 return exportListFromExcel(newFileInputStream(file),49 FilenameUtils.getExtension(file.getName()), sheetNum);50 }51
52 /**
53 * 由Excel流的Sheet导出至List54 *55 *@paramis56 *@paramextensionName57 *@paramsheetNum58 *@return
59 *@throwsIOException60 */
61 public static ListexportListFromExcel(InputStream is,62 String extensionName, int sheetNum) throwsIOException {63
64 Workbook workbook = null;65
66 if(extensionName.toLowerCase().equals(XLS)) {67 workbook = newHSSFWorkbook(is);68 } else if(extensionName.toLowerCase().equals(XLSX)) {69 workbook = newXSSFWorkbook(is);70 }71
72 returnexportListFromExcel(workbook, sheetNum);73 }74
75 /**
76 * 由指定的Sheet导出至List77 *78 *@paramworkbook79 *@paramsheetNum80 *@return
81 *@throwsIOException82 */
83 private static ListexportListFromExcel(Workbook workbook,84 intsheetNum) {85
86 Sheet sheet =workbook.getSheetAt(sheetNum);87
88 //解析公式结果
89 FormulaEvaluator evaluator =workbook.getCreationHelper()90 .createFormulaEvaluator();91
92 List list = new ArrayList();93
94 int minRowIx =sheet.getFirstRowNum();95 int maxRowIx =sheet.getLastRowNum();96 for (int rowIx = minRowIx; rowIx <= maxRowIx; rowIx++) {97 Row row =sheet.getRow(rowIx);98 StringBuilder sb = newStringBuilder();99
100 short minColIx =row.getFirstCellNum();101 short maxColIx =row.getLastCellNum();102 for (short colIx = minColIx; colIx <= maxColIx; colIx++) {103 Cell cell = row.getCell(newInteger(colIx));104 CellValue cellValue =evaluator.evaluate(cell);105 if (cellValue == null) {106 continue;107 }108 //经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了109 //其余数据类型,根据官方文档,完全可以忽略http://poi.apache.org/spreadsheet/eval.html
110 switch(cellValue.getCellTypeEnum()) {111 caseBOOLEAN:112 sb.append(SEPARATOR +cellValue.getBooleanValue());113 break;114 caseNUMERIC:115 //这里的日期类型会被转换为数字类型,需要判别后区分处理
116 if(DateUtil.isCellDateFormatted(cell)) {117 sb.append(SEPARATOR +cell.getDateCellValue());118 } else{119 sb.append(SEPARATOR +cellValue.getNumberValue());120 }121 break;122 caseSTRING:123 sb.append(SEPARATOR +cellValue.getStringValue());124 break;125 caseFORMULA:126 break;127 caseBLANK:128 break;129 caseERROR:130 break;131 default:132 break;133 }134 }135 list.add(sb.toString());136 }137 returnlist;138 }139 }