1. 程式人生 > >java上傳(讀取)Excel利用poi解析

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-

JavaExcel解析

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 使用POIExcel進行處理

上一篇寫到了關於SpringBoot 處理Excel,並對Excel進行下載處理,這次我們進行讀取Excel,並對資料進行處理。 1.Maven引用 <dependency> <groupId>org.apache.poi</groupId> &l

Java實現從網頁匯入excel資料到資料庫

       一晃已經是十月份的最後一天了,時間過得很快...        專案中通過excel往資料庫批量匯入的功能頗為常見,所以今天整理出來一份簡單的例子,為了以後方便使用,同時也為大家實現功能作為一個參考

JavaExcel檔案匯入資料

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