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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话