资讯专栏INFORMATION COLUMN

批量导入数据(excel表格)写入数据库

darkbaby123 / 3499人阅读

摘要:批量导入数据库思想之一页面上传表格后台解析表格的数据暂放数据结构中或自己看情况处理,再把里面的数据批量存入数据库。

批量导入数据库思想之一:页面上传excel表格后台解析excel表格的数据暂放数据结构中(list或Map,自己看情况处理),再把list里面的数据批量存入数据库。直接贴代码:

前端:

文件描述:
请选择文件:

controller中:
// 上传文件会自动绑定到MultipartFile中


 @RequestMapping(value="/upload",method=RequestMethod.POST)
     public String upload(HttpServletRequest request,
            @RequestParam("description") String description,
            @RequestParam("file") MultipartFile file) throws Exception{
         
        System.out.println(description);
        // 如果文件不为空,写入上传路径
        if(!file.isEmpty()){
            // 上传文件路径
            String path = request.getServletContext().getRealPath(
                    "/images/");
            // 上传文件名
            String filename = file.getOriginalFilename();
            File filepath = new File(path,filename);
            // 判断路径是否存在,如果不存在就创建一个
            if (!filepath.getParentFile().exists()) { 
                filepath.getParentFile().mkdirs();
            }
            // 将上传文件保存到一个目标文件当中
            file.transferTo(new File(path+File.separator+ filename));
            
            //解析excel表格的数据
            List excelPdList = (List)ObjectExcelRead.readExcel(path, filename, 2, 1, 0, "#.####");
            for(PageData ca:excelPdList){
                System.out.println(StringUtils.trimToEmpty(ca.getString("var1")));
                System.out.println(StringUtils.trimToEmpty(ca.getString("var2")));
                System.out.println(StringUtils.trimToEmpty(ca.getString("var3")));
            }
            return "success";
        }else{
            return "error";
        }
         
     }
     
     
     
     
     解析数据的方法如下:
         public class ObjectExcelRead {

    protected static Logger logger = Logger.getLogger(ObjectExcelRead.class);
    /**
     * 
     * @param filepath 文件路径
     * @param filename 文件名
     * @param startrow 开始行号 从0开始
     * @param startcol 开始列号 从0开始
     * @param sheetnum sheet
     * @param format double型小数据点保留位数,如: #.##
     * @return
     */
    public static List readExcel(String filepath, String filename, int startrow, int startcol, int sheetnum, String format) throws Exception {
        List varList = new ArrayList();

        try {
            HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(filepath, filename)));
            HSSFSheet sheet = workbook.getSheetAt(sheetnum);                     //sheet 从0开始
            int rowNum = sheet.getLastRowNum() + 1;                     //取得最后一行的行号

            for (int i = startrow; i < rowNum; i++) {                    //行循环开始
                PageData varpd = new PageData();
                HSSFRow row = sheet.getRow(i);                             //行
                if(row==null) break; //中间如果有空行,则退出
                int cellNum = row.getLastCellNum();                     //每行的最后一个单元格位置

                for (int j = startcol; j < cellNum; j++) {                //列循环开始
                    HSSFCell cell = row.getCell(Short.parseShort(j + ""));
                    String cellValue = getCellValue(cell, format);
                    varpd.put("var"+j, cellValue);
                }
                varList.add(varpd);
            }
            workbook.close();
        } catch (Exception e) {
            logger.error("解析Excel文件出错", e);
            throw e;
        }
        return varList;
    }
    
    
    public static String getCellValue(HSSFCell cell, String format) {
        if(cell==null)
            return "";
        
        String cellValue="";
        switch(cell.getCellType()){
            case HSSFCell.CELL_TYPE_NUMERIC : //数值类型
            case HSSFCell.CELL_TYPE_FORMULA://公式
                if (HSSFDateUtil.isCellDateFormatted(cell)) { // 判断是日期类型
                    SimpleDateFormat dateformat = new SimpleDateFormat("yyyy/MM/dd");
                    Date dt = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());// 获取成DATE类型
                    cellValue = dateformat.format(dt);
                }else{
                    //非日期格式
                    Long longVal = Math.round(cell.getNumericCellValue()); 
                    Double doubleVal = cell.getNumericCellValue();
                    if(Double.parseDouble(longVal + ".0") == doubleVal){   //判断是否含有小数位.0 
                        cellValue=String.valueOf(longVal);
                    } 
                    else{ 
                        DecimalFormat df = new DecimalFormat(format);    //格式化为N位小数 
                        cellValue=df.format(doubleVal);   //返回String类型
                    }
                }
                break;
                
            case HSSFCell.CELL_TYPE_BOOLEAN:
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            
            case HSSFCell.CELL_TYPE_STRING:
                cellValue = String.valueOf(cell.getStringCellValue());
                break;
            
            case HSSFCell.CELL_TYPE_ERROR:
                cellValue = String.valueOf(cell.getErrorCellValue());
                break;
            
            //case HSSFCell.CELL_TYPE_FORMULA:
            //    cellValue = String.valueOf(cell.getNumericCellValue()); //如果是日期,取到的是个数值,改为和CELL_TYPE_NUMERIC一起处理
                //cellValue = String.valueOf(cell.getCellFormula()); //取到的是个公式,不是具体值
            //    break;
            case HSSFCell.CELL_TYPE_BLANK:
                cellValue = "";
                break;
        }
        return cellValue;    
    }
    
    
}

