导入excle数据将excle数据插入到数据库

实现功能是,用户可以直接导入对应数据,或者用户下载模板,填写数据,导入模板数据。easyui实现

前台页面

                                    {
                                        text : ‘日清导入‘,
                                        iconCls : ‘icon-print‘,
                                        handler : function(){
                                            $(‘#import‘).dialog(‘open‘);
                                        }

                                    }
        <div id = "import" title="员工信息导入" modal=true draggable=true align="center" class="easyui-dialog" closed=true style="width: 400px">
        <form id="importForm" method="post" enctype="multipart/form-data">
        <table id="importTable" align="center">
        <tr>
        <td align="center" colspan="2">
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上传:<input id = "myFile" name="myFile" type="file"></input>
        </td>

         </tr>

        <tr>
            <td align ="center" colspan="2"><a id="download" href="<%=basePath %>import_template/template-dayrecruit.xls" class="easyui-linkbutton" >模板下载</a>&nbsp;&nbsp;&nbsp;
                        <a id="upload" class="easyui-linkbutton">上传</a>&nbsp;&nbsp;&nbsp;
                        <a id="importCancel" class="easyui-linkbutton">取消</a>&nbsp;&nbsp;</td>
        </tr>
        </table>
        </form>
        </div>

以上代码加颜色的是特别注意的点。上传文件一定加这些声明,否则不可实现。点击模板下载可以直接在我们根路径下找到模板,并下载。

具体的后台代码是:

@RequestMapping(value = "/imp", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
public @ResponseBody String imp(@RequestParam MultipartFile myFile,//这里会直接以流文件形式接收上传数据
        HttpServletRequest request, HttpSession session) throws Exception {

    Account account = this.getStaticAccount();
    if (myFile == null || myFile.getSize() == 0) {
        return "未选择任何文件,请选择文件后上传!";
    }
    String fileType = myFile.getOriginalFilename().substring(
            myFile.getOriginalFilename().lastIndexOf("."));
    if (!fileType.equals(".xls") && !fileType.equals(".xlsx")) {
        return "文件格式错误,请上传.xls或.xlsx格式文件!";
    }
    //String path = CommonsMethod.getProjectPath() ;
    String path=request.getSession()
            .getServletContext().getRealPath("/")
            + "/importReserveExcel/";
    String fileattr = CommonsMethod.getNowCorrect2Millisecond()
            + myFile.getOriginalFilename().substring(
                    myFile.getOriginalFilename().lastIndexOf("."));
    final File targetFile = new File(path, fileattr);
    if (!targetFile.exists()) {
        targetFile.mkdirs();
    }
    try {
        myFile.transferTo(targetFile);
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    ArrayList<Object> dataList = new ArrayList<Object>();
    try {
        dataList = dayRecruitService.readExcel(
                targetFile.getAbsolutePath(), 4);
    } catch (Exception e) {
        return e.getMessage();
    }
    try {
        String failImport = dayRecruitService.importDayrecruit(
                dataList, account);
    } catch (RuntimeException e) {
        return e.getMessage();
    } catch (Exception e) {
        return "请仔细核对上传格式(参考备注)";
    }
    return "上传成功";
}

private static final String[] headers = new String[] {"日清日期","备注","面试人数","入职人数","招聘企业"};

readExcel代码:把数据先读到一个dayrecruit模板中 原因是当前读的数据不是直接向数据库中存的数据。

public ArrayList<Object> readExcel(String absolutePath, int i)throws Exception {
        // TODO Auto-generated method stub

        ExcelOperations oper = new ExcelOperations();
        ArrayList<Object> list = oper.readExcel(absolutePath,
                Template_DayRecruit.class, columnHeaders,i );

        return list;
    }

    public static final String[] columnHeaders = { "date",
        "remarks", "viewerNu",
        "entryNu", "customerName"};

正式读取excle数据代码为

public ArrayList<Object> readExcel(String filePath, Class entity,
            String[] columnHeads, int noReadSize) throws Exception {
        ArrayList<Method> list = new ArrayList<Method>();
        ArrayList<Object> objs = new ArrayList<Object>();

        try {
            for (int i = 0; i < columnHeads.length; i++) {
                char f = columnHeads[i].charAt(0);
                if (!Character.isUpperCase(f)) {
                    columnHeads[i] = String.valueOf(Character.toUpperCase(f))
                            + columnHeads[i].substring(1);
                }
                Method methodGet = entity.getMethod("get" + columnHeads[i]);
                Method methodSet = entity.getMethod("set" + columnHeads[i], methodGet.getReturnType());
                list.add(methodSet);
            }
            InputStream inputstream = new FileInputStream(filePath);
            Workbook wb = WorkbookFactory.create(inputstream);
            Sheet sheet1 = wb.getSheetAt(0);
            for (int i = 1; i <= sheet1.getLastRowNum() - noReadSize; i++) {
                try {

                    Object obj = entity.newInstance();
                    Cell cell = null;
                    for (int k = 0; k < list.size(); k ++) {
                        cell = sheet1.getRow(i).getCell(k);
                        if(cell.getCellType() == 0){
                        //判断是否为日期
                        if(HSSFDateUtil.isCellDateFormatted(cell)){
                            SimpleDateFormat sdf = null;
                            if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
                                    .getBuiltinFormat("h:mm")) {
                                sdf = new SimpleDateFormat("HH:mm");
                            } else {// 日期
                                sdf = new SimpleDateFormat("yyyy-MM-dd");
                            }
                            Date date = cell.getDateCellValue();
                            cell.setCellValue(sdf.format(date)); 

                        }else{
                                double value = cell.getNumericCellValue();
                                CellStyle style = cell.getCellStyle();
                                DecimalFormat format = new DecimalFormat();
                                String temp = style.getDataFormatString();
                                // 单元格设置成常规
                                if (temp.equals("General")) {
                                    format.applyPattern("#");
                                }
                                cell.setCellValue(format.format(value)); 

                        }
                        }
                        list.get(k).invoke(obj, cell.toString());
                    }
                    objs.add(obj);
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new Exception("Excel 文件第" + i + "行格式错误");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        return objs;
    }

然后调用import方法,里面会验证需要验证的数据。如果有一条没有通过验证那么所有的数据将会回滚操作。这主要牵扯到了事务管理。

    public String importDayrecruit(List<Object> dataList, Account user)
            throws Exception {

        String failImport = "";
        if (dataList != null && dataList.size() > 0) {    

            //根据公司user找到对应公司 根据公司找到对应的 招聘企业 根据招聘企业
            Organization org = dayRecruitDAO.findOrganizationById(user.getOrganization().getId());

            List<EnterpriseCustomer> customers = dayRecruitDAO.findAllEnterpriseCustomerByOrg(user.getOrganization().getId());

            for (int i = 0; i < dataList.size(); i++) {
                DayRecruit dayRec = new DayRecruit();
                Template_DayRecruit t_dayRecruit = new Template_DayRecruit();
                t_dayRecruit = (Template_DayRecruit) dataList.get(i);
                dayRec.setWriter(user.getLoginName());
                dayRec.setDatatime(new Date());
                dayRec.setRemarks(t_dayRecruit.getRemarks().trim());
                //dayRec.
                //验证招聘日期
                if(isValidDate(t_dayRecruit.getDate().trim()) && StringUtils.isNotBlank(t_dayRecruit.getDate().trim())){
                     dayRec.setDate(t_dayRecruit.getDate().toString());

                }else throw new RuntimeException("第" + (i + 2)
                        + "行填写招聘日清日期有误,请重新确定");
                //验证填写人
/*                if(StringUtils.isNotBlank(dayRec.getWriter()) && dayRec.getWriter().equals(user.getUserName())){
                    dayRec.setWriter(dayRec.getWriter().trim());
                }
                else{
                    throw new RuntimeException("第" + (i + 2)
                            + "行填写输入人有误,请填写您的登录账号,请重新确定");
                }*/
                //验证面试人数
                if(isNumeric(t_dayRecruit.getViewerNu().trim()) && StringUtils.isNotBlank(t_dayRecruit.getViewerNu().trim())){
                    dayRec.setViewerNu(t_dayRecruit.getViewerNu().trim());
                }
                else throw new RuntimeException("第" + (i + 2)
                        + "行填写面试人数有误,请重新确定");
                //验证入职人数
                if(isNumeric(t_dayRecruit.getEntryNu().trim()) && StringUtils.isNotBlank(t_dayRecruit.getEntryNu().trim())){

                int  re =     Double.valueOf(t_dayRecruit.getEntryNu().trim()).compareTo(Double.valueOf(t_dayRecruit.getViewerNu().trim()));
                  if(re <1){
                    dayRec.setEntryNu(t_dayRecruit.getEntryNu().trim());    }
                  else {
                      throw new RuntimeException("第" + (i + 2)
                                + "行入职人数大于面试人数,请重新确定");
                }
                }
                else throw new RuntimeException("第" + (i + 2)
                        + "行填写入职人数有误,请重新确定");

                //验证招聘企业  从模板中获取招聘企业的名字 查询出 此公司所有的招聘企业 对应的话  取 招聘企业这个对象赋值给dayR

                // 验证所属公司
                if(StringUtils.isNoneBlank(t_dayRecruit.getCustomerName().trim())){
                    boolean isOK = false;
                    if(customers != null && customers.size()>0){
                    for(int j =0;j<customers.size();j++){
                    if(customers.get(j).getEnterpriseName().equals(t_dayRecruit.getCustomerName().trim())){

                        dayRec.setCustomer(customers.get(j));
                        isOK = true;
                        break;//跳出当前循环
                    }

                }

                }
                    if (!isOK) {
                        throw new RuntimeException("第" + (i + 2)
                                + "行招聘企业输入有误,请重新确定");
                    }
                }

                dayRecruitDAO.add(dayRec);
            }
        } else {
            throw new RuntimeException("导入数据为空");
        }
        return failImport;
    }

这样数据就插入到对应数据库。完成导入操作。

时间: 2024-10-30 04:48:51

导入excle数据将excle数据插入到数据库的相关文章

winform导出datagridview数据到excle

if (dgvResult.Rows.Count == 0) { MessageBox.Show("列表为空"); } //创建Excel对象 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); excel.Application.Workbooks.Add(true); // 生成字段名称 excel.Cells[1, 1] = &qu

【Excle数据透视】二维数据如何创建数据透视表

二维数据在创建数据透视表的时候,可能会给你带来一些麻烦,没法创建,会丢失维度,那怎么办呢? 解决办法:使用数据透视表和数据透视图向导即可创建 步骤1 按下[Alt+D+P],出现如下界面 选择上图中的"多重合并计算数据区域"→下一步 创建单页字段→下一步 选定区域A:A15→添加→下一步 单击完成 数据透视表已经创建完成.二维数据透视表与一维数据透视表在于"行合计" 注意:我上图的数据透视是使用默认计数,所以全部都是1,这个可以根据自己的需求进行调整.

使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中. 1.问题背景 使用Sqoop把oracle数据库中的一张表,这里假定为student,当中的数据导入到hdfs中,然后再创建hive的external表,location到刚才保存到hdfs中数

C# 将DataTable表中的数据批量插入到数据库表中的方法

C#中有时候需要将内存中的数据批量插入到数据库表中,使用for循环进行批量插入不但耗时而且会频繁操作数据库. 针对数据量很少的可以使用for循环插入,但是针对于数据量大的则不推荐使用for循环插入,推荐使用sql的块处理插入. 块处理不但耗时少而且不会频繁对数据库进行操作,只是需要注意的一点是DataTable中的列必须与表的列完全一致. 如下代码是批量插入的一个函数,自测可用. 1 #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 2 /// <summa

数据从Excel数据导入到数据库的excel操作控件Spire.XLS for .NET

Spire.XLS for .NET控件是e-iceblue公司开发的一款支持对所有Excel格式类型文件进行操作的.NET 控件.它适用于任何类型的应用程序比如ASP.NET Web应用程序或者Windows桌面应用程序.Spire.XLS for .NET允许软件开发人员创建和管理Excel,而不需要安装Microsoft Excel或者Microsoft Office Excel.Spire.XLS for .NET和微软公司无隶属关系,也没有授权,赞助关系.相比Microsoft,Spi

jquery easyui+sparkline插件+jqplot插件实现数据表行内插入线形图

Jquery easyui : 实现前端数据包格式化输出,支持多种模块式定义,只需要添加相应的预设参数即可实现丰富的前端. 资料参考: http://www.jeasyui.com/ Jquery sparkline: 基于jQuery 的js插件,底层调用html5的canvas标签,并通过js动态实现在数据表行内画条形图或趋势图,操作简单,可实现不同类型的图形化,如线形图,饼状图,柱形图. 资料参考:http://omnipotent.net/jquery.sparkline/#s-docs

Java利用POI导入导出Excel中的数据

     首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地址http://poi.apache.org/download.html,有兴趣的朋友也可以去看看其中的API.      下面分享一下在对POI进行基本操作时觉得需要注意的两点:       1.POI中针对xlsx/xls是需要create different Workbook instance

poi excel批量导入 解决各类型的数据

String value=this.getValue((HSSFCell) row.getCell(position)) 数字类型  时间类型 字符串类型验证没问题, 数字类型如果是1234.0会将其变成1234  如果是1234.5保存仍然保持小数位1234.5,用来解决电话号码和普通数字问题 时间类型将其格式化成了 2015-12-09 12:13:12这种格式便于保存数据库 //解决类型问题,获得数值 public String getValue(HSSFCell cell) { Stri

Java - Excel 导入 导出,报无效数据

用Java,做了套后台账号管理系统,内有Excel导入导出模块 后台管理员登录后,可以通过<input type="file">,读取指定格式的Excel工作薄 系统会解析读取到的Excel,获取工作薄中,各工作表的数据 当然,如果 上传文件,不是Excel文件,则会显示上传失败 或是 是Excel文件,但其内工作表的数据不符合要求,则会将不符合要求的数据行,自动过滤掉 问题来了: 记得以前测试的时候,是没问题的,但今天,把导出文件,再次导入时,就一直报无效数据 (别提当时

mysql通过sqoop导入到hbase中时数据量为1000w时出现Incorrect key file for table &#39;/tmp/#sql_458_0.MYI&#39;; try to repair it

问题:mysql通过sqoop导入到hbase中时数据量为1000w时出现Incorrect key file for table '/tmp/#sql_458_0.MYI'; try to repair it,数据量为100w等时没该问题 分析:出现该问题时因为mysql的临时目录(默认为/tmp)太小 解决方法:参考:http://blog.sina.com.cn/s/blog_4c197d420101bdn9.html mysql通过sqoop导入到hbase中时数据量为1000w时出现I