SpringMVC下Excel文件的上传下载实现

原文转载:http://blog.csdn.net/qiubabin/article/details/50113675


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

 

主要依赖的包如下: 

[xml]  view plain  copy
  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]  view plain  copy
  1. package com.research.spring.controller;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8.   
  9. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  10. import org.apache.poi.ss.usermodel.Row;  
  11. import org.apache.poi.ss.usermodel.Sheet;  
  12. import org.apache.poi.ss.usermodel.Workbook;  
  13. import org.springframework.stereotype.Controller;  
  14. import org.springframework.web.bind.annotation.RequestMapping;  
  15. import org.springframework.web.bind.annotation.RequestParam;  
  16. import org.springframework.web.multipart.MultipartFile;  
  17. import org.springframework.web.servlet.ModelAndView;  
  18.   
  19. import com.research.spring.model.UserInfo;  
  20. import com.research.spring.view.ExcelView;  
  21.   
  22. @Controller  
  23. @RequestMapping("/file")  
  24. public class FileController {  
  25.   
  26.     /** 
  27.      * Excel文件上传处理 
  28.      * @param file 
  29.      * @return 
  30.      */  
  31.     @RequestMapping("/upload")  
  32.     public ModelAndView uploadExcel(@RequestParam("file") MultipartFile file){  
  33.         List<UserInfo> list = new ArrayList<UserInfo>();  
  34.                 //这里只处理文件名包括“用户”的文件,模板使用下载模板  
  35.         if( file.getOriginalFilename().contains("用户") ){  
  36.             try {  
  37.                 Workbook wb = new HSSFWorkbook(file.getInputStream());  
  38.                 Sheet sheet = wb.getSheetAt(0);  
  39.                 forint i = 1; i <= sheet.getLastRowNum(); i++ ){  
  40.                     Row row = sheet.getRow(i);  
  41.                     UserInfo info = new UserInfo();  
  42.                     info.setUserName(row.getCell(0).getStringCellValue());  
  43.                     info.setPassword(row.getCell(1).getStringCellValue());  
  44.                     list.add(info);  
  45.                 }  
  46.             } catch (IOException e) {  
  47.                 e.printStackTrace();  
  48.             }  
  49.         }  
  50.         ModelAndView mav = new ModelAndView("content");  
  51.         mav.addObject("content",list.toString());  
  52.         return mav;  
  53.     }  
  54.       
  55.     /** 
  56.      * Excel文件下载处理 
  57.      */  
  58.     @RequestMapping("/download")  
  59.     public ModelAndView downloanExcel(){  
  60.         List<UserInfo> list = new ArrayList<UserInfo>();  
  61.         UserInfo userInfo = new UserInfo();  
  62.         userInfo.setPassword("0000");  
  63.         userInfo.setUserName("sdfas");  
  64.         list.add(userInfo);  
  65.         list.add(userInfo);  
  66.         list.add(userInfo);  
  67.         list.add(userInfo);  
  68.         Map<String,List<UserInfo>> map = new HashMap<String, List<UserInfo>>();  
  69.         map.put("infoList", list);  
  70.         ExcelView ve = new ExcelView();  
  71.         return new ModelAndView(ve,map);  
  72.     }     
  73. }   

 

 (二)实体类 

[java]  view plain  copy
  1. package com.research.spring.model;  
  2.   
  3. public class UserInfo {  
  4.   
  5.     private String userName;  
  6.       
  7.     private String password;  
  8.   
  9.     public String getUserName() {  
  10.         return userName;  
  11.     }  
  12.   
  13.     public void setUserName(String userName) {  
  14.         this.userName = userName;  
  15.     }  
  16.   
  17.     public String getPassword() {  
  18.         return password;  
  19.     }  
  20.   
  21.     public void setPassword(String password) {  
  22.         this.password = password;  
  23.     }  
  24.   
  25.     @Override  
  26.     public String toString() {  
  27.         return "UserInfo [userName=" + userName + ", password=" + password  
  28.                 + "]";  
  29.     }     
  30. }  

 

