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仓库查看。 其中,上传文件只处理符合下载模板的文件。若要处理其它文件需要自实现。代码测试通过无误。

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

(0)

相关推荐

  • Java Spring MVC 上传下载文件配置及controller方法详解

    下载: 1.在spring-mvc中配置(用于100M以下的文件下载) <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <!--配置下载返回类型--> <bean class="or

  • 在SpringMVC框架下实现文件的上传和下载示例

    在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation=&

  • springmvc模式的上传和下载实现解析

    这篇文章主要介绍了springmvc模式下的上传和下载实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 此处上传的功能依旧是采用表格上传.文件格式依旧是 <form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data"> 后台则是 @Reque

  • SpringMVC+Ajax实现文件批量上传和下载功能实例代码

    今天做了文件的上传下载,小小总结一下,基本的web项目建立及SpringMVC框架搭建此处不详细写出来了. 上传form: <form id="uploadfiles" enctype="multipart/form-data"> <input type="file" multiple="multiple" id="file_upload" name="file_upload&q

  • SpringMVC实现文件的上传和下载实例代码

    前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的上传和下载?是框架还是Java中的IO流".我回复他说:"使用SpringMVC框架可以做到这一点,因为SpringMVC为文件的上传提供了直接的支持,但需要依赖Apache提供Commons FileUpload组件jar包."鉴于这个问题,我上网也百度了一下,网上很多都是介绍的使用IO流来实现文件的上传和下载,也有说到框架的,但介绍的并不是很完整,今天小钱将和大家介绍使用Spr

  • 基于Spring Mvc实现的Excel文件上传下载示例

    最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库.因此为了更好的理解公司框架,我就自己先用spring mvc实现了一个样例. 基础框架 之前曾经介绍过一个最简单的spring mvc的项目如何搭建,传送门在这里. 这次就基于这个工程,继续实现上传下载的小例子.需要做下面的事情: 1 增加index.html,添加form提交文件 2 引入commons-fileupload.commons-io.jxl等工具包 3 创建upload download接口 4 注入mul

  • MyBatis与SpringMVC相结合实现文件上传、下载功能

    环境:maven+SpringMVC + Spring + MyBatis + MySql 本文主要说明如何使用input上传文件到服务器指定目录,或保存到数据库中:如何从数据库下载文件,和显示图像文件并实现缩放. 将文件存储在数据库中,一般是存文件的byte数组,对应的数据库数据类型为blob. 首先要创建数据库,此处使用MySql数据库. 注意:文中给出的代码多为节选重要片段,并不齐全. 1. 前期准备 使用maven创建一个springMVC+spring+mybatis+mysql的项目

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

    在实际应用中,经常会遇到上传Excel或者下载Excel的情况,比如导入数据.下载统计数据等等场景.针对这个问题,我写了个基于SpringMVC的简单上传下载示例,其中Excel的处理使用Apache的POI组件. 主要依赖的包如下: <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</versi

  • SpringMVC使用ResponseEntity实现文件上传下载

    目录 使用 ResponseEntity 实现文件上传和下载 下载 上传 使用 ResponseEntity 实现文件上传和下载 在 static 下新建一个 img ,并且我放了一张图片在里面,然后重新 maven 打包一下. 下载 新建一个页面file.html,并且配置视图控制器,以便跳转: <mvc:view-controller path="/file" view-name="file"></mvc:view-controller>

  • SpringMVC实现文件上传下载功能

    目录 导入需要的依赖包 一.单个文件上传 二.多个文件上传 三.上传文件列表显示 四.文件下载 今天遇到文件上传的问题,使用Ajax方式进行提交,服务器一直报错The current request is not a multipart request,看了网上很多方法,最后才找到,我在表单提交的时候使用了序列化$('#postForm').serialize(),但是这种方式,只能传递一般的参数,上传文件的文件流是无法被序列化并传递的.所以一直在报错.后来就直接使用submint(),放弃使用

  • springMVC配置环境实现文件上传和下载

    最近的项目中用到了文件的上传和下载功能,我觉着这个功能比较重要,因此特意把它提取出来自己进行了尝试. 下面就是springMVC配置环境实现文件上传和下载的具体步骤,供大家参考,具体内容如下 一. 基础配置: maven导包及配置pom.xml,导包时除开springmvc的基础依赖外,需要导入文件上传下载时用到的commons-io.jsr和commons-fileupload.jar: <project xmlns="http://maven.apache.org/POM/4.0.0&

  • C# 文件上传下载(Excel导入,多线程下载)功能的实现代码

    废话不多说了,直接给大家贴代码,具体代码如下所示: //打开Excel文件,转换为DataTable DataTable dtExcel; private void OpenFile() { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "Microsoft Excel files(*.xls)|*.xls;*.xlsx"; //筛选打开文件类型 :图片 *.jpg|*.jpg|*.bmp|*.bmp ;&q

  • SpringMVC实现文件上传下载的全过程

    目录 前言 一.通用配置 二.实现文件下载,上传功能 总结 前言 文件的上传和下载都是基于io复制,只不过 文件上传是浏览器向服务器发送报文 文件下载是服务器向浏览器发送报文 提示:以下是本篇文章正文内容,下面案例可供参考 一.通用配置 pom.xml <dependencies> <!-- SpringMVC --> <dependency> <groupId>org.springframework</groupId> <artifact

  • Spring Boot + thymeleaf 实现文件上传下载功能

    最近同事问我有没有有关于技术的电子书,我打开电脑上的小书库,但是邮件发给他太大了,公司又禁止用文件夹共享,于是花半天时间写了个小的文件上传程序,部署在自己的Linux机器上. 提供功能: 1 .文件上传 2.文件列表展示以及下载 原有的上传那块很丑,写了点js代码优化了下,最后界面显示如下图: 先给出成果,下面就一步步演示怎么实现. 1.新建项目 首先当然是新建一个spring-boot工程,你可以选择在网站初始化一个项目或者使用IDE的Spring Initialier功能,都可以新建一个项目

  • Quarkus中实现Resteasy的文件上传下载操作

    目录 前言 文件上传 文件下载 前言 做java web开发,文件的上传和下载是一个非常常见的需求场景.在spring生态下的文件上传下载非常简单,记得五年前,我刚写博的时候也写过spring的上传和下载<SpringMvc实现文件上传与下载>,以及Struts2的文件上传和下载<java Struts2实现文件上传下载>.今天来看看Quarkus框架中是如何实现的,因为Quarkus的JAX-RS采用Resteasy的实现,故Quarkus中的文件上传和下载,也就是Resteas

  • SpringMVC基于注解方式实现上传下载

    目录 一.文件下载 1-1.servlet原生方式下载 1-2.使用ResponseEntity实现下载 二.文件上传 2-1.添加commons-fileupload依赖 2-2.配置spring.xml注入CommonsMultipartResolver文件上传解析器 2-3.文件上传 一.文件下载 1-1.servlet原生方式下载 /**  * 基于servlet api的文件下载  */ @RequestMapping("/download") public String d

随机推荐