SpringMVC下Excel文件的上传下载

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

主要依赖的包如下:

Xml代码

<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类

Java代码

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);  
    }     
}   

(二)实体类

Java代码

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的相关处理。

Java代码

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类。

Java代码

<?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代码

<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> 

原文发布于微信公众号 - java达人(drjava)

原文发表时间:2015-06-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Netkiller

怎样制作RPM包

怎样制作RPM包 摘要 我在网上找RPM包的制作例子几乎都是C源码编译安装然后生成RPM包, 而我的程序不是C写的很多时候是脚本语言如Python, PHP 甚...

6976
来自专栏码匠的流水账

关于ribbonClient配置的一个坑

不知道从哪个版本起,给ribbon配置物理的server list起,单纯配置xxx.ribbon.listOfServers不起效果了,于是就开启了埋坑之旅。

2952
来自专栏一个会写诗的程序员的博客

13.7 SpringBoot集成日志系统logback的几个问题问题1: Logging system failed to initialize using configuration from

让人感到疑惑的是,SpringBoot居然没有对application.properties配置文件value末端作空格trim处理。

4131
来自专栏SpringBoot 核心技术

目录:SpringBoot 核心技术

1632
来自专栏bboysoul

linux编译安装apache

wget http://mirrors.ustc.edu.cn/apache/httpd/httpd-2.4.25.tar.gz tar -zxvf http...

2433
来自专栏微信音视频小程序

教你1天搭建自己的“微视”

A simple iOS Application project is shown below to illustrate how to configure S...

9855
来自专栏乐沙弥的世界

X86 DBCA, NETCA GIVE JAVA HOTSPOT ERROR IF ON X86_64 HARDWARE

    在使用DBCA命令创建新的数据库时,DBCA命令无法启动。运行的环境是宿主机64bit+AMD cpu, 而客户机为Linux 32bit + Grid...

912
来自专栏醉生梦死

shell脚本--练习1(爬虫)

3334
来自专栏好好学java的技术栈

SpringMVC+RestFul详细示例实战教程一(实现跨域访问+postman测试)

注意:由于文章篇幅太长,超出了字数,这是文章的第一部分,明天分享文章的第二部分,请见谅!

6062
来自专栏光变

Logback动态配置.01_Appender

在程序运行的时候,有的时候需要动态修改Logger的级别,增加、删除、修改Logger的Appender。

3702

扫码关注云+社区

领取腾讯云代金券