运行后直接在控制台上看效果:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66872.html

相关文章

  • java实现excel导入,并将错误的以链接形式返回,可供下载

    摘要:基于编程思想,在框架下,将逻辑复杂的代码放在层下,层只负责调用。 基于MVC编程思想,在springMVC框架下,将逻辑复杂的代码放在manager层下,controller层只负责调用manager。(注:前端使用jQuery-file-upload插件) controller层 @RequestMapping(value = import_cust_user) @ResponseB...

    CarterLi 评论0 收藏0
  • Python使用第三方库xlrd获取Excel表格中的字段并生成SQL文件

    摘要:之前写过一篇使用脚本生成文件的文章,时隔很久这种终于有空写该库的兄弟库,用来读取文件。 之前写过一篇使用Python脚本生成Excel文件的文章,时隔很久这种终于有空写该库的兄弟库xlrd,用来读取Excel文件。最近被调到电商项目,由于种种原因(设计不完善、SQL语句书写不规范,甲方太奇葩...槽点太多,就不在这里吐槽了)需要经常进行刷数据操作(批量修改错误数据),一般就是写一写SQ...

    baishancloud 评论0 收藏0
  • Excel快速批量导入生产Cavns并生成图片下载到本地

    摘要:然后封面就一个一个下啦是不是很方便具体源代码在上有用的话记得星星 有时候会有这样的需求吧 有一个表格里面有一批数据需要批量生成封面我们在浏览器里可以批量生成比如 showImg(https://segmentfault.com/img/bV67kB?w=2308&h=996); 我们有这样一个表格需要生成图书封面 showImg(https://segmentfault.com/img...

    SillyMonkey 评论0 收藏0
  • POI实现将导入Excel文件

    摘要:获取表格数据获取表格中的数据分为以下几步获取表格获取某一行获取这一行中的某个单元格代码实现获取第一个张表获取每行中的字段获取行获取单元格中的值持久化获取出单元格中的数据后,最后就是用数据建立对象了。获取行获取单元格中的值持久化相关参考 问题描述 现需要批量导入数据,数据以Excel形式导入。 POI介绍 我选择使用的是apache POI。这是有Apache软件基金会开放的函数库,他会...

    cheng10 评论0 收藏0
  • 论如何把后台管理系统写出花

    摘要:知识在于分享,也是希望和大家交流下,如何把后台管理系统写得能更具工程化,模块化,更有效率。后台管理系统多为端,所以和的技术运用不多,会根据产品需求进行优雅降级和渐进增强。 前两天看segmentfault的时候,突然间,想写篇文章总结一下那些年自己写过的后台管理系统。作为我前端的入门项目,我对后台管理系统的感情还是挺深的。本着以下几点原因,写了此文。 对后台管理系统做一个综合全面的总...

    sugarmo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<