Java Excel导入

1、引入jar包,<poi.version>3.8</poi.version>

 1 <dependency>
 2     <groupId>org.apache.poi</groupId>
 3     <artifactId>poi</artifactId>
 4     <version>${poi.version}</version>
 5 </dependency>
 6 <dependency>
 7     <groupId>org.apache.poi</groupId>
 8     <artifactId>poi-ooxml</artifactId>
 9     <version>${poi.version}</version>
10 </dependency>

2、Excel单元格参数类定义

ExcelCellImportParam.java

  1 /**
  2  * The Class ExcelCellImportParam.
  3  *
  4  * @author 下一个雨季~
  5  * @version 1.0
  6  * @date 2015-8-19
  7  */
  8 public class ExcelCellImportParam {
  9     
 10     /** 数据所在Excel单元格下标. */
 11     private int cellIndex;
 12     
 13     /** 需要被赋值的属性名称. */
 14     private String propertyName;
 15     
 16     /**
 17      * Instantiates a new excel cell import param.
 18      *
 19      * @param cellIndex the cell index
 20      * @param propertyName the property name
 21      */
 22     public ExcelCellImportParam(int cellIndex, String propertyName){
 23         this.cellIndex = cellIndex;
 24         this.propertyName = propertyName;
 25     }
 26     
 27     /**
 28      * Sets the value.
 29      *
 30      * @param entity the entity
 31      * @param row the row
 32      * @throws NoSuchMethodException 
 33      * @throws InvocationTargetException 
 34      * @throws IllegalAccessException 
 35      */
 36     public void setValue(Object entity, Row row) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
 37         if(row == null){
 38             throw new NullPointerException("Excel row is null.");
 39         }
 40         if(entity == null){
 41             throw new NullPointerException("Excel convert Object is null.");
 42         }
 43         Class<?> clazz = PropertyUtils.getPropertyType(entity, this.getPropertyName());
 44         Object cellValue = getCellValue(row.getCell(this.getCellIndex()), clazz);
 45         PropertyUtils.setProperty(entity, this.getPropertyName(), cellValue);
 46     }
 47     
 48     /**
 49      * Gets the cell value.
 50      *
 51      * @param cell the cell
 52      * @param propertyType the property type
 53      * @return the cell value
 54      */
 55     private Object getCellValue(Cell cell, Class<?> propertyType){
 56         Object cellValue = null;
 57         if(cell != null){
 58             if(propertyType.isAssignableFrom(Boolean.class))
 59                 cellValue = Boolean.valueOf(getCellValue(cell));
 60             else if(propertyType.isAssignableFrom(Double.class))
 61                 cellValue = Double.valueOf(getCellValue(cell));
 62             else if(propertyType.isAssignableFrom(Float.class))
 63                 cellValue = Float.valueOf(getCellValue(cell));
 64             else if(propertyType.isAssignableFrom(BigDecimal.class))
 65                 cellValue = new BigDecimal(getCellValue(cell));
 66             else if(propertyType.isAssignableFrom(Integer.class))
 67                 cellValue = Integer.valueOf(getCellValue(cell));
 68             else if(propertyType.isAssignableFrom(Long.class))
 69                 cellValue = Long.valueOf(getCellValue(cell));
 70             else if(propertyType.isAssignableFrom(Date.class))
 71                 cellValue = getDateCellValue(cell);
 72             else if(propertyType.isAssignableFrom(String.class))
 73                 cellValue = getCellValue(cell);
 74             else
 75                 throw new IllegalArgumentException("Invalid data type.");
 76         }
 77         return cellValue;
 78     }
 79     
 80     /**
 81      * Gets the cell value.
 82      *
 83      * @param cell the cell
 84      * @return the cell value
 85      */
 86     private String getCellValue(Cell cell){
 87         cell.setCellType(HSSFCell.CELL_TYPE_STRING);
 88         return cell.getStringCellValue();
 89     }
 90 
 91     /**
 92      * Gets the date cell value.
 93      *
 94      * @param cell the cell
 95      * @return the date cell value
 96      */
 97     private Object getDateCellValue(Cell cell){
 98         switch (cell.getCellType()) {
 99         case Cell.CELL_TYPE_BLANK:
100             return null;
101         case Cell.CELL_TYPE_NUMERIC:
102             return cell.getDateCellValue();
103         default:
104             cell.setCellType(HSSFCell.CELL_TYPE_STRING);
105             String time = cell.getStringCellValue();
106             return DateUtils.parse(time, DateUtils.DEFAULT_DATETIME_PATTERN);
107         }
108     }
109     
110     /**
111      * Gets the cell index.
112      *
113      * @return the cell index
114      */
115     public int getCellIndex() {
116         return cellIndex;
117     }
118 
119     /**
120      * Sets the cell index.
121      *
122      * @param cellIndex the new cell index
123      */
124     public void setCellIndex(int cellIndex) {
125         this.cellIndex = cellIndex;
126     }
127 
128     /**
129      * Gets the property name.
130      *
131      * @return the property name
132      */
133     public String getPropertyName() {
134         return propertyName;
135     }
136 
137     /**
138      * Sets the property name.
139      *
140      * @param propertyName the new property name
141      */
142     public void setPropertyName(String propertyName) {
143         this.propertyName = propertyName;
144     }
145     
146 }

