spring mvc 从excel导入数据

news/2024/7/21 7:03:41 标签: 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;
    }

http://www.niftyadmin.cn/n/1246159.html

相关文章

shell 执行完kill -9后就不执行了_kill 与 kill -9 的区别

kill 和 kill -9 是常用的命令&#xff0c;都可以用来杀死进程。那 kill 与 kill -9 有什么区别呢&#xff1f;kill kill命令默认的信号就是15&#xff0c;也就是 kill -15 ,被称为优雅的退出。当使用kill -15时&#xff0c;系统会发送一个SIGTERM的信号给对应的程序。当程序接…

python库安装原理_还在为基础环境困扰?一文读懂Python机器学习库的打包安装原理...

尽管依赖问题非常棘手&#xff0c;但明白包管理以及包编译安装原理有助于我们深刻理解计算机基本原理&#xff0c;避免成为一个调包侠。最近在一台GPU机器上安装了LightGBM&#xff0c;主要是希望LightGBM能够利用GPU的算力进行加速&#xff0c;中间遇到GPU驱动以及CUDA等问题&…

视图count计数慢_SpringBoot视图层技术

springBoot整合Jsp创建 Maven 项目1、修改 pom.xml 文件<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.o…

Entity Framework创建与使用(图)

一、创建实体数据模型 1、新建项目>选择项目&#xff0c;添加>新建项&#xff0c;选择图中ado.net实体数据模型 2、选择 从数据库生成&#xff0c;下一步 3、点击新建连接 4、在打开的窗口填写服务器地址&#xff08;本地是&#xff1a;.&#xff09;&#xff…

python中奇偶数怎么表示_python怎么对输出的奇数偶数排序?

我们从小学的时候就学习了奇数偶数&#xff0c;知道整数可以分成奇数和偶数两大类&#xff0c;能被2整除的数叫做偶数&#xff0c;不能被2整除的数叫做奇数。在我们python编程中&#xff0c;会遇到很多数字和代码&#xff0c;有的时候会很乱&#xff0c;不好操作。在遇到奇数偶…

IntelliJ IDEA 创建spring mvc项目(图)

本文主要介绍怎么在IntelliJ IDEA 创建spring mvc项目&#xff0c;导入jar文件&#xff0c;tomcat配置&#xff08;编辑器&#xff09;。 一、创建spring mvc项目 1、打开IntelliJ IDEA点击 创建新项目&#xff08;Create New Project&#xff09;&#xff0c;SDK选择&#x…

spring mvc 项目配置

本文介绍的spring mvc 项目配置要达到的目标是当访问网站静态资源的时候直接返回。 本项目视图选择原始的HTML&#xff0c;使用ajax访问后台控制器。 1、首先在src下面创建controller包&#xff0c;主要用来放控制器&#xff0c;看名字就知道了。 2、在网站根目录下面&#…

Tomcat8.0 项目部署

本文主要介绍怎么在tomcat8.0下面部署spring mvc项目。在部署项目之前需要把我们的项目打包一下&#xff08;war&#xff09;&#xff0c;实际上在点击编辑器运行的时候就一句生成了这个war包&#xff0c;不要额外工作&#xff0c;大概的路径是&#xff1a;C:\Users\John\IdeaP…