java Excel导入、自适应版本、将Excel转成List<map>对象
2017-02-28 13:39
381 查看
最近在web开发中遇到excel批量导入,在网上搜了下很少有将excel直接转成java 对象的例子于是自己写了一个。
![](https://img-blog.csdn.net/20170228133500761?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjY2MjM1Nw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
最后返回的数据可以用fastjson直接转成java bean
/** * Excel文件流 --> List <Map<String,Object>> 对象 想直接转成java bean的朋友可以使用fastjson将 List<Map<String,Object>>转成bean对象 * */ public class ImportExcelUtil { private static Logger log = Logger.getLogger(ImportExcelUtil.class); private final static String excel2003L = ".xls"; // 2003- 版本的excel private final static String excel2007U = ".xlsx"; // 2007+ 版本的excel /** * 将流中的Excel数据转成List<Map> * * @param in * 输入流 * @param fileName * 文件名(判断Excel版本) * @param mapping * 字段名称映射 * @return * @throws Exception */ public static List<Map<String, Object>> parseExcel(InputStream in, String fileName, Map<String, String> mapping) throws Exception { // 根据文件名来创建Excel工作薄 Workbook work = getWorkbook(in, fileName); if (null == work) { throw new Exception("创建Excel工作薄为空!"); } Sheet sheet = null; Row row = null; Cell cell = null; // 返回数据 List<Map<String, Object>> ls = new ArrayList<Map<String, Object>>(); // 遍历Excel中所有的sheet for (int i = 0; i < work.getNumberOfSheets(); i++) { sheet = work.getSheetAt(i); if (sheet == null) continue; // 取第一行标题 row = sheet.getRow(0); String title[] = null; if (row != null) { title = new String[row.getLastCellNum()]; for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { cell = row.getCell(y); title[y] = (String) getCellValue(cell); } } else continue; log.info(JSON.toJSONString(title)); // 遍历当前sheet中的所有行 for (int j = 1; j < sheet.getLastRowNum() + 1; j++) { row = sheet.getRow(j); Map<String, Object> m = new HashMap<String, Object>(); // 遍历所有的列 for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { cell = row.getCell(y); String key = title[y]; // log.info(JSON.toJSONString(key)); m.put(mapping.get(key), getCellValue(cell)); } ls.add(m); } } work.close(); return ls; } /** * 描述:根据文件后缀,自适应上传文件的版本 * * @param inStr * ,fileName * @return * @throws Exception */ public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception { Workbook wb = null; String fileType = fileName.substring(fileName.lastIndexOf(".")); if (excel2003L.equals(fileType)) { wb = new HSSFWorkbook(inStr); // 2003- } else if (excel2007U.equals(fileType)) { wb = new XSSFWorkbook(inStr); // 2007+ } else { throw new Exception("解析的文件格式有误!"); } return wb; } /** * 描述:对表格中数值进行格式化 * * @param cell * @return */ public static Object getCellValue(Cell cell) { Object value = null; DecimalFormat df = new DecimalFormat("0"); // 格式化number String字符 SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd"); // 日期格式化 DecimalFormat df2 = new DecimalFormat("0"); // 格式化数字 switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: value = cell.getRichStringCellValue().getString(); break; case Cell.CELL_TYPE_NUMERIC: if ("General".equals(cell.getCellStyle().getDataFormatString())) { value = df.format(cell.getNumericCellValue()); } else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) { value = sdf.format(cell.getDateCellValue()); } else { value = df2.format(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_BOOLEAN: value = cell.getBooleanCellValue(); break; case Cell.CELL_TYPE_BLANK: value = ""; break; default: break; } return value; } public static void main(String[] args) throws Exception { File file = new File("D:\\studn.xls"); FileInputStream fis = new FileInputStream(file); Map<String, String> m = new HashMap<String, String>(); m.put("id", "id"); m.put("姓名", "name"); m.put("年龄", "age"); List<Map<String, Object>> ls = parseExcel(fis, file.getName(), m); System.out.println(JSON.toJSONString(ls)); } }
输出结果 [{"age":"13","id":"11","name":"张三"},{"age":"23","id":"21","name":"李四"},{"age":"33","id":"31","name":"王五"}] 用到的包 <org.poi-version>3.14</org.poi-version> <!-- Excel --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${org.poi-version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${org.poi-version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-examples</artifactId> <version>${org.poi-version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-excelant</artifactId> <version>${org.poi-version}</version> </dependency>
最后返回的数据可以用fastjson直接转成java bean
相关文章推荐
- java Excel导入、自适应版本、将Excel转成List<map>对象
- java从List<Map>导出excel
- JAVA POI Excel导出,数据源可以是List<Map>或者List<Model>类型
- 用 java 的 List<> 对象管理客户端连接的服务线程
- java list<map> 排序
- java利用list<Map>的value进行排序
- List<Map>写入Excel,poi操作
- Map对象与JavaBean互转,List<Map>与List<JavaBean>互转等
- Java中<list,set,map>的遍历与增强for循环
- Java中List<Map>的排序
- Excel通用导出List<Object>对象到excel文件
- 将List<Model>导入Excel中
- List<Map>转JSON对象
- java Json字符串转List<Map>类型
- scala调用java的方法,返回了一个对象链表List<Student>,在scala中遍历该链表获取指定Student的名字name
- java判断List<T>对象是否唯一、去重复
- java实现List<Object>转List<实体类>,java实现Object转对象,java实现Object转实体类
- c# 把List<T>转成DataTable对象,批量导入Sqlserver库
- mybatis调用oracle存储过程返回游标 读取到java的List<Map>
- JAVA源码分享:基于Apache POI,将List<T>内封装的实体类信息写出到磁盘Excel文件