spring mvc 从excel导入数据

如题,从excel导入数据到数据库,支持.xls和.xlsx后缀。
用的是poi。
不多说了,具体代码如下:

/** * 上传excel文件 * @param tableId 上传数据到那个表的表id * @return 返回一个对象,包括上传是否成功的状态 * @author zhengjiang * @Time 2016年3月8日 */
    @RequestMapping("/uploadExcel/{tableId}")
    @ResponseBody
    public Object uploadExcel(@PathVariable String tableId){
        try{
            CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
            if(multipartResolver.isMultipart(request))
            {
                MultipartHttpServletRequest multiRequest = multipartResolver.resolveMultipart(request);
                Iterator<String> iter = multiRequest.getFileNames();
                while (iter.hasNext())
                {
                    int pre = (int) System.currentTimeMillis();
                    //取得上传文件
                    MultipartFile file = multiRequest.getFile(iter.next());
                    if (file != null) {
                        return this.readExcel(file.getInputStream(), tableId);
                    }
                    else
                    {
                        return new Object(){public boolean success = false;public String url = "";public String msg = "无法读取文件"; };
                    }
                }
            }
            return new Object(){public boolean success = false;public String url = "";public String msg = "上传文件失败"; };
        }
        catch (Exception e) {
            return e;
        }
    }

    /** * 把excel文件的数据导入数据库 * @param tableId 上传数据到那个表的表id * @return 返回一个对象,包括上传是否成功的状态 * @author zhengjiang * @Time 2016年3月15日 */
    private Object readExcel(InputStream is,String tableId){
        try{
            String tableName = this.getTableNameByTable(tableId);
            HashMap map = this.getTableFieldsByTableId(tableId);
            Workbook wb = this.create(is);
            Sheet sheet = wb.getSheetAt(0);
            //表名不能为空
            if(tableName == null || tableName == "")
            {
                return new Object(){public boolean success = false;public String msg = "找不到当前id下的图层"; };
            }

            //必须存在xy轴
            if(!map.containsKey("x") || !map.containsKey("y"))
            {
                return new Object(){public boolean success = false;public String msg = "导入数据失败。图层必须包括X、Y轴,而当前图层表结构缺省X、Y轴"; };
            }

            Iterator<Row> rows = sheet.rowIterator(); //获得第一个表单的迭代器
            Row row0 = sheet.getRow(0);
            while (rows.hasNext()) {
                //获得行数据
                //获得行号从0开始
                Row row = rows.next();
                int rowNum = row.getRowNum();
                if(rowNum == 0) continue;

                //获得第一行的迭代器
                Iterator<Cell> cells = row.cellIterator();
                String str = "";
                while (cells.hasNext()) {
                    Cell cell = cells.next();
                    int colNum = cell.getColumnIndex();
                    Object object = "";
                    //根据cell中的类型来输出数据
                    switch (cell.getCellType()) {
                        case HSSFCell.CELL_TYPE_NUMERIC:
                            //读取数据的时候会把时间当数字,要再判断一下类型
                            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                Date d = cell.getDateCellValue();
                                long dd = d.getTime();
                                object = map.get(row0.getCell(colNum).getStringCellValue()) + ":{$date:" + dd + "}" ;
                            }else {
                                object = map.get(row0.getCell(colNum).getStringCellValue()) + ":" + cell.getNumericCellValue();
                            }
                            break;
                        case HSSFCell.CELL_TYPE_STRING:
                            object = map.get(row0.getCell(colNum).getStringCellValue()) + ":\"" + cell.getStringCellValue()+"\"";
                            break;
                        case HSSFCell.CELL_TYPE_BOOLEAN:
                            object = map.get(row0.getCell(colNum).getStringCellValue()) + ":" + cell.getBooleanCellValue();
                            break;
                        case HSSFCell.CELL_TYPE_FORMULA:
                            object = map.get(row0.getCell(colNum).getStringCellValue()) + ":" + cell.getCellFormula();
                            break;
                        default:
                            System.out.println("unsuported sell type");
                            break;
                    }
                    if(str == ""){
                        str = object.toString();
                    }else {
                        str += "," + object;
                    }
                }
                //数据库具体操作
                data d = new data();
                str = "{" + str + "}";
                HttpSession session = request.getSession();
                if(session.getAttribute("loginUserName") == null) return null;
                String loginUserName = session.getAttribute("loginUserName") + "";
                d.Insert(tableName,str,loginUserName);
            }
            return new Object(){public boolean success = true;public String msg = "数据上传完成"; };
        }
        catch (Exception ex){
            return new Object(){public boolean success = false;public String msg = ex.getMessage(); };
        }
    }

    /** * 根据表id获取表名 * @param tableId 上传数据到那个表的表id * @return 表名 * @author zhengjiang * @Time 2016年3月15日 */
    private String getTableNameByTable(String tableId) {
        data d = new data();
        String sqlStr = "{\"_id\":{\"$oid\":\"" + tableId + "\"}}";
        return d.getTableColumnByTableId("collectionList",sqlStr,"name").toString();
    }

    /** * 不同的文件格式创建不同的Workbook * @param inp 输入数据流 * @return Workbook对象 * @author zhengjiang * @Time 2016年3月15日 */
    private static Workbook create(InputStream inp) throws IOException,InvalidFormatException {
        if (!inp.markSupported()) {
            inp = new PushbackInputStream(inp, 8);
        }
        //.xls
        if (POIFSFileSystem.hasPOIFSHeader(inp)) {
            return new HSSFWorkbook(inp);
        }
        //.xlsx
        if (POIXMLDocument.hasOOXMLHeader(inp)) {
            return new XSSFWorkbook(OPCPackage.open(inp));
        }
        throw new IllegalArgumentException("你的excel版本目前poi解析不了");
    }

    /** * 创建以图层字段别名为key,字段名为value的键值对 * @param tableId 表id * @return 键值对 * @author zhengjiang * @Time 2016年3月21日 */
    private HashMap getTableFieldsByTableId(String tableId)
    {
        HashMap map = new HashMap();
        map.put("x","x");
        map.put("y","y");

        data d = new data();
        String sqlStr = "{\"_id\":{\"$oid\":\"" + tableId + "\"}}";
        //调用data的getTableColumnByTableId获取表结构的字段信息,因为他是一个对象,所以可以直接转成Document对象
        Document doc = (Document)d.getTableColumnByTableId("collectionList",sqlStr,"fieldInfo");
        //因为字段信息的字段列表是一个Document类型的集合,所以直接构造一个ArrayList<Document>
        ArrayList<Document> docs = new ArrayList<Document>(doc.get("fields",List.class));
        for (Document document:docs) {
            map.put(document.get("alias"),document.get("name"));
        }
        return map;
    }

你可能感兴趣的:(spring,mvc,Excel)