SpringMVC下实现Excel文件上传下载

 更新时间:2020年05月30日 16:21:49   作者:qiubabin  
这篇文章主要为大家详细介绍了SpringMVC下实现Excel文件上传下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

主要依赖的包如下:

<dependency> 
  <groupId>commons-io</groupId> 
  <artifactId>commons-io</artifactId> 
  <version>2.4</version> 
 </dependency> 
 <dependency> 
  <groupId>commons-fileupload</groupId> 
  <artifactId>commons-fileupload</artifactId> 
  <version>1.3.1</version> 
 </dependency> 
 <dependency> 
  <groupId>org.springframework</groupId> 
  <artifactId>spring-web</artifactId> 
  <version>4.0.0.RELEASE</version> 
 </dependency> 
 <dependency> 
  <groupId>org.springframework</groupId> 
  <artifactId>spring-webmvc</artifactId> 
  <version>4.0.0.RELEASE</version> 
 </dependency> 
 <dependency> 
  <groupId>org.apache.poi</groupId> 
  <artifactId>poi</artifactId> 
  <version>3.10.1</version> 
 </dependency> 

相关处理类:

(一)Controller类

package com.research.spring.controller; 
 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.multipart.MultipartFile; 
import org.springframework.web.servlet.ModelAndView; 
 
import com.research.spring.model.UserInfo; 
import com.research.spring.view.ExcelView; 
 
@Controller 
@RequestMapping("/file") 
public class FileController { 
 
 /** 
 * Excel文件上传处理 
 * @param file 
 * @return 
 */ 
 @RequestMapping("/upload") 
 public ModelAndView uploadExcel(@RequestParam("file") MultipartFile file){ 
 List<UserInfo> list = new ArrayList<UserInfo>(); 
  //这里只处理文件名包括“用户”的文件,模板使用下载模板 
 if( file.getOriginalFilename().contains("用户") ){ 
  try { 
  Workbook wb = new HSSFWorkbook(file.getInputStream()); 
  Sheet sheet = wb.getSheetAt(0); 
  for( int i = 1; i <= sheet.getLastRowNum(); i++ ){ 
   Row row = sheet.getRow(i); 
   UserInfo info = new UserInfo(); 
   info.setUserName(row.getCell(0).getStringCellValue()); 
   info.setPassword(row.getCell(1).getStringCellValue()); 
   list.add(info); 
  } 
  } catch (IOException e) { 
  e.printStackTrace(); 
  } 
 } 
 ModelAndView mav = new ModelAndView("content"); 
 mav.addObject("content",list.toString()); 
 return mav; 
 } 
 
 /** 
 * Excel文件下载处理 
 */ 
 @RequestMapping("/download") 
 public ModelAndView downloanExcel(){ 
 List<UserInfo> list = new ArrayList<UserInfo>(); 
 UserInfo userInfo = new UserInfo(); 
 userInfo.setPassword("0000"); 
 userInfo.setUserName("sdfas"); 
 list.add(userInfo); 
 list.add(userInfo); 
 list.add(userInfo); 
 list.add(userInfo); 
 Map<String,List<UserInfo>> map = new HashMap<String, List<UserInfo>>(); 
 map.put("infoList", list); 
 ExcelView ve = new ExcelView(); 
 return new ModelAndView(ve,map); 
 } 
} 

(二)实体类

package com.research.spring.model; 
 
public class UserInfo { 
 
 private String userName; 
 
 private String password; 
 
 public String getUserName() { 
 return userName; 
 } 
 
 public void setUserName(String userName) { 
 this.userName = userName; 
 } 
 
 public String getPassword() { 
 return password; 
 } 
 
 public void setPassword(String password) { 
 this.password = password; 
 } 
 
 @Override 
 public String toString() { 
 return "UserInfo [userName=" + userName + ", password=" + password 
  + "]"; 
 } 
} 

(三)View类

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

package com.research.spring.view; 
 
import java.io.OutputStream; 
import java.net.URLEncoder; 
import java.util.List; 
import java.util.Map; 
 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.springframework.web.servlet.view.document.AbstractExcelView; 
 
import com.research.spring.model.UserInfo; 
 
/** 
 * 下载Excel视图 
 * 
 * @author wdmcygah 
 * 
 */ 
public class ExcelView extends AbstractExcelView { 
 
 @Override 
 protected void buildExcelDocument(Map<String, Object> model, 
  HSSFWorkbook workbook, HttpServletRequest request, 
  HttpServletResponse response) throws Exception { 
 @SuppressWarnings("unchecked") 
 List<UserInfo> list = (List<UserInfo>) model.get("infoList"); 
 if (list != null && list.size() != 0) { 
  int len = list.size(); 
  Sheet sheet = workbook.createSheet(); 
  // 第一行文字说明 
  Row row = sheet.createRow(0); 
  Cell cell = row.createCell(0, Cell.CELL_TYPE_STRING); 
  cell.setCellValue("用户名"); 
  cell = row.createCell(1, Cell.CELL_TYPE_STRING); 
  cell.setCellValue("密码"); 
 
  //下面是具体内容 
  for (int i = 0; i < len; i++) { 
  row = sheet.createRow(i + 1); 
  cell = row.createCell(0, Cell.CELL_TYPE_STRING); 
  cell.setCellValue(list.get(i).getUserName()); 
  cell = row.createCell(1, Cell.CELL_TYPE_STRING); 
  cell.setCellValue(list.get(i).getPassword()); 
  } 
 } 
 
 response.setContentType("application/vnd.ms-excel"); 
 response.setCharacterEncoding("utf-8"); 
 //这里对文件名进行编码,保证下载时汉字显示正常 
 String fileName = URLEncoder.encode("用户.xls", "utf-8"); 
 //Content-disposition属性设置成以附件方式进行下载 
 response.setHeader("Content-disposition", "attachment;filename=" 
  + fileName); 
 OutputStream os = response.getOutputStream(); 
 workbook.write(os); 
 os.flush(); 
 os.close(); 
 } 
} 

