SSM中Excel的导出和导入

Excel导出:

//该请求必须是同步的
@RequestMapping("/workbench/activity/exportCheckedActivity.do")   
public void downloadActivityExcelByIds(String[] id,HttpServletResponse response) throws IOException {

    //获取对象,封装为List
    List<TblActivity> list = activityService.queryAllActivityByIds(id);

    // 创建一个新的工作簿
    HSSFWorkbook workbook = new HSSFWorkbook();
    //创建一个新的Sheet
    HSSFSheet sheet1 = workbook.createSheet("Sheet1");
    //创建新行
    HSSFRow row = sheet1.createRow(0);
    //设置该行的每个单元格
    row.createCell(0).setCellValue("id");
    row.createCell(1).setCellValue("owner");
    row.createCell(2).setCellValue("name");
    row.createCell(3).setCellValue("start_date");

    //遍历list集合,将每个对象放到独立的一行中
    for (int i = 0; i < list.size(); i++) {
        row = sheet1.createRow(i + 1);
        row.createCell(0).setCellValue(list.get(i).getId());
        row.createCell(1).setCellValue(list.get(i).getOwner());
        row.createCell(2).setCellValue(list.get(i).getName());
        row.createCell(3).setCellValue(list.get(i).getStartDate());
    }

	//获得输出流
    ServletOutputStream os = response.getOutputStream();
    //清除首部的空白行 
    response.reset();
    //设执响应内容,格式为EXCEL表格
    response.setContentType("application/vnd.ms-excel");
    //设置响应头,Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准
    response.setHeader("Content-disposition", "attachment;filename=activityList.xls");
	//将workbook中的数据经输出流写出
    workbook.write(os);
    workbook.close();
}

Excel导入:

1、使用SpringMVC上传文件,需要用到commons-fileupload

<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.4</version>
</dependency>

2、需要在spring的配置文件中配置一下multipartResolver

<!--配置文件上传解析器 id 必须是multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="#{1024*1024*80}"/>
    <property name="defaultEncoding" value="utf-8"/>
</bean>

注意:name必须为multipartResolver,不然会报错

3、jsp页面

// 给导入按钮添加单击事件
$("#importActivityBtn").click(function () {
    // 收集参数,也就是文件名
    var activityFileName = $("#activityFile").val();
    // 截取导入文件的类型
    var suffix = activityFileName.substr(activityFileName.lastIndexOf(".") + 1).toLocaleLowerCase();
    if(suffix != "xls"){
        alert("只支持xls文件");
        return;
    }
    //获得上传的文件,并判断大小
    var activityFile = $("#activityFile").get(0).files[0];
    if(activityFile.size > 5 * 1024 * 1024){
        alert("文件大小不超过5MB");
        return;
    }
    // FormData是ajax提供的接口,可以模拟键值对向后台提交参数;
    // FormData最大的优势是不但能提交文本数据,还能提交二进制数据
    var formData = new FormData();
    formData.append("file", activityFile);
    //发送请求
    $.ajax({
        url:'workbench/activity/importActivity.do',
        data:formData,
        // 设置ajax向后台提交参数之前,是否把参数统一转换成字符串:true--是,false--不是,默认是true
        processData:false, 
        // 设置ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码:true--是,false--不是,默认是true
        contentType:false, 
        type:'post',
        dataType:'json',
        success:function (data) {
            if (data.code === "1"){
                // 提示成功导入记录条数
                alert("成功导入" + data.returnData + "条记录");
                // 关闭模态窗口
                $("#importActivityModal").modal("hide");
                // 刷新市场活动列表,显示第一页数据,保持每页显示条数不变
                queryActivityByConditionForPage(1, $("#page-master").bs_pagination('getOption', 'rowsPerPage'));
            } else {
                // 提示信息
                alert(data.msg);
                // 模态窗口不关闭
                $("#importActivityModal").modal("show");
            }
        }
    });
});

4、java

@RequestMapping("workbench/activity/importActivity.do")
@ResponseBody
//使用MultipartFile file 来接收前端传来的文件数据,必须同名
public Object uploadActivityExcel(MultipartFile file, HttpSession session){
    //ReturnObject是一个向前端返回信息的类
    ReturnObject returnObject = new ReturnObject();
    //存储识别出来的TblActivity对象
    List<TblActivity> list = new ArrayList<>();
    try {
        //获取输入流
        InputStream is = file.getInputStream();
        BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
        //POIFSFileSystem需要输入流
        POIFSFileSystem fileSystem = new POIFSFileSystem(bufferedInputStream);
        //HSSFWorkbook需要POIFSFileSystem
        HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
        //获取sheet
        HSSFSheet sheet = workbook.getSheetAt(0);
        int lastRowNum = sheet.getLastRowNum();
        //遍历sheet,将数据存到list中
        for (int i = 1; i <= lastRowNum; i++) {
            HSSFRow row = sheet.getRow(i);
            TblActivity activity = new TblActivity();
            //补充其他数据
            activity.setId(UUIDUtils.getUUID());
            User user = (User) session.getAttribute(Constants.SESSION_USER);
            activity.setCreateBy(user.getId());
            activity.setOwner(user.getId());
            activity.setCreateTime(DateUtils.getStringByDate(new Date()));

            //遍历excel中行中cell数据
            for (int rowN = 1; rowN < row.getLastCellNum(); rowN++) {
                HSSFCell cell = row.getCell(rowN);
                //获取cell中的数据
                String s = cell.getStringCellValue();
                //将数据保存到activity对象中
                switch (rowN){
                    case 1:
                        activity.setName(s);
                        break;
                    case 2:
                        activity.setStartDate(s);
                        break;
                    case 3:
                        activity.setEndDate(s);
                        break;
                    case 4:
                        activity.setCost(s);
                        break;
                    case 5:
                        activity.setDescription(s);
                        break;
                }
            }
            list.add(activity);
            //设置成功导入的数据条数
            returnObject.setReturnData(i);
        }
        //数据已经存到了list中,调用service中的方法,将数据存到数据库
        for (int i = 0; i < list.size(); i++) {
            activityService.insertActivity(list.get(i));
        }
        //生成returnObject的信息
        returnObject.setCode(Constants.RETURN_OBJECT_CODE_SUCCESS);

    }catch (Exception e){
        e.printStackTrace();
        returnObject.setCode(Constants.RETURN_OBJECT_CODE_FAIL);
        returnObject.setMsg("系统忙");
    }
    return returnObject;
}
posted @ 2022-07-29 15:10  z-laoyao  阅读(363)  评论(0编辑  收藏  举报