java导入Excel

用Excel作为数据源,通过Java Web进行导入,需要POI的jar。
apachepoi(org.apache.poi 3.8) 可以支持公式、日期等格式!
不说废话,上代码:



Java代码 复制代码 收藏代码
1./**
2. * Jun 25, 2012
3. */ 
4. 
5.import java.io.File; 
6.import java.io.FileInputStream; 
7.import java.io.IOException; 
8.import java.io.InputStream; 
9.import java.util.ArrayList; 
10.import java.util.List; 
11. 
12.import org.apache.commons.io.FilenameUtils; 
13.import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
14.import org.apache.poi.ss.usermodel.Cell; 
15.import org.apache.poi.ss.usermodel.CellValue; 
16.import org.apache.poi.ss.usermodel.FormulaEvaluator; 
17.import org.apache.poi.ss.usermodel.Row; 
18.import org.apache.poi.ss.usermodel.Sheet; 
19.import org.apache.poi.ss.usermodel.Workbook; 
20.import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
21. 
22./**
23. * Excel组件
24. * 
25. * @author Snowolf
26. * @version 1.0
27. * @since 1.0
28. */ 
29.public abstract class ExcelHelper { 
30. 
31.    /**
32.     * Excel 2003
33.     */ 
34.    private final static String XLS = "xls"; 
35.    /**
36.     * Excel 2007
37.     */ 
38.    private final static String XLSX = "xlsx"; 
39.    /**
40.     * 分隔符
41.     */ 
42.    private final static String SEPARATOR = "|"; 
43. 
44.    /**
45.     * 由Excel文件的Sheet导出至List
46.     * 
47.     * @param file
48.     * @param sheetNum
49.     * @return
50.     */ 
51.    public static List<String> exportListFromExcel(File file, int sheetNum) 
52.            throws IOException { 
53.        return exportListFromExcel(new FileInputStream(file), 
54.                FilenameUtils.getExtension(file.getName()), sheetNum); 
55.    } 
56. 
57.    /**
58.     * 由Excel流的Sheet导出至List
59.     * 
60.     * @param is
61.     * @param extensionName
62.     * @param sheetNum
63.     * @return
64.     * @throws IOException
65.     */ 
66.    public static List<String> exportListFromExcel(InputStream is, 
67.            String extensionName, int sheetNum) throws IOException { 
68. 
69.        Workbook workbook = null; 
70. 
71.        if (extensionName.toLowerCase().equals(XLS)) { 
72.            workbook = new HSSFWorkbook(is); 
73.        } else if (extensionName.toLowerCase().equals(XLSX)) { 
74.            workbook = new XSSFWorkbook(is); 
75.        } 
76. 
77.        return exportListFromExcel(workbook, sheetNum); 
78.    } 
79. 
80.    /**
81.     * 由指定的Sheet导出至List
82.     * 
83.     * @param workbook
84.     * @param sheetNum
85.     * @return
86.     * @throws IOException
87.     */ 
88.    private static List<String> exportListFromExcel(Workbook workbook, 
89.            int sheetNum) { 
90. 
91.        Sheet sheet = workbook.getSheetAt(sheetNum); 
92. 
93.        // 解析公式结果 
94.        FormulaEvaluator evaluator = workbook.getCreationHelper() 
95.                .createFormulaEvaluator(); 
96. 
97.        List<String> list = new ArrayList<String>(); 
98. 
99.        int minRowIx = sheet.getFirstRowNum(); 
100.        int maxRowIx = sheet.getLastRowNum(); 
101.        for (int rowIx = minRowIx; rowIx <= maxRowIx; rowIx++) { 
102.            Row row = sheet.getRow(rowIx); 
103.            StringBuilder sb = new StringBuilder(); 
104. 
105.            short minColIx = row.getFirstCellNum(); 
106.            short maxColIx = row.getLastCellNum(); 
107.            for (short colIx = minColIx; colIx <= maxColIx; colIx++) { 
108.                Cell cell = row.getCell(new Integer(colIx)); 
109.                CellValue cellValue = evaluator.evaluate(cell); 
110.                if (cellValue == null) { 
111.                    continue; 
112.                } 
113.                // 经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了 
114.                // 其余数据类型,根据官方文档,完全可以忽略http://poi.apache.org/spreadsheet/eval.html 
115.                switch (cellValue.getCellType()) { 
116.                case Cell.CELL_TYPE_BOOLEAN: 
117.                    sb.append(SEPARATOR + cellValue.getBooleanValue()); 
118.                    break; 
119.                case Cell.CELL_TYPE_NUMERIC: 
120.                    // 这里的日期类型会被转换为数字类型,需要判别后区分处理 
121.                    if (DateUtil.isCellDateFormatted(cell)) { 
122.                        sb.append(SEPARATOR + cell.getDateCellValue()); 
123.                    } else { 
124.                        sb.append(SEPARATOR + cellValue.getNumberValue()); 
125.                    } 
126.                    break; 
127.                case Cell.CELL_TYPE_STRING: 
128.                    sb.append(SEPARATOR + cellValue.getStringValue()); 
129.                    break; 
130.                case Cell.CELL_TYPE_FORMULA: 
131.                    break; 
132.                case Cell.CELL_TYPE_BLANK: 
133.                    break; 
134.                case Cell.CELL_TYPE_ERROR: 
135.                    break; 
136.                default: 
137.                    break; 
138.                } 
139.            } 
140.            list.add(sb.toString()); 
141.        } 
142.        return list; 
143.    } 
144.} 



由于Excel中的数据有日期、公式等等格式,参考http://poi.apache.org/spreadsheet/eval.html做了修改,完全兼容。

当前的Excel,C列是根据A、B相乘计算而来,D列是日期格式:



测试下:



Java代码 复制代码 收藏代码
1./**
2. * Jun 25, 2012
3. */ 
4. 
5.import java.io.File; 
6.import java.io.IOException; 
7.import java.util.List; 
8. 
9.import static org.junit.Assert.*; 
10.import org.junit.Test; 
11. 
12./**
13. * 
14. * @author Snowolf
15. * @version 1.0
16. * @since 1.0
17. */ 
18.public class ExcelHelperTest { 
19. 
20.    @Test 
21.    public void test() { 
22.        String path = "excel.xlsx"; 
23.        List<String> list = null; 
24.        try { 
25.            list = ExcelHelper.exportListFromExcel(new File(path), 0); 
26.            assertNotNull(list); 
27.        } catch (IOException e) { 
28.            fail(); 
29.        } 
30. 
31.    } 
32.} 


就是这样了




你可能感兴趣的:(java)