(四)主要配置文件

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

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util" 
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
 http://www.springframework.org/schema/context 
 http://www.springframework.org/schema/context/spring-context-3.0.xsd 
 http://www.springframework.org/schema/mvc 
 http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
 http://www.springframework.org/schema/util 
 http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 
 
 <context:component-scan base-package="com.research" /> 
 
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
 <property name="prefix" value="/WEB-INF/" /> 
 <property name="suffix" value=".jsp" /> 
 </bean> 
 
 <!-- 上传文件解析器配置 --> 
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
 <property name="defaultEncoding" value="UTF-8"></property> 
 <!-- 上传文件的大小限制 ,单位是字节--> 
 <property name="maxUploadSize" value="5242880000000"></property> 
 <!-- 上传文件的临时路径,上传完成后会自动删除 --> 
 <property name="uploadTempDir" value="upload/temp"></property> 
 </bean> 
</beans> 

(五)测试页面

<html> 
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 
<body> 
<h3>测试下载Excel功能</h3> 
<form action="file/download.htm" enctype="multipart/form-data" method="post"> 
 <input type="submit" value="下载Excel"></input> 
</form> 
 
<h3>测试上传Excel功能</h3> 
<form action="file/upload.htm" enctype="multipart/form-data" method="post"> 
 <input type="file" name="file"></input> 
 <input type="submit" value="上传Excel"></input> 
</form> 
</body> 
</html> 

 如果想看完整源码,可以到我的Github仓库查看。 其中,上传文件只处理符合下载模板的文件。若要处理其它文件需要自实现。代码测试通过无误。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 基于jdk动态代理和cglib动态代理实现及区别说明

    基于jdk动态代理和cglib动态代理实现及区别说明

    这篇文章主要介绍了基于jdk动态代理和cglib动态代理实现及区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Spring事务失效场景实例详解

    Spring事务失效场景实例详解

    实际项目开发中,如果涉及到多张表操作时,为了保证业务数据的一致性,大家一般都会采用事务机制,好多小伙伴可能只是简单了解一下,遇到事务失效的情况,便会无从下手,下面这篇文章主要给大家介绍了关于Spring事务失效场景的相关资料,需要的朋友可以参考下
    2022-03-03
  • 判断以逗号分隔的字符串中是否包含某个数的实例

    判断以逗号分隔的字符串中是否包含某个数的实例

    下面小编就为大家带来一篇判断以逗号分隔的字符串中是否包含某个数的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • String类型转localDate,date转localDate的实现代码

    String类型转localDate,date转localDate的实现代码

    这篇文章主要介绍了String类型转localDate,date转localDate的实现代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • springboot默认的5种加载路径详解

    springboot默认的5种加载路径详解

    这篇文章主要给大家介绍了关于springboot默认的5种加载路径,文中通过示例代码介绍的非常详细,对大家学习或者使用springboot具有一定的参考学习价值,需要的朋友可以参考下
    2022-05-05
  • Java均摊复杂度和防止复杂度的震荡原理分析

    Java均摊复杂度和防止复杂度的震荡原理分析

    这篇文章主要介绍了Java均摊复杂度和防止复杂度的震荡,结合实例形式分析了Java均摊复杂度和防止复杂度的震荡相关概念、原理、实现方法与注意事项,需要的朋友可以参考下
    2020-03-03
  • Java程序设计之12个经典样例

    Java程序设计之12个经典样例

    这篇文章主要给大家分享关于Java程序设计11个经典样例,主要以举例的形式详细的讲解了Java程序设计的各种方法,需要的朋友可以参考一下文章具体的内容
    2021-10-10
  • spring中在xml配置中加载properties文件的步骤

    spring中在xml配置中加载properties文件的步骤

    这篇文章主要介绍了在spring中如何在xml配置中加载properties文件,本文分步骤给大家介绍在XML配置中加载properties文件的方法,需要的朋友可以参考下
    2023-07-07
  • IDEA 热部署设置(JRebel插件激活)

    IDEA 热部署设置(JRebel插件激活)

    这篇文章主要介绍了IDEA 热部署设置(JRebel插件激活),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • Java如何通过线程解决生产者/消费者问题

    Java如何通过线程解决生产者/消费者问题

    这篇文章主要介绍了Java如何通过线程解决生产者/消费者问题,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-10-10

最新评论