• 在做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. Easy doesn't enter into grown-up life

    Hi xinlu, good afternoon, my name is xx, you can also call me andrew. i'm 31 years old, and i'm from ...

  2. .Net知识大全(个人整理)

    .Net知识大全 本章内容适用于对.NET有一定基础的或者是想通过本文章对.NET基础知识记不清楚的朋友,可以通过本文章进行回顾. 面试的时候可能也会遇到相应的题目,建议面试前进行回顾!!! 1.NE ...

  3. XAML与C#与WPF三者到底有什么关系?

    XAML是.NET体系开发程序或者网页时前台编程的一种布局方式或者说开发语言,可以比较自由的用标签的方式进行布局,借鉴了HTML和XML等语言的风格,并且加入了一些动画等的实现.C#则是后台逻辑开发用 ...

  4. zeroMQ 4 java

    自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...

  5. 使用ajax的几种方式

    1.$.ajax()发送一个get请求,数据返回为json $.ajax({ type: "GET", url: "select", //ajax请求地址 da ...

  6. 自己实现定制自己的专属java锁,来高效规避不稳定的第三方

    java juc 包下面已经提供了很多并发锁工具供我们使用,但在日常开发中,为了各种原因我们总是会用多线程来并发处理一些问题,然而并不是所有的场景都可以使用juc 或者java本身提供的锁来方便的帮助 ...

  7. c++书籍推荐《C++编码规范》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++编程规范:101条规则.准则与 实践>:良好的编程规范可以改善软件质量,缩短上市时间,提升团队效率,简化维护工作.在<C++编程规范 ...

  8. C语言学习书籍推荐《C语言接口与实现:创建可重用软件的技术》下载

    <C语言接口与实现:创建可重用软件的技术>概念清晰.实例详尽,是一本有关设计.实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南.书中提供了大量实例,重在阐述如何用一种 ...

  9. PG利用Multicorn访问CSV外部数据源

    Multicorn 是一个 PostgreSQL 9.1+ 的扩展模块,用于简化外部数据封装开发,允许开发者使用 Python 编程语言开发. Install Multicorn Requiremen ...

  10. python 的深浅拷贝问题

    深浅拷贝概念 基本类型和引用类型数据拷贝的问题.因为基本类型的数据大小是固定的,所以他保存在栈内存中:而引用类型的数据大小不固定,因而保存在堆内存中,单引用类型在栈内存中只保存一个指向堆内存的指针. ...