SpringMVC下Excel文件的上传下载

2021-06-03

在实际应用中,经常会遇到上传Excel或者下载Excel的情况,比如导入数据、下载统计数据等等场景。针对这个问题,我写了个基于SpringMVC的简单上传下载示例,其中Excel的处理使用Apache的POI组件。

主要依赖的包如下:

Xml代码

  1. <dependency>

  2. <groupId>commons-io</groupId>

  3. <artifactId>commons-io</artifactId>

  4. <version>2.4</version>

  5. </dependency>

  6. <dependency>

  7. <groupId>commons-fileupload</groupId>

  8. <artifactId>commons-fileupload</artifactId>

  9. <version>1.3.1</version>

  10. </dependency>

  11. <dependency>

  12. <groupId>org.springframework</groupId>

  13. <artifactId>spring-web</artifactId>

  14. <version>4.0.0.RELEASE</version>

  15. </dependency>

  16. <dependency>

  17. <groupId>org.springframework</groupId>

  18. <artifactId>spring-webmvc</artifactId>

  19. <version>4.0.0.RELEASE</version>

  20. </dependency>

  21. <dependency>

  22. <groupId>org.apache.poi</groupId>

  23. <artifactId>poi</artifactId>

  24. <version>3.10.1</version>

  25. </dependency>

相关处理类:

(一)Controller类

Java代码

  1. package com.research.spring.controller;

  2. import java.io.IOException;

  3. import java.util.ArrayList;

  4. import java.util.HashMap;

  5. import java.util.List;

  6. import java.util.Map;

  7. import org.apache.poi.hssf.usermodel.HSSFWorkbook;

  8. import org.apache.poi.ss.usermodel.Row;

  9. import org.apache.poi.ss.usermodel.Sheet;

  10. import org.apache.poi.ss.usermodel.Workbook;

  11. import org.springframework.stereotype.Controller;

  12. import org.springframework.web.bind.annotation.RequestMapping;

  13. import org.springframework.web.bind.annotation.RequestParam;

  14. import org.springframework.web.multipart.MultipartFile;

  15. import org.springframework.web.servlet.ModelAndView;

  16. import com.research.spring.model.UserInfo;

  17. import com.research.spring.view.ExcelView;

  18. @Controller

  19. @RequestMapping("/file")

  20. public class FileController {

  21. /**

  22. * Excel文件上传处理

  23. * @param file

  24. * @return

  25. */

  26. @RequestMapping("/upload")

  27. public ModelAndView uploadExcel(@RequestParam("file") MultipartFile file){

  28. List<UserInfo> list = new ArrayList<UserInfo>();

  29. //这里只处理文件名包括“用户”的文件,模板使用下载模板

  30. if( file.getOriginalFilename().contains("用户") ){

  31. try {

  32. Workbook wb = new HSSFWorkbook(file.getInputStream());

  33. Sheet sheet = wb.getSheetAt(0);

  34. for( int i = 1; i <= sheet.getLastRowNum(); i++ ){

  35. Row row = sheet.getRow(i);

  36. UserInfo info = new UserInfo();

  37. info.setUserName(row.getCell(0).getStringCellValue());

  38. info.setPassword(row.getCell(1).getStringCellValue());

  39. list.add(info);

  40. }

  41. } catch (IOException e) {

  42. e.printStackTrace();

  43. }

  44. }

  45. ModelAndView mav = new ModelAndView("content");

  46. mav.addObject("content",list.toString());

  47. return mav;

  48. }

  49. /**

  50. * Excel文件下载处理

  51. */

  52. @RequestMapping("/download")

  53. public ModelAndView downloanExcel(){

  54. List<UserInfo> list = new ArrayList<UserInfo>();

  55. UserInfo userInfo = new UserInfo();

  56. userInfo.setPassword("0000");

  57. userInfo.setUserName("sdfas");

  58. list.add(userInfo);

  59. list.add(userInfo);

  60. list.add(userInfo);

  61. list.add(userInfo);

  62. Map<String,List<UserInfo>> map = new HashMap<String, List<UserInfo>>();

  63. map.put("infoList", list);

  64. ExcelView ve = new ExcelView();

  65. return new ModelAndView(ve,map);

  66. }

  67. }

