1. 程式人生 > >SpringMVC下Excel檔案的上傳下載實現

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倉庫檢視:https://github.com/wdmcygah/research-spring。 其中,上傳檔案只處理符合下載模板的檔案。若要處理其它檔案需要自實現。程式碼測試通過無誤。

相關推薦

easyPoi實現Excel檔案下載

easyPoi 官方API http://easypoi.mydoc.io/ pom引入 <dependency> <groupId>cn.afterturn</groupId> <

POI 實現 Excel 檔案下載及大資料匯出處理

Java 中操作 Excel 的有兩種比較主流的工具包: JXL 和 POI 。JXL 只能操作 Excel 95、97、2000 等老版本格式資料,也即以 .xls 為字尾的 excel。而 POI 可以操作 Excel 95 及以後的版本,即可操作字尾為 .xls 和 .

SpringMVCExcel檔案下載實現

 在實際應用中,經常會遇到上傳Excel或者下載Excel的情況,比如匯入資料、下載統計資料等等場景。針對這個問題,我寫了個基於SpringMVC的簡單上傳下載示例,其中Excel的處理使用Apache的POI元件。 主要依賴的包如下:  <dependency> <groupId

SpringMVC——實現檔案下載

一、檔案上傳 1.引入依賴包 在pom.xml檔案中新增如下內容,引入 commons-fileupload 和 commons-io 兩個包。 <dependency> <groupId>commons-f

springmvc Excel檔案,使用ajaxSubmit方法進行檔案,使用彈出層彈出一個框(jquery layer),點選進行下載

效果: 彈出層使用的是jquery外掛layer  外掛下載地址http://download.csdn.net/detail/rendeyishi/8048139 因為我是使用的是jquery裡面的ajaxSubmit進行檔案上傳 所以這個jquery.form.js必

SpringMVC實現頁面和java模型的資料互動以及檔案下載和資料校驗

1. 專案結構 2.  springMVC-servlet.xml 配置檔案 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org

springmvc和servlet檔案下載(存檔案目錄和存資料庫Blob兩種方式)

專案中涉及了檔案的上傳和下載,以前在struts2下做過,今天又用springmvc做了一遍,發現springmvc封裝的特別好,基本不用幾行程式碼就完成了,下面把程式碼貼出來: FileUpAndDown.jsp <%@ page language="java"

關於SpringMVC框架實現簡單的檔案下載(ssm)

關於ssm框架整合檔案的上傳和下載. 1.首先建立一個用來測試的jsp檔案上傳下載的頁面  程式碼如下 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding

檔案下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況,如何獲取表單提交的值?

一、問題描述 檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的有關使用者資訊的值?(比如:textfield、radio等屬性中的值) 二、解決方法 1、情況一:沒有對user物件進行封裝 方法:

web開發excel檔案及解析(

前言: 接著上一篇部落格檔案上傳,這一篇部落格實踐的是excel檔案的解析,通常我們會需要這樣的需求,就是讓使用者下載一個格式的模板,然後在模板中按照要求填寫資料,最後的就是將excel中的內容全部儲存到資料庫中,從而實現一種批量的上傳的作用,節省很多時間。 準備工作: 要實現excel

Struts2 實現檔案下載

檔案上傳對Struts2來說是一件非常容易的事情。Struts2檔案上傳依賴如下jar包 commons-fileupload-x.x.x.jar commons-io-x.x.x.jar 檔案上傳大致步驟: 編寫頁面 配置struts.xml 攔截器會自動接收上傳的檔

SpringMVC筆記八之檔案下載

一、檔案上傳 1、普通檔案上傳 新建頁面WebContent/file.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

JspSmartUpload 實現檔案下載及Mysql實現分頁

一、寫在前面 這篇文章主要是分享使用JspSamrtUpload實現多檔案的上傳下載功能,及使用Mysql資料庫的 limit 函式實現檔案顯示列表的分頁顯示功能。 二、需要的jar包 下載後把它複製到web的lib目錄下即可。 三、關鍵程式碼 3.1 多檔案上傳前

MAC實用SSH連線遠端伺服器,並實現檔案下載

MAC作為程式設計師的神器,在程式設計上的使用遠超window的電腦,而MAC本身提供了SSH功能,配合VIM編輯器對程式設計十分有幫助。 使用ssh連線遠端主機   sudo -i 切換root許可權 ssh [email protected] 其中,

springmvc檔案/下載

檔案上傳 1,配置檔案上傳解析器 在springmvc-servlet.xml中配置 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.Commons

React中使用fetch實現檔案下載

在最近的專案中需要實現檔案上傳下載功能,在以前spring、jsp的專案中實現檔案上傳很簡單,但現在前後端分離,前端使用React,後端使用Spring Boot,實現就沒那麼方便了。 前端React使用fetch而非傳統的XMLHttpRequest從後端獲取

Java中實現檔案下載的三種解決方案

第一點:Java程式碼實現檔案上傳   FormFile file=manform.getFile();    String newfileName = null;   String newpathname=null;   String fileAddre="/numU

ABAP EXCEL檔案下載

*----------------------- 上傳 Example 1 ----------------------------------  假設有資料在excel中如下:  sname     sno   sex  孫曉磊     001   男  周杰倫     002   男  阿貓       

Flask 實現檔案下載功能

檔案下載的兩種方法, 一是構建檔案url,二是使用flask.send_from_directory(directory, filename, **options),介紹第一種方法,是我寫著寫著就發現的,第二種方法就查api吧,不介紹了。 檔案下載一般都是先有一

SSM框架-SpringMVC 例項檔案下載

目錄(?)[+] 本文詳細講解了SpringMVC例項單檔案上傳、多檔案上傳、檔案列表顯示、檔案下載。 一、新建一個Web工程,匯入相關的包 springmvc的包+commons-fileupload.jar+connom-io.jar+com