maven+springmvc+POI匯入Excel
阿新 • • 發佈:2019-01-07
說明
POI可以對2003-和2007+版本的Excel檔案做匯入匯出操作,本章只簡單介紹對Excel檔案的匯入操作。
Excel檔案的上傳處理處理請求,依然使用SpringMvc中的MultipartRequest方式處理。
前端JSP中使用傳統form表單提交方式和Juery.form.js外掛提供的非同步表單請求方式,分別對這兩種方式進行介紹。
環境
Maven+JDK8+ Tomcat7.x + Spring4.1.8
說明:
jquery.form.js 的版本要3.23左右
ImportExcelUtil.Java:Excel解析工具類
UploadExcelControl.java :處理來自頁面的請求控制器
InfoVo.java :將Excel轉換為物件儲存
main.jsp:前端訪問頁
……..
pom.xml:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency >
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
ImportExcelUtil.java(Excel解析工具類)
[java] view plain copy print?- package com.poiexcel.util;
- import java.io.IOException;
- import java.io.InputStream;
- import java.text.DecimalFormat;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.List;
- 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.apache.poi.ss.usermodel.Workbook;
- import org.apache.poi.xssf.usermodel.XSSFWorkbook;
- publicclass ImportExcelUtil {
- privatefinalstatic String excel2003L =“.xls”; //2003- 版本的excel
- privatefinalstatic String excel2007U =“.xlsx”; //2007+ 版本的excel
- /**
- * 描述:獲取IO流中的資料,組裝成List<List<Object>>物件
- * @param in,fileName
- * @return
- * @throws IOException
- */
- public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{
- List<List<Object>> list = null;
- //建立Excel工作薄
- Workbook work = this.getWorkbook(in,fileName);
- if(null == work){
- thrownew Exception(“建立Excel工作薄為空!”);
- }
- Sheet sheet = null;
- Row row = null;
- Cell cell = null;
- list = new ArrayList<List<Object>>();
- //遍歷Excel中所有的sheet
- for (int i = 0; i < work.getNumberOfSheets(); i++) {
- sheet = work.getSheetAt(i);
- if(sheet==null){continue;}
- //遍歷當前sheet中的所有行
- for (int j = sheet.getFirstRowNum(); j < sheet.getLastRowNum(); j++) {
- row = sheet.getRow(j);
- if(row==null||row.getFirstCellNum()==j){continue;}
- //遍歷所有的列
- List<Object> li = new ArrayList<Object>();
- for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
- cell = row.getCell(y);
- li.add(this.getCellValue(cell));
- }
- list.add(li);
- }
- }
- work.close();
- return list;
- }
- /**
- * 描述:根據檔案字尾,自適應上傳檔案的版本
- * @param inStr,fileName
- * @return
- * @throws Exception
- */
- public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{
- Workbook wb = null;
- String fileType = fileName.substring(fileName.lastIndexOf(”.”));
- if(excel2003L.equals(fileType)){
- wb = new HSSFWorkbook(inStr); //2003-
- }elseif(excel2007U.equals(fileType)){
- wb = new XSSFWorkbook(inStr); //2007+
- }else{
- thrownew Exception(“解析的檔案格式有誤!”);
- }
- return wb;
- }
- /**
- * 描述:對錶格中數值進行格式化
- * @param cell
- * @return
- */
- public Object getCellValue(Cell cell){
- Object value = null;
- DecimalFormat df = new DecimalFormat(“0”); //格式化number String字元
- SimpleDateFormat sdf = new SimpleDateFormat(“yyy-MM-dd”); //日期格式化
- DecimalFormat df2 = new DecimalFormat(“0.00”); //格式化數字
- switch (cell.getCellType()) {
- case Cell.CELL_TYPE_STRING:
- value = cell.getRichStringCellValue().getString();
- break;
- case Cell.CELL_TYPE_NUMERIC:
- if(“General”.equals(cell.getCellStyle().getDataFormatString())){
- value = df.format(cell.getNumericCellValue());
- }elseif(“m/d/yy”.equals(cell.getCellStyle().getDataFormatString())){
- value = sdf.format(cell.getDateCellValue());
- }else{
- value = df2.format(cell.getNumericCellValue());
- }
- break;
- case Cell.CELL_TYPE_BOOLEAN:
- value = cell.getBooleanCellValue();
- break;
- case Cell.CELL_TYPE_BLANK:
- value = ”“;
- break;
- default:
- break;
- }
- return value;
- }
- }
package com.poiexcel.util;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
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.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ImportExcelUtil {
private final static String excel2003L =".xls"; //2003- 版本的excel
private final static String excel2007U =".xlsx"; //2007+ 版本的excel
/**
* 描述:獲取IO流中的資料,組裝成List<List<Object>>物件
* @param in,fileName
* @return
* @throws IOException
*/
public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{
List<List<Object>> list = null;
//建立Excel工作薄
Workbook work = this.getWorkbook(in,fileName);
if(null == work){
throw new Exception("建立Excel工作薄為空!");
}
Sheet sheet = null;
Row row = null;
Cell cell = null;
list = new ArrayList<List<Object>>();
//遍歷Excel中所有的sheet
for (int i = 0; i < work.getNumberOfSheets(); i++) {
sheet = work.getSheetAt(i);
if(sheet==null){continue;}
//遍歷當前sheet中的所有行
for (int j = sheet.getFirstRowNum(); j < sheet.getLastRowNum(); j++) {
row = sheet.getRow(j);
if(row==null||row.getFirstCellNum()==j){continue;}
//遍歷所有的列
List<Object> li = new ArrayList<Object>();
for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
cell = row.getCell(y);
li.add(this.getCellValue(cell));
}
list.add(li);
}
}
work.close();
return list;
}
/**
* 描述:根據檔案字尾,自適應上傳檔案的版本
* @param inStr,fileName
* @return
* @throws Exception
*/
public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{
Workbook wb = null;
String fileType = fileName.substring(fileName.lastIndexOf("."));
if(excel2003L.equals(fileType)){
wb = new HSSFWorkbook(inStr); //2003-
}else if(excel2007U.equals(fileType)){
wb = new XSSFWorkbook(inStr); //2007+
}else{
throw new Exception("解析的檔案格式有誤!");
}
return wb;
}
/**
* 描述:對錶格中數值進行格式化
* @param cell
* @return
*/
public Object getCellValue(Cell cell){
Object value = null;
DecimalFormat df = new DecimalFormat("0"); //格式化number String字元
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd"); //日期格式化
DecimalFormat df2 = new DecimalFormat("0.00"); //格式化數字
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
value = cell.getRichStringCellValue().getString();
break;
case Cell.CELL_TYPE_NUMERIC:
if("General".equals(cell.getCellStyle().getDataFormatString())){
value = df.format(cell.getNumericCellValue());
}else if("m/d/yy".equals(cell.getCellStyle().getDataFormatString())){
value = sdf.format(cell.getDateCellValue());
}else{
value = df2.format(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_BLANK:
value = "";
break;
default:
break;
}
return value;
}
}
UploadExcelControl.java (spring控制器)
[java] view plain copy print?- package com.poiexcel.control;
- import java.io.InputStream;
- import java.io.PrintWriter;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.ResponseBody;
- import org.springframework.web.multipart.MultipartFile;
- import org.springframework.web.multipart.MultipartHttpServletRequest;
- import com.poiexcel.util.ImportExcelUtil;
- import com.poiexcel.vo.InfoVo;
- @Controller
- @RequestMapping(“/uploadExcel/*”)
- publicclass UploadExcelControl {
- /**
- * 描述:通過傳統方式form表單提交方式匯入excel檔案
- * @param request
- * @throws Exception
- */
- @RequestMapping(value=“upload.do”,method={RequestMethod.GET,RequestMethod.POST})
- public String uploadExcel(HttpServletRequest request) throws Exception {
- MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
- System.out.println(”通過傳統方式form表單提交方式匯入excel檔案!”);
- InputStream in =null;
- List<List<Object>> listob = null;
- MultipartFile file = multipartRequest.getFile(”upfile”);
- if(file.isEmpty()){
- thrownew Exception(“檔案不存在!”);
- }
- in = file.getInputStream();
- listob = new ImportExcelUtil().getBankListByExcel(in,file.getOriginalFilename());
- in.close();
- //該處可呼叫service相應方法進行資料儲存到資料庫中,現只對資料輸出
- for (int i = 0; i < listob.size(); i++) {
- List<Object> lo = listob.get(i);
- InfoVo vo = new InfoVo();
- vo.setCode(String.valueOf(lo.get(0)));
- vo.setName(String.valueOf(lo.get(1)));
- vo.setDate(String.valueOf(lo.get(2)));
- vo.setMoney(String.valueOf(lo.get(3)));
- System.out.println(”列印資訊–>機構:”+vo.getCode()+“ 名稱:”+vo.getName()+“ 時間:”+vo.getDate()+“ 資產:”+vo.getMoney());
- }
- return“result”;
- }
- /**
- * 描述:通過 jquery.form.js 外掛提供的ajax方式上傳檔案
- * @param request
- * @param response
- * @throws Exception
- */
- @ResponseBody
- @RequestMapping(value=“ajaxUpload.do”,method={RequestMethod.GET,RequestMethod.POST})
- publicvoid ajaxUploadExcel(HttpServletRequest request,HttpServletResponse response) throws Exception {
- MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
- System.out.println(”通過 jquery.form.js 提供的ajax方式上傳檔案!”);
- InputStream in =null;
- List<List<Object>> listob = null;
- MultipartFile file = multipartRequest.getFile(”upfile”);
- if(file.isEmpty()){
- thrownew Exception(“檔案不存在!”);
- }
- in = file.getInputStream();
- listob = new ImportExcelUtil().getBankListByExcel(in,file.getOriginalFilename());
- //該處可呼叫service相應方法進行資料儲存到資料庫中,現只對資料輸出
- for (int i = 0; i < listob.size(); i++) {
- List<Object> lo = listob.get(i);
- InfoVo vo = new InfoVo();
- vo.setCode(String.valueOf(lo.get(0)));
- vo.setName(String.valueOf(lo.get(1)));
- vo.setDate(String.valueOf(lo.get(2)));
- vo.setMoney(String.valueOf(lo.get(3)));
- System.out.println(”列印資訊–>機構:”+vo.getCode()+“ 名稱:”+vo.getName()+“ 時間:”+vo.getDate()+“ 資產:”+vo.getMoney());
- }
- PrintWriter out = null;
- response.setCharacterEncoding(”utf-8”); //防止ajax接受到的中文資訊亂碼
- out = response.getWriter();
- out.print(”檔案匯入成功!”);
- out.flush();
- out.close();
- }
- }
package com.poiexcel.control;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.poiexcel.util.ImportExcelUtil;
import com.poiexcel.vo.InfoVo;
@Controller
@RequestMapping("/uploadExcel/*")
public class UploadExcelControl {
/**
* 描述:通過傳統方式form表單提交方式匯入excel檔案
* @param request
* @throws Exception
*/
@RequestMapping(value="upload.do",method={RequestMethod.GET,RequestMethod.POST})
public String uploadExcel(HttpServletRequest request) throws Exception {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
System.out.println("通過傳統方式form表單提交方式匯入excel檔案!");
InputStream in =null;
List<List<Object>> listob = null;
MultipartFile file = multipartRequest.getFile("upfile");
if(file.isEmpty()){
throw new Exception("檔案不存在!");
}
in = file.getInputStream();
listob = new ImportExcelUtil().getBankListByExcel(in,file.getOriginalFilename());
in.close();
//該處可呼叫service相應方法進行資料儲存到資料庫中,現只對資料輸出
for (int i = 0; i < listob.size(); i++) {
List<Object> lo = listob.get(i);
InfoVo vo = new InfoVo();
vo.setCode(String.valueOf(lo.get(0)));
vo.setName(String.valueOf(lo.get(1)));
vo.setDate(String.valueOf(lo.get(2)));
vo.setMoney(String.valueOf(lo.get(3)));
System.out.println("列印資訊-->機構:"+vo.getCode()+" 名稱:"+vo.getName()+" 時間:"+vo.getDate()+" 資產:"+vo.getMoney());
}
return "result";
}
/**
* 描述:通過 jquery.form.js 外掛提供的ajax方式上傳檔案
* @param request
* @param response
* @throws Exception
*/
@ResponseBody
@RequestMapping(value="ajaxUpload.do",method={RequestMethod.GET,RequestMethod.POST})
public void ajaxUploadExcel(HttpServletRequest request,HttpServletResponse response) throws Exception {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
System.out.println("通過 jquery.form.js 提供的ajax方式上傳檔案!");
InputStream in =null;
List<List<Object>> listob = null;
MultipartFile file = multipartRequest.getFile("upfile");
if(file.isEmpty()){
throw new Exception("檔案不存在!");
}
in = file.getInputStream();
listob = new ImportExcelUtil().getBankListByExcel(in,file.getOriginalFilename());
//該處可呼叫service相應方法進行資料儲存到資料庫中,現只對資料輸出
for (int i = 0; i < listob.size(); i++) {
List<Object> lo = listob.get(i);
InfoVo vo = new InfoVo();
vo.setCode(String.valueOf(lo.get(0)));
vo.setName(String.valueOf(lo.get(1)));
vo.setDate(String.valueOf(lo.get(2)));
vo.setMoney(String.valueOf(lo.get(3)));
System.out.println("列印資訊-->機構:"+vo.getCode()+" 名稱:"+vo.getName()+" 時間:"+vo.getDate()+" 資產:"+vo.getMoney());
}
PrintWriter out = null;
response.setCharacterEncoding("utf-8"); //防止ajax接受到的中文資訊亂碼
out = response.getWriter();
out.print("檔案匯入成功!");
out.flush();
out.close();
}
}
InfoVo.java(儲存Excel資料對應的物件)
[java] view plain copy print?- package com.poiexcel.vo;
- //將Excel每一行數值轉換為物件
- publicclass InfoVo {
- private String code;
- private String name;
- private String date;
- private String money;
- public String getCode() {
- return code;
- }
- publicvoid setCode(String code) {
- this.code = code;
- }
- public String getName() {
- return name;
- }
- publicvoid setName(String name) {
- this.name = name;
- }
- public String getDate() {
- return date;
- }
- publicvoid setDate(String date) {
- this.date = date;
- }
- public String getMoney() {
- return money;
- }
- publicvoid setMoney(String money) {
- this.money = money;
- }
- }
package com.poiexcel.vo;
//將Excel每一行數值轉換為物件
public class InfoVo {
private String code;
private String name;
private String date;
private String money;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
}
main.jsp(前端程式碼):
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<base href="<%=basePath%>">
<script type="text/javascript" src="js/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="js/jquery.form.js"></script>
<title>My JSP 'index.jsp' starting page</title>
<script type="text/javascript">
//ajax 方式上傳檔案操作
$(document).ready(function(){
$('#btn').click(function(){
if(checkData()){
$('#form1').ajaxSubmit({
url:'uploadExcel/ajaxUpload.do',
dataType: 'text',
success: resutlMsg,
error: errorMsg
});
function resutlMsg(msg){
alert(msg);
$("#upfile").val("");
}
function errorMsg(){
alert("匯入excel出錯!");
}
}
});
});
//JS校驗form表單資訊
function checkData(){
var fileDir = $("#upfile").val();
var suffix = fileDir.substr(fileDir.lastIndexOf("."));
if("" == fileDir){
alert("選擇需要匯入的Excel檔案!");
return false;
}
if(".xls" != suffix && ".xlsx" != suffix ){
alert("選擇Excel格式的檔案匯入!");
return false;
}
return true;
}
</script>
</head>
<body>
<div>1.通過簡單的form表單提交方式,進行檔案的上</br> 2.通過jquery.form.js外掛提供的form表單一步提交功能 </div></br>
<form method="POST" enctype="multipart/form-data" id="form1" action="uploadExcel/upload.do">
<table>
<tr>
<td>上傳檔案: </td>
<td> <input id="upfile" type="file" name="upfile"></td>
</tr>
<tr>
<td><input type="submit" value="提交" onclick="return checkData()"></td>
<td><input type="button" value="ajax方式提交" id="btn" name="btn" ></td>
</tr>
</table>
</form>
</body>
</html>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd ">
<!-- 載入Spring容器監聽 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 設定Spring容器載入配置檔案路徑 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/application/applicationContext-*.xml</param-value>
</context-param>
<!--配置Springmvc核心控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!--為DispatcherServlet建立對映 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>main.jsp</welcome-file>
</welcome-file-list>
</web-app>
springmvc-servlet.xml(只做簡單配置)[html] view plain copy print?
- <?xmlversion=“1.0”encoding=“UTF-8”?>
- <beansxmlns=“http://www.springframework.org/schema/beans”
- xmlns:context=“http://www.springframework.org/schema/context”
- xmlns:mvc=“http://www.springframework.org/schema/mvc”
- xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
- xmlns:tx=“http://www.springframework.org/schema/tx”
- xsi:schemaLocation=”
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.1.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/beans/spring-beans-4.1.xsd ”>
- <!– 啟動註解驅動–>
- <mvc:annotation-driven/>
- <!– 啟動包掃描功能–>
- <context:component-scanbase-package=“com.poiexcel.*”/>
- </beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd ">
<!-- 啟動註解驅動-->
<mvc:annotation-driven/>
<!-- 啟動包掃描功能-->
<context:component-scan base-package="com.poiexcel.*" />
</beans>
applicationContext-base.xml
- <?xmlversion=“1.0”encoding=“UTF-8”?>
- <beansxmlns=“http://www.springframework.org/schema/beans”
- xmlns:context=“http://www.springframework.org/schema/context”
- xmlns:mvc=“http://www.springframework.org/schema/mvc”
- xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
- xmlns:tx=“http://www.springframework.org/schema/tx”
- xsi:schemaLocation=”
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.1.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.1.xsd ”>
- <!– 檢視解釋類 –>
- <beanclass=“org.springframework.web.servlet.view.InternalResourceViewResolver”>
- <propertyname=“prefix”value=“/WEB-INF/jsp/”/>
- <propertyname=“suffix”value=“.jsp”/>