(三)View类

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

[java]  view plain  copy
  1. package com.research.spring.view;  
  2.   
  3. import java.io.OutputStream;  
  4. import java.net.URLEncoder;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  12. import org.apache.poi.ss.usermodel.Cell;  
  13. import org.apache.poi.ss.usermodel.Row;  
  14. import org.apache.poi.ss.usermodel.Sheet;  
  15. import org.springframework.web.servlet.view.document.AbstractExcelView;  
  16.   
  17. import com.research.spring.model.UserInfo;  
  18.   
  19. /** 
  20.  * 下载Excel视图 
  21.  *  
  22.  * @author wdmcygah 
  23.  * 
  24.  */    
  25. public class ExcelView extends AbstractExcelView {  
  26.   
  27.     @Override  
  28.     protected void buildExcelDocument(Map<String, Object> model,  
  29.             HSSFWorkbook workbook, HttpServletRequest request,  
  30.             HttpServletResponse response) throws Exception {  
  31.         @SuppressWarnings("unchecked")  
  32.         List<UserInfo> list = (List<UserInfo>) model.get("infoList");  
  33.         if (list != null && list.size() != 0) {  
  34.             int len = list.size();  
  35.             Sheet sheet = workbook.createSheet();  
  36.             // 第一行文字说明  
  37.             Row row = sheet.createRow(0);  
  38.             Cell cell = row.createCell(0, Cell.CELL_TYPE_STRING);  
  39.             cell.setCellValue("用户名");  
  40.             cell = row.createCell(1, Cell.CELL_TYPE_STRING);  
  41.             cell.setCellValue("密码");  
  42.   
  43.             //下面是具体内容  
  44.             for (int i = 0; i < len; i++) {  
  45.                 row = sheet.createRow(i + 1);  
  46.                 cell = row.createCell(0, Cell.CELL_TYPE_STRING);  
  47.                 cell.setCellValue(list.get(i).getUserName());  
  48.                 cell = row.createCell(1, Cell.CELL_TYPE_STRING);  
  49.                 cell.setCellValue(list.get(i).getPassword());  
  50.             }  
  51.         }  
  52.   
  53.         response.setContentType("application/vnd.ms-excel");  
  54.         response.setCharacterEncoding("utf-8");  
  55.         //这里对文件名进行编码,保证下载时汉字显示正常  
  56.         String fileName = URLEncoder.encode("用户.xls""utf-8");  
  57.         //Content-disposition属性设置成以附件方式进行下载  
  58.         response.setHeader("Content-disposition""attachment;filename="  
  59.                 + fileName);  
  60.         OutputStream os = response.getOutputStream();  
  61.         workbook.write(os);  
  62.         os.flush();  
  63.         os.close();  
  64.     }  
  65. }  

 

(四)主要配置文件

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

[java]  view plain  copy
  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.   
  15.     <context:component-scan base-package="com.research" />  
  16.   
  17.     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  18.         <property name="viewClass"   value="org.springframework.web.servlet.view.JstlView" />  
  19.         <property name="prefix" value="/WEB-INF/" />  
  20.         <property name="suffix" value=".jsp" />  
  21.     </bean>  
  22.   
  23.     <!-- 上传文件解析器配置 -->  
  24.     <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
  25.         <property name="defaultEncoding" value="UTF-8"></property>  
  26.         <!-- 上传文件的大小限制 ,单位是字节-->  
  27.         <property name="maxUploadSize" value="5242880000000"></property>  
  28.         <!-- 上传文件的临时路径,上传完成后会自动删除 -->  
  29.         <property name="uploadTempDir" value="upload/temp"></property>  
  30.     </bean>  
  31. </beans>  

 

(五)测试页面

[html]  view plain  copy
  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.   
  11. <h3>测试上传Excel功能</h3>  
  12. <form action="file/upload.htm" enctype="multipart/form-data" method="post">  
  13.     <input type="file" name="file"></input>  
  14.     <input type="submit" value="上传Excel"></input>     
  15. </form>  
  16. </body>  
  17. </html>  

 


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值