DateUtils.java

 1 /**
 2  * The Class DateUtils.
 3  *
 4  * @author Derek
 5  * @version 1.0, 2014-1-26
 6  */
 7 public class DateUtils {
 8         /** 默认的时间格式化模式。. */
 9         public static final String DEFAULT_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
10         /** 长型的日期格式化模式。. */
11         public static final String LONG_DATE_PATTERN = "yyyy-MM-dd";
12         /** 短型的日期格式化模式。. */
13         public static final String SHORT_DATE_PATTERN = "yy-MM-dd";
14         /** 长型的时间格式化模式。. */
15         public static final String LONG_TIME_PATTERN = "HH:mm:ss";
16         /** 短型的时间格式化模式。. */
17         public static final String SHORT_TIME_PATTERN = "HH:mm";
18         /**
19          * 从给定字符串的开始解析文本,以生成一个日期。该方法不使用给定字符串的整个文本。.
20          *
21          * @param input 一个 {@code String},应从其开始处进行解析。
22          * @param pattern 描述日期和时间格式的模式。
23          * @param locale 给定的语言环境(可变参数)。
24          * @return {@code input} 中包含的日期字符串的 {@code java.util.Date} 对象。
25          */
26         public static Date parse(String input, String pattern, Locale... locale) {
27             if (StringUtils.isEmpty(input)) {
28                 return null;
29             }
30             if (StringUtils.isEmpty(pattern)) {
31                 pattern = DEFAULT_DATETIME_PATTERN;
32             }
33             try {
34                 DateFormat df = new SimpleDateFormat(pattern,
35                         zlocale == null || locale.length == 0 ? Locale.CHINESE : locale[0]);
36                 return df.parse(input);
37             } catch (ParseException ex) {
38                 return null;
39             }
40         }
41 }

ExcelUtil.java

 1 /**
 2  * The Class ExcelUtil.
 3  *
 4  * @author 下一个雨季~
 5  * @version 1.0
 6  * @date 2015-8-19
 7  */
 8 public class ExcelUtil {
 9     
10     /** The Constant EXTENSION_XLS. */
11     public final static String EXTENSION_XLS = "xls";
12     
13     /** The Constant EXTENSION_XLSX. */
14     public final static String EXTENSION_XLSX = "xlsx";
15     
16     /**
17      * Gets the workbook.
18      *
19      * @param format the format
20      * @param ins the ins
21      * @return the workbook
22      * @throws IOException Signals that an I/O exception has occurred.
23      */
24     public static Workbook getWorkbook(String format, InputStream ins) throws IOException{
25         if(EXTENSION_XLS.equals(format))
26             return new HSSFWorkbook(ins);
27         else if(EXTENSION_XLSX.equals(format))
28             return new XSSFWorkbook(ins);
29         else
30             throw new IllegalArgumentException("Unsupported file type");
31     }
32     
33     /**
34      * 导入Excel表格.
35      * 
36      * @param <T> the generic type
37      * @param clazz the clazz - 导入实体对象
38      * @param workbook the workbook - Excel对象
39      * @param params the params - 导入的参数列表
40      * @param sheetIndex the sheet index - Excel的sheet索引
41      * @return the list - 返回导入的数据集合
42      * @throws IllegalAccessException the illegal access exception
43      * @throws InvocationTargetException the invocation target exception
44      * @throws NoSuchMethodException the no such method exception
45      * @throws InstantiationException 
46      */
47     public static <T> List<T> doExcelImport(Class<T> clazz, Workbook workbook, List<ExcelCellImportParam> params, int sheetIndex) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException{
48         Sheet sheet = workbook.getSheetAt(sheetIndex);
49         Iterator<Row> rows = sheet.iterator();
50         List<T> list = null;
51         
52         if(rows.hasNext()){
53             //标题行跨过
54             rows.next();
55             list = new ArrayList<T>();
56             while(rows.hasNext()){
57                 Row row = rows.next();
58                 T entity = clazz.newInstance();
59                 for (ExcelCellImportParam param : params) {
60                     param.setValue(entity, row);
61                 }
62                 list.add(entity);
63             }
64         }
65         return list;
66     }
67 }

下面在贴上ExcelCellImportParam具体参数示例:

 1     /**
 2      * 导入Excel参数列表.
 3      *
 4      * @return the params
 5      */
 6     private List<ExcelCellImportParam> getParams(){
 7         List<ExcelCellImportParam> list = new ArrayList<ExcelCellImportParam>();
 8         //0表示Excel单元格第一列的为username值,username对应实体propertyName
 9         ExcelCellImportParam username = new ExcelCellImportParam(0, "username");
10         ExcelCellImportParam phone = new ExcelCellImportParam(1, "phone");
11         ExcelCellImportParam addr = new ExcelCellImportParam(2, "addr");
12         
13         list.add(username);
14         list.add(phone);
15         list.add(addr);
16         return list;
17     }

以上代码只是提供一个思路,实际使用请根据需求修改。

 

posted @ 2015-09-15 21:11  下一个雨季~  阅读(218)  评论(0编辑  收藏  举报