• 在做JavaWeb中添加数据使我们在所难免会遇到的,在大数据的环境下批量添加和批量删除是必须的,而批量删除只需要获取到我们需要删除的ID就可以了,在批量添加中我们就会遇到问题,问题是得到批量的数据,这就涉及到了poi技术中的Excel导入导出
  • 在前端中我们使用的Dropzone上传技术,在BootStrap中使用模态框显示Dropzone界面
  • <div class="ibox-content">

    <form id="my-awesome-dropzone" class="dropzone"

    action="${pageContext.request.contextPath}/change/assistantUpload.action">

    <div class="dropzone-previews"></div>

    <button type="submit" class="btn btn-primary pull-right">提交</button>

    </form>

    </div>

  • Dropzone技术特点就是可以将温江拖拽到画面里面,然后开始js工作在form表单提交之后开始到后台收取数据

  • 在后台的函数上面加上如下标记 就可以保证范文到制定的函数了
  • 然后我们需要制定上传的编码格式为UTF-8
  • 下面就是后台数据处理的部分

    `try {

    // 上传得请求对象

    MultipartHttpServletRequest req = (MultipartHttpServletRequest) request;

    // 获取上传的文件

    CommonsMultipartFile multipartFile = (CommonsMultipartFile) req

    .getFile(“upload”);

    // 获取文件的名称 xxx.jpg xxx_1000101897.jp

    String fileName = multipartFile.getOriginalFilename();

    String suffix = fileName.substring(fileName.lastIndexOf(“.”));

    // 声明excel文件对象

    Workbook wb = null;

    // 获取文件上传输入流对象

    InputStream is = multipartFile.getInputStream();

    // 判断文件的后缀名称

    if (“.xls”.equalsIgnoreCase(suffix)) {

    wb = new HSSFWorkbook(is);

    } else if (“.xlsx”.equalsIgnoreCase(suffix)) {

    wb = new XSSFWorkbook(is);

    }

        // 存储的班级名称
    List<String> clazzNames = new ArrayList<String>();
    // 存储的学号
    List<String> studnos = new ArrayList<String>();
    // 判断是否为null
    if (wb != null) {
    // 读取内容
    Sheet sheet = wb.getSheetAt(0);
    List<StudentCustom> students = new ArrayList<StudentCustom>();
    // 读取行数
    int rowNumber = sheet.getPhysicalNumberOfRows();
    // 遍历行数
    for (int row = 1; row < rowNumber; row++) {
    StudentCustom student = new StudentCustom();
    // 获取一行记录对象
    HSSFRow entity = (HSSFRow) sheet.getRow(row);
    // 获取列数
    int colNumber = entity.getPhysicalNumberOfCells();
    // 遍历列数
    for (int col = 0; col < colNumber; col++) {
    // 获取指定列
    HSSFCell cell = entity.getCell(col);
    // 声明当前列的值
    String value = "";
    Date date = null;
    // 判断是否为null
    if (cell != null) {
    // 判断单元格类型
    switch (cell.getCellType()) {
    // 数字类型
    case Cell.CELL_TYPE_NUMERIC:
    // 判断是否是日期类型
    if (HSSFDateUtil.isCellDateFormatted(cell)) { // 日期类型
    SimpleDateFormat sdf = new SimpleDateFormat(
    "yyyy-MM-dd");
    date = HSSFDateUtil.getJavaDate(cell
    .getNumericCellValue()); } else {
    // 获取数字
    Integer data = (int) cell
    .getNumericCellValue();
    if (col == 1) {
    HSSFCellStyle cellStyle = cell
    .getCellStyle();
    String format = cellStyle
    .getDataFormatString();
    DecimalFormat f = new DecimalFormat(
    format);
    value = f.format(data);
    } else {
    value = data.toString();
    }
    }
    break;
    // 判断是否是字符型
    case Cell.CELL_TYPE_STRING:
    value = cell.getStringCellValue();
    break;
    // 判断是否是boolean型
    case Cell.CELL_TYPE_BOOLEAN:
    Boolean data = cell.getBooleanCellValue();
    value = data.toString();
    break;
    // 错误类型
    case Cell.CELL_TYPE_ERROR:
    // System.out.println("单元格内容出现错误");
    value = "error";
    break;
    // 判断是否是公式类型
    case Cell.CELL_TYPE_FORMULA:
    value = String.valueOf(cell
    .getNumericCellValue());
    if (value.equals("NaN")) {// 如果获取的数据值非法,就将其装换为对应的字符串
    value = cell.getStringCellValue()
    .toString();
    }
    break;
    case Cell.CELL_TYPE_BLANK:
    // System.out.println("单元格内容 为空值 ");
    value = null;
    break;
    default:
    value = cell.getStringCellValue().toString();
    break;
    } //System.out.println(value); if (col == 1) {
    studnos.add(value);
    student.setStudno(value);
    // 默认密码
    student.setPass(value);
    } else if (col == 2) {
    student.setName(value);
    } else if (col == 3) {
    student.setSex(value);
    } else if (col == 4) {
    student.setEnrol(date);
    } else if (col == 5) {
    student.setEmail(value);
    } else if (col == 6) {
    if (!clazzNames.contains(value)) {
    clazzNames.add(value);
    }
    // 查询设置班级的id值
    Clazz clazz = new Clazz();
    clazz.setName(value);
    student.setClazz(clazz);
    }
    } }
    // 行结束
    students.add(student);
    } // 第一步检测班级是否存在
    // 查询出该用户管理的班级
    List<Clazz> clazzs = clazzService.selectByAssistanUserId(user
    .getId());
    // 班级的名称集合
    List<String> names = new ArrayList<String>();
    // 遍历班级
    for (Clazz clz : clazzs) {
    // 把班级名称加入到集合中
    names.add(clz.getName());
    }
    // 遍历excel中存在的班级
    for (String clazzName : clazzNames) {
    //System.out.println(clazzName);
    // 判断excel中的班级是否 存在班级集合中
    if (!names.contains(clazzName)) {
    throw new ClazzExitException("该用户不负责班级,或者班级不存在");
    }
    } // 第二步检测学号是否存在
    QueryVo vo = new QueryVo();
    int count = studentService.selectAdminStudentsCount(vo);
    vo.setStartSize(0);
    vo.setPageSize(count);
    // 查询出所有学生信息
    List<StudentCustom> stus = studentService.selectAdminStudents(vo); List<String> nos = new ArrayList<String>();
    // 遍历studnos学号,
    for (StudentCustom stu : stus) {
    // 把班级名称加入到集合中
    nos.add(stu.getStudno());
    }
    // 1.1如果excel中有重复的学号,也不可以插入 扩展
    for(int i =0;i<studnos.size();i++){
    for(int j=i+1;j<studnos.size();j++){
    if(studnos.get(i)==studnos.get(j)){
    throw new ExcelStuNoExitException(studnos.get(i)+"该学号在Excel存在重复");
    }
    }
    }
    // 检测查询的学号中是否含有该班级,如果含有 就跑出异常
    for (String no : nos) {
    System.out.println(no);
    // 判断excel中的班级是否 存在班级集合中
    if (studnos.contains(no)) {
    System.out.println(no);
    throw new StuNoExitException(no+"学号已存在");
    }
    } // excel解析结束
    // 按班级分好类
    Map<Clazz, List<StudentCustom>> map = new HashMap<Clazz, List<StudentCustom>>();
    // 批量保存学生信息 for (String clazzName : clazzNames) {
    List<StudentCustom> s = new ArrayList<StudentCustom>();
    Clazz clazz = clazzService.selectClazzName(clazzName);
    for(int i=0;i<students.size();i++){
    if(students.get(i).getClazz().getName()==clazzName)
    {
    students.get(i).setClazzId(clazz.getId());
    s.add(students.get(i));
    }
    }
    map.put(clazz, s);
    }
    transactionService.insertStudentsCustomFromExcel(map);
    // 同步更新班级的人数 } out.print("{\"msg\":\"success\"}");
    } catch (ClazzExitException ce) {
    out.print("{\"msg\":\""+ce+"\"}");
    } catch (ExcelStuNoExitException ce) {
    out.print("{\"msg\":\""+ce+"\"}");
    } catch (StuNoExitException ce) {
    out.print("{\"msg\":\""+ce+"\"}");
    } catch (Exception ex) {
    out.print("{\"msg\":\""+ex+"\"}");
    } finally {
    out.flush();
    out.close();
  • 另外值得一提的是在前端我们的需要因要到一段js来设置传送的接口
  • `function initUploadOptions(){

    Dropzone.options.myAwesomeDropzone = {

    method : ‘post’,

    paramName : ‘upload’,

    autoProcessQueue : false,

    uploadMultiple : false,

    maxFiles : 1,

    init : function() {

    var myDropzone = this;

    this.element.querySelector(“button[type=submit]”)

    .addEventListener(“click”, function(e) {

    e.preventDefault();

    e.stopPropagation();

    myDropzone.processQueue()

    });

    this.on(“sending”, function() {

    alert(“发送过程中”);

    });

    this.on(“success”, function(file, response) {

    alert(file + “成功” + response);

    var obj=eval(“(“+response+”)”);

    file.previewTemplate.appendChild(document

    .createTextNode(obj.msg));

    window.location.reload(true);

    });

    this.on(“error”, function(file, response) {

    alert(file + “失败” + response);

    })

    }

    }

    };`

  • 在这里我们需要制定参数的名称为upload 这样我们在controller中渠道upload这个上传的对象 整个过程就可以将Excel中的数据拿到了,至于怎么存取就看个人了,你可以用list去接收这些数据
  • 上面这些就是为了实现功能,读者可以自行在此基础上进行分装方法放在自己的项目上就可以使用了
  • 在此之前我还有一种方法是封装在Util工具类中的 至于这点我就不多说了我放在下载里 有需要的朋友自己下载吧
  • http://download.csdn.net/detail/u013132051/9561129

Excel批量导入(导出同理)的更多相关文章

  1. PowerShell 批量导入/导出Active Directory

    PowerShell 批量导入/导出Active Directory         近期由于公司要求,须要导入20个供应商.20个客户到AD域中,刚開始手动添�了2个供应商,2个客户.可是感觉费时费 ...

  2. 关于excel的导入导出

    目前为方便操作,很多系统都增加了批量导入导出的功能.文件导入导出一般的格式都是excel,现将常用设计用例总结如下:   批量导入 一.模板检查检测:一般excel导入,都会提供模板下载功能 1.模板 ...

  3. excel的导入导出的实现

    1.创建Book类,并编写set方法和get方法 package com.bean; public class Book { private int id; private String name; ...

  4. 订餐系统之Excel批量导入

    批量导入现在基本已经成为各类系统的标配了,当前,我们订餐系统也不例外,什么商家呀.商品呀.优惠码之类的,都少不了.毕竟嘛,对非开发人员来说,看到Excel肯定比看到很多管理系统还是要亲切很多的.这里, ...

  5. c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出

    c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...

  6. OpenXml Excel数据导入导出(含图片的导入导出)

    声明:里面的很多东西是基于前人的基础上实现的,具体是哪些人 俺忘了,我做了一些整合和加工 这个项目居于openxml做Excel的导入导出,可以用OpenXml读取Excel中的图片 和OpenXml ...

  7. java实现excel的导入导出(poi详解)[转]

    java实现excel的导入导出(poi详解) 博客分类: java技术 excel导出poijava  经过两天的研究,现在对excel导出有点心得了.我们使用的excel导出的jar包是poi这个 ...

  8. NodeJs之EXCEL文件导入导出MongoDB数据库数据

    NodeJs之EXCEL文件导入导出MongoDB数据库数据 一,介绍与需求 1.1,介绍 (1),node-xlsx : 基于Node.js解析excel文件数据及生成excel文件. (2),ex ...

  9. java 中Excel的导入导出

    部分转发原作者https://www.cnblogs.com/qdhxhz/p/8137282.html雨点的名字  的内容 java代码中的导入导出 首先在d盘创建一个xlsx文件,然后再进行一系列 ...

随机推荐

  1. 数据结构与算法分析(C++)读书笔记

    第一章 综述 数学知识复习: 指数.对数.级数.模运算.证明方法(证明数据结构分析几轮最常用方法:归纳法.反证法) 递归简论 C++知识:类.细节.模板.矩阵.

  2. Java基础之回味finally

    平时大家try…catch…finally语句用的不少,知道finally块一定会在try…catch..执行结束时执行,但是具体是在什么时候执行呢,今天我们一起来看下. public static ...

  3. form 利用BeginCollectionItem提交集合List<T>数据 以及提交的集合中含有集合的数据类型 如List<List<T>> 数据的解决方案

    例子: public class IssArgs { public List<IssTabArgs> Tabs { get; set; } } public class IssTabArg ...

  4. wpf怎么绑定多个值,多个控件

    最近有不少wpf新手问wpf的命令怎么绑定多个控件,很多人为此绞尽脑汁,网上的答案找了也没找到靠谱的,其实用MultiBinding就可以了.从.net 3.0版本开始,就支持MultiBinding ...

  5. MsgWaitForMultipleObjects

    Use caution when calling the wait functions and code that directly or indirectly creates windows. If ...

  6. Git常用操作指南

    目录 前言 Git简介 安装之后第一步 创建版本库 本地仓库 远程仓库 版本控制 工作区和暂存区 版本回退 撤销修改 删除文件 分支管理 创建与合并分支 解决冲突 分支管理策略 状态存储 多人协作 R ...

  7. CF543B Destroying Roads 题解

    看到没有题解就贡献一波呗 分析: 这题其实就是想让我们求一个图中两条最短路的最短(好把更多的边删掉). 我们先考虑一条最短路,别问我我怎么会的显然,就是s和t跑个最短路再用n-就行. 然后就是两条喽! ...

  8. Oracle:ORA-01219:database not open:queries allowed on fixed tables/views only

    Oracle:ORA-01219:database not open:queries allowed on fixed tables/views only 问: 解决 ORA-01219:databa ...

  9. VBox on 14.04: Kernel driver not installed (rc=-1908) [duplicate]

    这几天刚刚装上Ubuntu的系统开始写Android代码,真心是流畅了很多,但是也出现了很多的问题. 还好 有大神护佑,童鞋博客首页,点击查看吧. 刚刚又遇到了一个新的问题,那就是我想用genymot ...

  10. C#3.0新增功能09 LINQ 标准查询运算符 03 按执行方式的分类

    连载目录    [已更新最新开发文章,点击查看详细] 标准查询运算符方法的 LINQ to Objects 实现主要通过两种方法之一执行:立即执行和延迟执行.使用延迟执行的查询运算符可以进一步分为两种 ...