poi 导入Excel封装 并处理数据类型
来源:互联网 发布:mac安装win10镜像 编辑:程序博客网 时间:2024/06/05 02:23
最近正在做OA,需求需要导入导出EXCEL ,功能和方法使用起来挺简单,做起来发现类型问题比较坑,自己稍微封装了一下,
大致功能就是 通过传入实体类的class对象和 Sheet 工作簿对象获取 从Excel文件中获取,实体类集合。
excel2003的.xls格式 对应是HSSFCell,而之后的xlsx对应的则是XSSFCell,但是他们都继承于Cell,所以使用Cell就可以使用两种格式的excel导入了
对于不想导入的字段
自定义一个注解,在实体类中的属性上标注,相应的Excel中也不该有该字段
有一点不好的是:excel中字段顺序需要和实体类中属性顺序一致,且有自定义注解的属性不应该出现在Excel中
有时间我会对扩展性和通用性做进一步封装和处理
- 这里 注解名为NoExport 是因为之前写导出的时候命名,额 就没有改了
/** * 自定义标签 : 标注了的对象不导出导入 * @author huang * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface NoExport {}
@RequestMapping("/XXXXX")public String includeEmp(MultipartFile multfile ) throws Exception { try { //自己封装的 导入功能类 ImportExcel ie = new ImportExcel(); POIFSFileSystem fs = new POIFSFileSystem(multfile.getInputStream()); HSSFWorkbook wb = new HSSFWorkbook(fs); //获取导入的员工集合 List<Employee> emplist = new ArrayList<>(); if ( wb.getSheet("Employee表")!=null ) { emplist = (List<Employee>) ie.getListBySheet(wb.getSheet("Employee表"), Employee.class); } List<Department> deplist = new ArrayList<>(); //获取导入的职工的集合 if ( wb.getSheet("Department表")!=null ) { deplist = (List<Department>) ie.getListBySheet(wb.getSheet("Department表"), Department.class); }}
导入功能类
- 方式一:根据实体类的 Field 的类型来判断处理
- 方式二:根据Cell 类型 判断处理
- 单元格类型 描述
CELL_TYPE_BLANK 代表空白单元格
CELL_TYPE_BOOLEAN 代表布尔单元(true或false)
CELL_TYPE_ERROR 表示在单元的误差值
CELL_TYPE_FORMULA 表示一个单元格公式的结果
CELL_TYPE_NUMERIC 表示对一个单元的数字数据
CELL_TYPE_STRING 表示对一个单元串(文本)
- 单元格类型 描述
public class ImportExcel { //通过工作簿 Sheet 获取对象的List集合 public List<?> getListBySheet( Sheet sheet,Class<?> clas ) { List<Object> list = new ArrayList<>(); Row rowtitle = sheet.getRow(0);//获得表头行 //列数 int colums = rowtitle.getPhysicalNumberOfCells(); //表头信息 List<String> title = new ArrayList<>(); for ( int i = 0 ; i < colums ; i++ ) { title.add( rowtitle.getCell(i).toString() ); } // 得到总行数 int rows = sheet.getLastRowNum(); for ( int i = 1 ; i <= rows ; i ++ ) { try { Row row = sheet.getRow(i); Object t = clas.newInstance(); Field []fields = clas.getDeclaredFields(); //通过 k 来处理Excel中对应属性和实体类中的不一致问题 for ( int j=0,k=0; j < fields.length ; j++,k++ ) { Field field = fields[j]; field.setAccessible(true); //有 NoExport 注解的 则让k-- ,保证不会有空列 if ( field.getAnnotation(NoExport.class) !=null ){ k--; continue; } if ( row == null ) { break; } Cell cell = row.getCell(k); switch (cell.getCellType()) { //数值类型 case Cell.CELL_TYPE_NUMERIC:{ // Date类型 if ( HSSFDateUtil.isCellDateFormatted(cell) ){ Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()); if ( field.getType()==Date.class ) {//Date 类型接收 Date类型 field.set ( t,date ); }else if ( field.getType()==String.class ) {//String 类型 接收 Date类型 field.set ( t , new SimpleDateFormat("yyyy-MM-dd").parse(cell.getStringCellValue() ) ); } } else { //纯数值 if ( field.getType()==Integer.class ) {//Integer 类型接收 纯数值 String str = cell.toString(); //去掉 结尾为.0的情况 正常小数 不会去掉有精度意义的小数 if ( str!=null && !"".equals(str.trim()) ) { String []strs = str.split("\\."); if ( strs.length > 1 && "0".equals(strs[1]) ) { str=strs[0]; } } field.set(t, Integer.parseInt(str) ) ; } else if ( field.getType()==String.class ) { //String 类型接收 纯数值 field.set(t, String.valueOf( cell.getNumericCellValue() ) ) ; } } break; } // 字符串类型 case Cell.CELL_TYPE_STRING : { if ( field.getType() == Date.class ) { //Data类型接收String Date date = new SimpleDateFormat("yyyy-MM-dd").parse(cell.getStringCellValue()); field.set(t,date); } else if ( field.getType()==Integer.class ) { //Integer 类型接收 String field.set(t,Integer.parseInt(cell.getStringCellValue())); } else { field.set(t,cell.getStringCellValue()); } break; } //空值的情况 可以抛异常 也可以 设空值 case Cell.CELL_TYPE_BLANK : { field.set(t,null); break; } } //以下 为 以实体类中 属性为基准// if ( row.getCell(k)==null ){// field.set(t, null);// }else {// if ( field.getType()==Integer.class ){// if ( cell.getCellType()==HSSFCell.CELL_TYPE_STRING ) {// field.set(t, Integer.parseInt( cell.getStringCellValue() ) ) ;// }// if ( cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC ) {// field.set(t, Integer.valueOf((int) (cell.getNumericCellValue()) )) ;// }// }else if ( field.getType()==Date.class ) {// if ( cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC ){// field.set(t, HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));// }// if ( cell.getCellType()==HSSFCell.CELL_TYPE_STRING ) {// field.set(t, new SimpleDateFormat("yyyy-MM-dd").parse(cell.getStringCellValue()) );// }// }else {// String str = cell.toString();// //去掉 结尾为.0的情况 正常小数 不会去掉有精度意义的小数// if ( str!=null && !"".equals(str.trim()) ) {// String []strs = str.split("\\.");// if ( strs.length > 1 && "0".equals(strs[1]) ) {// str=strs[0];// }// }// }// } } list.add(t); } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return list; }}
阅读全文
2 0
- poi 导入Excel封装 并处理数据类型
- POI导入Excel并处理数据
- Java POI 导入Excel并解析
- POI Excel操作与数据类型处理
- SpringMvc+POI 处理Excel的导入操作
- SpringMvc+POI 处理Excel的导入操作
- POI 处理Excel的导入操作
- SpringMvc+POI 处理Excel的导入操作
- SpringMvc+POI处理excel表数据导入
- SpringMvc+POI 处理Excel的导入操作
- poi实现根据excel模板,生成excel并导入数据
- POI 导入excel数据自动封装成model对象--介绍
- POI 导入excel数据自动封装成model对象--代码
- 基于 POI 封装 ExcelUtil 精简的 Excel 导入导出
- java简易excel导入导出工具(封装POI)
- java简易excel导入导出工具(封装POI)
- JAVA使用poi进行EXCEL模板导入导出,XSSFCell数据类型
- 封装poi导出EXCEL
- linux下使用glob()实现打开任意目录下的所有文件
- python,UPD,socket(一) 使用udp 发送消息
- CentOS通过yum安装Mariadb(MySQL)无法启动服务或者找不到mysql.sock(2)
- 文章标题
- CPP
- poi 导入Excel封装 并处理数据类型
- 51nod 1213 二维曼哈顿距离最小生成树
- hdoj 1015 Safecracker
- 将自己已有的github库迁移到ubuntu系统下
- [CDN 技术] HTTP参数中Etag的重要性
- Bone Collector -简单01背包
- 一次应用访问数据库 IP 配成外网 IP 引发的血案
- [已解决]Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()'
- 约瑟夫环,数三退一类问题(数组解法)