java上傳(讀取)Excel利用poi解析
基於springmvc開發模式。
需要的Excel相關jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</dependency>
一、前端上傳excel
傳統的表單上傳,在提交之後並不能有效的返回我們想要的資料,假如我在上傳成功之後需要跳轉到註冊成功的頁面 或者 上傳成功之後需要將匯入失敗的資訊打印出來,顯然並不能滿足我們的要求。
jquery.form.js中的ajaxSubmit()可以實現區域性提交重新整理的效果。
由於我們的重點在後臺,所以下面只是簡單介紹前端實現。
頁面程式碼:
<div class="form" key="registing" v-if="show">
<form id="upload_form" action="register/noVerificationForExcel"
enctype="multipart/form-data" method="post">
<div class="form-group">
<label class="col-sm-2 control-label">表格上傳</label>
<div class="col-sm-10">
<input type="file" id="file" name="file" />
</div>
</div>
<div class="form-group btn-box">
<button type="button" class="btn btn-success btn-block bgc-color"
onclick="submitForm()">立即註冊</button>
</div>
</form>
<div class="success" key="registed" v-else v-cloak>
<div class="success-img">
<img src="static/img/right.png" alt="">
</div>
<div class="success-text">
<p>恭喜註冊成功</p>
<p>即將跳轉登入頁面......</p>
</div>
</div>
</div>
js程式碼:
function submitForm() {
var excelPath = $("#file").val();
if(excelPath == null || excelPath == ''){
alert("請選擇要上傳的Excel檔案");
return;
}else{
var fileExtend = excelPath.substring(excelPath.lastIndexOf('.')).toLowerCase();
if(fileExtend == '.xls' || fileExtend == '.xlsx'){
$("#upload_form").ajaxSubmit({
url:"register/noVerificationForExcel",
cache:false,
dataType:'json',
success: function(data) {
alert(data.result);
} ,
error:function(){
alert(data.message);
}
});
} else {
alert("檔案格式需為'.xls'格式");
return;
}
}
}
controller
public ReturnMessage registerByNoVerificationForExcel(HttpServletRequest request , HttpServletResponse response ,@RequestParam MultipartFile file) {
ReturnMessage returnMessage = new ReturnMessage();
List<ArrayList<String>> readResult = null;//總行記錄
try {
//判斷檔案是否為空
if (file.isEmpty()) {
return returnMessage.setError(1, "上傳檔案為空");
}
//判斷檔案大小
long size = file.getSize();
String name = file.getOriginalFilename();
if (StringUtils.isBlank(name) || size == 0) {
return returnMessage.setError(1, "上傳檔案為空");
}
//獲取檔案字尾
String postfix = ExcelUtil.getPostfix(name);
//讀取檔案內容
if (StringUtils.equals("xlsx", postfix)) {
readResult = ExcelUtil.readXlsx(file);
} else if (StringUtils.equals("xls", postfix)) {
readResult = ExcelUtil.readXls(file);
} else {
return returnMessage.setError(1, "檔案型別錯誤");
}
if (readResult == null || readResult.size() == 0) {
return returnMessage.setError(2, "檔案解析失敗");
}
for (ArrayList<String> arr : readResult) {
String account = arr.get(6);//獲取指定單元格的內容,這邊我只獲取了其中一列的資料
if (StringUtils.isBlank(account)) {
continue;
}
account = account.trim();
String phone = account;
String password = "abc123";
if (!TelephoneValidator.checkMobile(phone)) {
continue;
}
/**呼叫service進行具體的業務操作 */
//...
}
} catch (Exception e) {
log.error("ControllerError--->", e);
returnMessage.setError(ReturnErrorMessage.SYSTEM_ERROR.getValue(), ReturnErrorMessage.SYSTEM_ERROR.getName());
}
returnMessage.setSucceed();
return returnMessage;
}
controller中的ExcelUtil是我自己封裝的工具類,用來獲取檔案字尾名,並根據excel版本實現不同的解析方式.
下面附上程式碼:
public class ExcelUtil {
/**
* 讀取.xlsx 內容
* @param file
* @return
* @throws IOException
*/
public static List<ArrayList<String>> readXlsx (MultipartFile file) {
List<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
InputStream input = null;
XSSFWorkbook wb = null;
try {
input = file.getInputStream();
//建立文件
wb = new XSSFWorkbook(input);
ArrayList<String> rowList = null;
int totoalRows = 0;//總行數
int totalCells = 0;//總列數
//讀取sheet(頁)
for (int sheetIndex = 0 ; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
XSSFSheet xssfSheet = wb.getSheetAt(sheetIndex);
if (xssfSheet == null) {
continue;
}
totoalRows = xssfSheet.getLastRowNum();
//讀取row
for (int rowIndex = 0; rowIndex <= totoalRows; rowIndex++) {
XSSFRow xssfRow = xssfSheet.getRow(rowIndex);
if (xssfRow == null) {
continue;
}
rowList = new ArrayList<String>();
totalCells = xssfRow.getLastCellNum();
//讀取列
for (int cellIndex = 0; cellIndex < totalCells; cellIndex++) {
XSSFCell xssfCell = xssfRow.getCell(cellIndex);
if (xssfCell == null) {
rowList.add("");
} else {
xssfCell.setCellType(Cell.CELL_TYPE_STRING);
rowList.add(String.valueOf(xssfCell.getStringCellValue()));
}
}
list.add(rowList);
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if ( wb != null) {
wb.close();
}
if (input != null) {
input.close();
}
} catch (Exception e) {
}
}
return list;
}
/**
* 讀取 .xls內容
* @param file
* @return
* @throws IOException
*/
public static List<ArrayList<String>> readXls (MultipartFile file) {
List<ArrayList<String>> list = new ArrayList<ArrayList<String>>();
//建立輸入流
InputStream input = null;
//建立文件
HSSFWorkbook wb = null;
try {
input = file.getInputStream();
//建立文件
wb = new HSSFWorkbook(input);
ArrayList<String> rowList = null;
int totoalRows = 0;//總行數
int totalCells = 0;//總列數
//讀取sheet(頁)
for (int sheetIndex = 0 ; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
HSSFSheet hssfSheet = wb.getSheetAt(sheetIndex);
if (hssfSheet == null) {
continue;
}
totoalRows = hssfSheet.getLastRowNum();
//讀取row
for (int rowIndex = 0; rowIndex <= totoalRows; rowIndex++) {
HSSFRow hssfRow = hssfSheet.getRow(rowIndex);
if (hssfRow == null) {
continue;
}
rowList = new ArrayList<String>();
totalCells = hssfRow.getLastCellNum();
//讀取列
for (int cellIndex = 0; cellIndex < totalCells; cellIndex++) {
HSSFCell hssfCell = hssfRow.getCell(cellIndex);
if (hssfCell == null) {
rowList.add("");
} else {
hssfCell.setCellType(Cell.CELL_TYPE_STRING);
rowList.add(String.valueOf(hssfCell.getStringCellValue()));
}
}
list.add(rowList);
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
try {
if ( wb != null) {
wb.close();
}
if (input != null) {
input.close();
}
} catch (Exception e) {
}
}
return list;
}
/**
* 獲取檔案型別
* @param path
* @return
*/
public static String getPostfix (String path) {
if (StringUtils.isBlank(path) || !path.contains(".")) {
return null;
}
return path.substring(path.lastIndexOf(".") + 1, path.length()).trim();
}
}
ExcelUtil中值得一提的是:.setCellType(Cell.CELL_TYPE_STRING);因為我在執行中發現,若單元格內容為NUMBER型別時,如果不事先指定我們要獲取的內容格式,則會丟擲Cannot get a text value from a numeric cell異常,由於時間緊任務重,我並沒有繼續去研究excel取值的具體注意事項。而我只需要String格式的資料就可以滿足我了。至此,前端上傳excel檔案到後臺的大體實現方法就完成了,獲取到excel之後的業務邏輯我們需要根據自身專案需求來有不同的實現。而關於springmvc上傳檔案的具體配置由於不是我所關注的重點,所以不做過多的闡述。
二、流讀取本地檔案
有的時候我們並不需要將檔案上傳到後臺,這是一種比較繁瑣的做法,我們的需求很明確,只是獲取excel中的有用資料而已,這個時候可以直接使用流讀取就可以了。
主程式碼:
List<ArrayList<String>> readResult = null;//總行記錄
File file = null;
XSSFWorkbook xwb = null;
FileInputStream in = null;
HSSFWorkbook hwb = null;
try {
String filePath = "D:\\apss_user\\微山縣追溯監管使用者建立.xlsx";
file = new File(filePath);
//獲取檔案字尾
String postfix = ExcelUtil.getPostfix(filePath);
if (StringUtils.isBlank(postfix)) {
return;
}
in = new FileInputStream(file);
//讀取檔案內容
if (StringUtils.equals("xlsx", postfix)) {
xwb = new XSSFWorkbook(in);
readResult = ExcelUtil.readXlsx(xwb);
} else if (StringUtils.equals("xls", postfix)) {
hwb = new HSSFWorkbook(in);
readResult = ExcelUtil.readXls(hwb);
} else {
returnMessage.setError(1, "檔案型別錯誤");
}
if (readResult == null || readResult.size() == 0) {
returnMessage.setError(2, "檔案解析失敗");
}
List<GovUser> list = new ArrayList<GovUser>();
for (ArrayList<String> arr : readResult) {
if (arr.size() < 11 ) {
logger.info("長度小於10,跳過," + JSON.toJSONString(arr) );
continue;
}
String account = arr.get(0);//賬號
String pwd = arr.get(1);//密碼
String username = arr.get(2);//姓名
String phone = arr.get(3);//手機
String sex = arr.get(4);//性別
String divisionId = arr.get(11);//區劃
GovUser govUser = new GovUser();
govUser.setAccount(account);
govUser.setUsername(username);
govUser.setPassword(pwd);
govUser.setPhone(phone);
govUser.setSex(sex);
govUser.setDivisionId(divisionId);
govUser.setCreateTime(new Date());
list.add(govUser);
}
util的具體實現和上面的大同小異,這裡不再造重複的輪子了。。。
此篇文章只是起到了記錄作用,因為excel解析在我的工作中不會經常用到,而我恰恰是一個健忘的程式設計師,,我不希望再我下次要用的時候還要去各種谷歌,浪費了我的大量時間,所以並沒有過多的技術性講解,只是記錄而已。
相關推薦
java上傳(讀取)Excel利用poi解析
基於springmvc開發模式。 需要的Excel相關jar包 <dependency> <groupId>org.apache.poi</groupId>
Jquery的一鍵上傳元件OCUpload及POI解析Excel檔案
第一步:將js檔案引入頁面 <script type="text/javascript" src="${pageContext.request.contextPath }/js/jquery-1.8.3.js"></script> <script type
Java上傳下載excel、解析Excel、生成Excel的問題
在軟體開發過程中難免需要批量上傳與下載,生成報表儲存也是常有之事,最近集團門戶開發用到了Excel模版下載,Excel生成,圓滿完成,對這一知識點進行整理,資源共享,有不足之處還望批評指正,文章結尾提供了所需jar包的下載,方便大夥使用,下面言歸正傳! 1.
Springmvc檔案上傳例子,上傳帶圖片的Excel,並利用poi解析。
直奔主題,第一步:上傳一個帶圖片的Excel。第二步:解析該Excel檔案,得到Excel資料和圖片。 1.pom.xml <!-- 檔案上傳 --> <dependency> <groupId>commons-
Java上傳Excel並解析
err com XML ger exc try finally write else 1.上傳: public String uploadFile(CommonsMultipartFile file,String uploadPath,String realUploadP
java利用poi解析excel文件
sheet 文件 引入 exceptio form number string lean error: 首先需要引入以下jar包 如果使用maven,需要添加兩個依賴 <dependencies> <dependency>
java中解析上傳的excel檔案(xls,xlsx)
一、在maven庫中匯入相關依賴 其中poi是解析xls格式的,poi-ooxml是解析xlsx格式的 <!-- POI,excel解析相關 --> <dependency> <groupId>org.apache.poi</g
Java上傳且後臺解析XML檔案
後臺程式碼: import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.InputStreamReader; import javax.
java 上傳圖片至本地 並讀取圖片在網頁中顯示
java 上傳圖片至本地 並讀取圖片在網頁中顯示 程式碼+圖片如下所示 一、程式碼 @Controller public class ImageController { private static Logger logger = LoggerFactory.getLogge
java利用poi解析docx生成html
公司業務需要把world文件中編輯好的新聞(文字+圖片)錄入到CMS管理後臺,生成一篇新聞釋出。因為不能把圖片直接複製貼上到UEditor編輯器上,還要一個一個上傳太麻煩。所以這裡做了一個上傳docx檔案解析後,直接返回html正文放到前端編輯器繼續編輯。 功能
SpringBoot 使用POI對上傳的Excel進行處理
上一篇寫到了關於SpringBoot 處理Excel,並對Excel進行下載處理,這次我們進行讀取Excel,並對資料進行處理。 1.Maven引用 <dependency> <groupId>org.apache.poi</groupId> &l
Java實現從網頁上傳匯入excel資料到資料庫
一晃已經是十月份的最後一天了,時間過得很快... 專案中通過excel往資料庫批量匯入的功能頗為常見,所以今天整理出來一份簡單的例子,為了以後方便使用,同時也為大家實現功能作為一個參考
Java上傳Excel檔案匯入資料
Controller中接收form表單提交的檔案域: public Map importConsumer(@RequestParam("file") MultipartFile file) 讀取Excel工具類 這裡我以Consumer實體類來寫,大家可以自行封裝: pub
利用ajaxSubmit無重新整理非同步上傳匯入Excel,無重新整理提交表單
前臺頁面程式碼: <script type="text/javascript" src="/js/jquery.js"></script> <script type="text/javascript" src="/js/jquery.fo
JAVA實現SFTP檔案上傳和下載(利用JSCH.jar)
原文連結:https://my.oschina.net/hetiangui/blog/137357如果你想用純JAVA實現SFTP檔案上傳或下載,或者是想純JAVA連線到SSH2伺服器上執行命令,那就使用JSch.jar包吧。這裡我們先描述實現SFTP協議的上傳和下載,上程式
Java上傳下載完全解析(二)
上一篇我們分析了Java Web中的上傳開發: Java上傳下載完全解析(一) ,今天我們研究一下Java Web的下載與檔案位置配置資訊在開發與生產環境中的切換方法。 一、檔案下載 檔案下載其實非常簡單,首先我們根據請求的資訊得到檔案的名稱,然後根據檔案位置進行拼接
web匯入excel(利用POI解析)
今天跟大家分享下,如何匯入excel檔案(此處以POI作為例子講解) 1、匯入相關jar包(檔案上傳和poi的jar) 2、html頁面程式碼,form表單提交,也可以用ajax <form action="/MyTest/UploadAndPoiExcelServl
springMVC從上傳的Excel檔案中讀取資料
package com.jun.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arr
thinkphp上傳讀取帶中文名的excel
windows phpstudy環境下進行開發一、使用thinkphp 3.2.3的Upload上傳檔案,帶中文名的檔案儲存到後臺後是亂碼,解決方法:ThinkPHP\Library\Think\Upload\Driver\local.class.php 82行:if (
Java上傳下載完全解析(一)
在Java Web開發中,經常會用到上傳與下載檔案,典型的案例即為伺服器獲取上傳的檔案,將其儲存至本地,並獲取其下載的檔案url,客戶端在獲取下載的url後,在伺服器進行下載。下面我們就來說一下Java中檔案的上傳。 一、設定CommonsMultipartReso