(二)实体类

Java代码

  1. package com.research.spring.model;

  2. public class UserInfo {

  3. private String userName;

  4. private String password;

  5. public String getUserName() {

  6. return userName;

  7. }

  8. public void setUserName(String userName) {

  9. this.userName = userName;

  10. }

  11. public String getPassword() {

  12. return password;

  13. }

  14. public void setPassword(String password) {

  15. this.password = password;

  16. }

  17. @Override

  18. public String toString() {

  19. return "UserInfo [userName=" + userName + ", password=" + password

  20. + "]";

  21. }

  22. }

(三)View类

这个类在下载时用到,在Spring渲染页面时使用自定义的View类进行Excel的相关处理。

Java代码

  1. package com.research.spring.view;

  2. import java.io.OutputStream;

  3. import java.net.URLEncoder;

  4. import java.util.List;

  5. import java.util.Map;

  6. import javax.servlet.http.HttpServletRequest;

  7. import javax.servlet.http.HttpServletResponse;

  8. import org.apache.poi.hssf.usermodel.HSSFWorkbook;

  9. import org.apache.poi.ss.usermodel.Cell;

  10. import org.apache.poi.ss.usermodel.Row;

  11. import org.apache.poi.ss.usermodel.Sheet;

  12. import org.springframework.web.servlet.view.document.AbstractExcelView;

  13. import com.research.spring.model.UserInfo;

  14. /**

  15. * 下载Excel视图

  16. *

  17. * @author wdmcygah

  18. *

  19. */

  20. public class ExcelView extends AbstractExcelView {

  21. @Override

  22. protected void buildExcelDocument(Map<String, Object> model,

  23. HSSFWorkbook workbook, HttpServletRequest request,

  24. HttpServletResponse response) throws Exception {

  25. @SuppressWarnings("unchecked")

  26. List<UserInfo> list = (List<UserInfo>) model.get("infoList");

  27. if (list != null && list.size() != 0) {

  28. int len = list.size();

  29. Sheet sheet = workbook.createSheet();

  30. // 第一行文字说明

  31. Row row = sheet.createRow(0);

  32. Cell cell = row.createCell(0, Cell.CELL_TYPE_STRING);

  33. cell.setCellValue("用户名");

  34. cell = row.createCell(1, Cell.CELL_TYPE_STRING);

  35. cell.setCellValue("密码");

  36. //下面是具体内容

  37. for (int i = 0; i < len; i++) {

  38. row = sheet.createRow(i + 1);

  39. cell = row.createCell(0, Cell.CELL_TYPE_STRING);

  40. cell.setCellValue(list.get(i).getUserName());

  41. cell = row.createCell(1, Cell.CELL_TYPE_STRING);

  42. cell.setCellValue(list.get(i).getPassword());

  43. }

  44. }

  45. response.setContentType("application/vnd.ms-excel");

  46. response.setCharacterEncoding("utf-8");

  47. //这里对文件名进行编码,保证下载时汉字显示正常

  48. String fileName = URLEncoder.encode("用户.xls", "utf-8");

  49. //Content-disposition属性设置成以附件方式进行下载

  50. response.setHeader("Content-disposition", "attachment;filename="

  51. + fileName);

  52. OutputStream os = response.getOutputStream();

  53. workbook.write(os);

  54. os.flush();

  55. os.close();

  56. }

  57. }

(四)主要配置文件

上传文件时需要在配置文件中配置MultipartResolver类,配置后Spring会自动将文件传成MultipartFile对象,然后就可以进行相应的处理。示例看Controller类。

Java代码

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

  4. xmlns:context="http://www.springframework.org/schema/context"

  5. xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"

  6. xsi:schemaLocation="http://www.springframework.org/schema/beans

  7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

  8. http://www.springframework.org/schema/context

  9. http://www.springframework.org/schema/context/spring-context-3.0.xsd

  10. http://www.springframework.org/schema/mvc

  11. http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

  12. http://www.springframework.org/schema/util

  13. http://www.springframework.org/schema/util/spring-util-3.0.xsd">

  14. <context:component-scan base-package="com.research" />

  15. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

  16. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />

  17. <property name="prefix" value="/WEB-INF/" />

  18. <property name="suffix" value=".jsp" />

  19. </bean>

  20. <!-- 上传文件解析器配置 -->

  21. <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

  22. <property name="defaultEncoding" value="UTF-8"></property>

  23. <!-- 上传文件的大小限制 ,单位是字节-->

  24. <property name="maxUploadSize" value="5242880000000"></property>

  25. <!-- 上传文件的临时路径,上传完成后会自动删除 -->

  26. <property name="uploadTempDir" value="upload/temp"></property>

  27. </bean>

  28. </beans>

(五)测试页面

Html代码

  1. <html>

  2. <head>

  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

  4. </head>

  5. <body>

  6. <h3>测试下载Excel功能</h3>

  7. <form action="file/download.htm" enctype="multipart/form-data" method="post">

  8. <input type="submit" value="下载Excel"></input>

  9. </form>

  10. <h3>测试上传Excel功能</h3>

  11. <form action="file/upload.htm" enctype="multipart/form-data" method="post">

  12. <input type="file" name="file"></input>

  13. <input type="submit" value="上传Excel"></input>

  14. </form>

  15. </body>

  16. </html>


相关文章

SpringMVC下Excel文件的上传下载

2021-06-03
(三)View类这个类在下载时用到,在Spring渲染页面时使用自定义的View类进行Excel的相关处理. Java代码 package com....

Spring Boot+Spring security+Thymeleaf+Elasticsearch博客系统视频教程免费下载

2021-06-03
这是一个基于Spring Boot+Spring security+Thymeleaf+Elasticsearch+JPA+Bootstrap+Mysql等实现的一个多用户,多角色的博客系统....

狂神说SpringMVC08:拦截器+文件上传下载

2021-06-03
Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的.Spring MVC使用Apache Commons ...

春天真的好耀眼 | Springtime Marks 春之面具亲子手工免费下载(女王节福利哦)...

2021-06-03
公众号对话框回复:春天,可以免费下载这个模板制作面具所需的材料非常简单;纸模版;剪刀;蜡笔或水彩笔;打洞工具(没有可以...

高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)

2021-06-03
cnblogs.com/chenkeyu/p/8001624.html前言最近在项目中需要和ftp服务器进行交互,在网上找了一下关于ftp上传下载的工具类,大致有...

SpringBoot动态生成多个Excel文件以压缩包.zip格式下载

2021-06-03
来源:blog.csdn.net/qq_40437152/article/details/111411364前言文件下载的场景很多(还不是需求丰富嘛~),那么什么是动态生成文...

SpringBoot动态生成多个Excel文件以压缩包.zip格式下载

2021-06-03
单个嘛直接下载,多个打包下载咯!项目场景项目中有个数据导出excel的需求,而且是批量,那么就要打包咯解决步骤基本实现如下:...

springboot文件上传和下载(批量_单个)

2021-06-03
前言用springboot + jpa,批量上传、下载,一般批量下载处理方式都是将多个文件压缩成一个压缩包,然后在下载,主要的坑在于本地...

springboot文件上传和下载

2021-06-03
文件上传下载,没事儿练习哈手感链接:https://pan.baidu.com/s/1rx4gkHwLKJRxmzvvhY21JA提取码:zm13

春节习俗课件:the Chinese Spring Festival(附微课下载)

2021-06-03
(点击查看)明老师最近发现了一个叫做Sally Barker的歪果仁做了一个“Fourteen Days of the Chinese Spring Festival”的课件,特别...

随机推荐