附件上傳相關介紹——以java web爲例,excel的導入示例

附件上傳:

          附件上傳需要一個頁面-fileUpload.jsp或者fileUpload.html,在頁面中的input  必須有 name  <input type="file" name="filename">,且這個表單的enctype屬性就必須設置爲multipart/form-data,因爲瀏覽器表單的類型如果爲multipart/form-data,那麼瀏覽器在提交表單數據時,它將採用MIME協議對數據進行封裝後提交,在服務器這端也將不能採用原來傳統的方工獲取數據了。在服務器端想獲取數據就要通過流。request提供了一getInputStream讀取流。可在java後臺建立一個servlet負責處理上傳的文件數據,並將表單中每個輸入項封裝成一個FileItem對象中。servlet可以解析請求時需要根據DiskFileItemFactory對象的屬性sizeThreshold(臨界值)和repository(臨時目錄)來決定將解析得到的數據保存在內存還是臨時文件中,如果是臨時文件,保存在哪個臨時目錄中。

其中,FileItem是一個接口,文件上傳時需要用到,它的實現類是DiskFileItem。

FileItem類的常用方法:

1.  boolean isFormField()

        isFormField方法用於判斷FileItem類對象封裝的數據是一個普通文本表單字段,還是一個文件表單字段,如果是普通表單字段則返回true,否則返回false。因此,可以使用該方法判斷是否爲普通表單域,還是文件上傳表單域。

2.  String getName()
       getName方法用於獲得文件上傳字段中的文件名。

       注意IE或FireFox中獲取的文件名是不一樣的,IE中是絕對路徑,FireFox中只是文件名。

3.  String getFieldName()
      getFieldName方法用於返回表單標籤name屬性的值。如上例中<input type="text" name="column" />的value。

4.  void write(File file)

        write方法用於將FileItem對象中保存的主體內容保存到某個指定的文件中。如果FileItem對象中的主體內容是保存在某個臨時文件中,該方法順利完成後,臨時文件有可能會被清除。該方法也可將普通表單字段內容寫入到一個文件中,但它主要用途是將上傳的文件內容保存在本地文件系統中。

5.  String getString()
      getString方法用於將FileItem對象中保存的數據流內容以一個字符串返回,它有兩個重載的定義形式:

      public Java.lang.String getString()

      public java.lang.String getString(java.lang.String encoding)

             throws java.io.UnsupportedEncodingException

        前者使用缺省的字符集編碼將主體內容轉換成字符串,後者使用參數指定的字符集編碼將主體內容轉換成字符串。如果在讀取普通表單字段元素的內容時出現了中文亂碼現象,請調用第二個getString方法,併爲之傳遞正確的字符集編碼名稱。

6.  String getContentType()
        getContentType 方法用於獲得上傳文件的類型,即表單字段元素描述頭屬性“Content-Type”的值,如“image/jpeg”。如果FileItem類對象對應的是普通表單字段,該方法將返回null。

7.  boolean isInMemory()
        isInMemory方法用來判斷FileItem對象封裝的數據內容是存儲在內存中,還是存儲在臨時文件中,如果存儲在內存中則返回true,否則返回false。

8.  void delete()
       delete方法用來清空FileItem類對象中存放的主體內容,如果主體內容被保存在臨時文件中,delete方法將刪除該臨時文件。

        儘管當FileItem對象被垃圾收集器收集時會自動清除臨時文件,但及時調用delete方法可以更早的清除臨時文件,釋放系統存儲資源。另外,當系統出現異常時,仍有可能造成有的臨時文件被永久保存在了硬盤中。

9.  InputStream getInputStream()
    以流的形式返回上傳文件的數據內容。

10. long getSize()
      返回該上傳文件的大小(以字節爲單位)。

Commons-fileupload和commons-io兩個jar包.

爲了方便用戶處理文件上傳數據,Apache開源組織提供了一個用來處理表單文件上傳的一個開源組件(Commons-fileupload).使用Commons-fileupload組件實現文件上傳,需要導入該組件相應的jar包.

Commons-fileupload和commons-io兩個jar包.

DiskFileItemFactory是創建FileItem對象的工廠包括方法:

1.public void setSizeThreshold(int?sizeThreshold) 
設置內存緩衝區的大小,默認值爲10K,如果文件大於10K,將使用臨時文件緩

存上傳文件.

2.public void setRepository(Java.io.File repository)
指定臨時文件目錄

3.public DiskFileItemFactory();

ServletFileUpload類常用方法:

1)  public void setSizeMax(long sizeMax)
        setSizeMax方法繼承自FileUploadBase類,用於設置請求消息實體內容(即所有上傳數據)的最大尺寸限制,以防止客戶端惡意上傳超大文件來浪費服務器端的存儲空間。其參數是以字節爲單位的long型數字。

       在請求解析的過程中,如果請求消息體內容的大小超過了setSizeMax方法的設置值,將會拋出FileUploadBase內部定義的SizeLimitExceededException異常(FileUploadException的子類)。該方法有一個對應的讀方法:public long getSizeMax()方法。

2) public void setFileSizeMax(long fileSizeMax)
        setFileSizeMax方法繼承自FileUploadBase類,用於設置單個上傳文件的最大尺寸限制,以防止客戶端惡意上傳超大文件來浪費服務器端的存儲空間。其參數是以字節爲單位的long型數字。該方法有一個對應的讀方法:public long geFileSizeMax()方法。

       在請求解析的過程中,如果單個上傳文件的大小超過了setFileSizeMax方法的設置值,將會拋出FileUploadBase內部定義的FileSizeLimitExceededException異常(FileUploadException的子類)。

3) public List parseRequest(javax.servlet.http.HttpServletRequest req)
        parseRequest 方法是ServletFileUpload類的重要方法,它是對HTTP請求消息體內容進行解析的入口方法。它解析出FORM表單中的每個字段的數據,並將它們分別包裝成獨立的FileItem對象,然後將這些FileItem對象加入進一個List類型的集合對象中返回。

       該方法拋出FileUploadException異常來處理諸如文件尺寸過大、請求消息中的實體內容的類型不是“multipart/form-data”、IO異常、請求消息體長度信息丟失等各種異常。每一種異常都是FileUploadException的一個子類型。

4)  public FileItemIterator getItemIterator(HttpServletRequest request)
        getItemIterator方法和parseRequest 方法基本相同。但是getItemIterator方法返回的是一個迭代器,該迭代器中保存的不是FileItem對象,而是FileItemStream 對象,如果你希望進一步提高新能,你可以採用getItemIterator方法,直接獲得每一個文件項的數據輸入流,做底層處理;如果性能不是問題,你希望代碼簡單,則採用parseRequest方法即可。

5) public stiatc boolean isMultipartContent(HttpServletRequest req)
        isMultipartContent方法方法用於判斷請求消息中的內容是否是“multipart/form-data”類型,是則返回true,否則返回false。isMultipartContent方法是一個靜態方法,不用創建ServletFileUpload類的實例對象即可被調用。

6) getFileItemFactory()和setFileItemFactory(FileItemFactory)
       方法繼承自FileUpload類,用於設置和讀取fileItemFactory屬性。

7) public void setProgressListener(ProgressListener pListener)
      設置文件上傳進度監聽器。該方法有一個對應的讀取方法:ProgressListener getProgressListener()。

8) public void setHeaderEncoding()
       在文件上傳請求的消息體中,除了普通表單域的值是文本內容以外,上傳文件中的文件路徑名也是文本(包括文件名),在內存中保存的是它們的某種字符集編碼的字節數組,Apache文件上傳組件在讀取這些內容時,必須知道它們所採用的字符集編碼,才能將它們轉換成正確的字符文本返回。

        setHeaderEncoding方法繼承自FileUploadBase類,用於設置上面提到的字符編碼。如果沒有設置,則對應的讀方法getHeaderEncoding()方法返回null,將採用HttpServletRequest設置的字符編碼,如果HttpServletRequest的字符編碼也爲null,則採用系統默認字符編碼。可以通過一下語句獲得系統默認字符編碼:

         System.getProperty("file.encoding"));

DiskFileItemFactory類

 將請求消息實體中的每一個項目封裝成單獨的DiskFileItem (FileItem接口的實現) 對象的任務
由 org.apache.commons.fileupload.FileItemFactory 接口的默認實現 
org.apache.commons.fileupload.disk.DiskFileItemFactory 來完成。當上傳的文件項目比較小時,直接保存在內存中(速度比較快),比較大時,以臨時文件的形式,保存在磁盤臨時文件夾(雖然速度慢些,但是內存資源是有限的)。

屬性
1) public static final int DEFAULT_SIZE_THRESHOLD :將文件保存在內存還是磁盤臨時文件夾的默認臨界值,值爲10240,即10kb。

2) private File repository:用於配置在創建文件項目時,當文件項目大於臨界值時使用的臨時文件夾,默認採用系統默認的臨時文件路徑,可以通過系統屬性 java.io.tmpdir獲取。如下代碼:

System.getProperty("java.io.tmpdir");

3) private int sizeThreshold:用於保存將文件保存在內存還是磁盤臨時文件夾的臨界值

構造方法
1) public DiskFileItemFactory()

      採用默認臨界值和系統臨時文件夾構造文件項工廠對象。

2) public DiskFileItemFactory(int sizeThreshold,File repository)

      採用參數指定臨界值和系統臨時文件夾構造文件項工廠對象。

3) FileItem createItem() 
       根據DiskFileItemFactory相關配置將每一個請求消息實體項目創建成DiskFileItem 實例,並返回。該方法從來不需要我們親自調用,FileUpload組件在解析請求時內部使用。

4) void setSizeThreshold(int sizeThreshold)
        Apache文件上傳組件在解析上傳數據中的每個字段內容時,需要臨時保存解析出的數據,以便在後面進行數據的進一步處理(保存在磁盤特定位置或插入數據庫)。因爲Java虛擬機默認可以使用的內存空間是有限的,超出限制時將會拋出“java.lang.OutOfMemoryError”錯誤。如果上傳的文件很大,例如800M的文件,在內存中將無法臨時保存該文件內容,Apache文件上傳組件轉而採用臨時文件來保存這些數據;但如果上傳的文件很小,例如600個字節的文件,顯然將其直接保存在內存中性能會更加好些。

        setSizeThreshold方法用於設置是否將上傳文件已臨時文件的形式保存在磁盤的臨界值(以字節爲單位的int值),如果從沒有調用該方法設置此臨界值,將會採用系統默認值10KB。對應的getSizeThreshold() 方法用來獲取此臨界值。

5) void setRepository(File repository)
        setRepositoryPath方法用於設置當上傳文件尺寸大於setSizeThreshold方法設置的臨界值時,將文件以臨時文件形式保存在磁盤上的存放目錄。有一個對應的獲得臨時文件夾的 File getRespository() 方法。

         注意:當從沒有調用此方法設置臨時文件存儲目錄時,默認採用系統默認的臨時文件路徑,可以通過系統屬性 java.io.tmpdir 獲取。如下代碼:

System.getProperty("java.io.tmpdir");

Tomcat系統默認臨時目錄爲“<tomcat安裝目錄>/temp/”。

代碼示例-簡單的實現excel的導入:

1.頁面調用

$("#INPORT").on("click",function(){//導入按鈕點擊事件
	$("#importExcel").show();//彈出導入的div
	//請求相應的service,method,指定導入的excel所屬模板,參數,以及回調函數
	importExcel("service", "method", "excelTemplete", {}, function (responseStr) {
				$("#importExcel").hide();//關閉彈窗
				 alert(responseStr);//打印上傳結果信息
	});
});

2.uploadExcel.jsp

<script>
function importExcel(serviceName, methodName, xlsType, parameter, okCallBack) {
        $("#submitMyExcel").off("click");
        $("#submitMyExcel").on("click", function () {
            if (checkFile()) {
                checkExcel(serviceName, methodName, xlsType, parameter, okCallBack);
                IPLAT.progress($("body"), true); //使用提交動畫,防止表單重複提交
            }
        })


    }

    function checkFile() {
        var file_path = getFileName("myfile");
        var fileName = file_path.replace(/(.*\/)*([^.]+).*/ig, "$2");
        var FileExt = file_path.replace(/.+\./, "").toLowerCase();
        if (!fileName) {
            alert("文件不能爲空");
            return false;
        }
        else if (FileExt.indexOf("xls") < 0) {
            alert("請選擇excel文件");
            return false;
        }
        // } else if(/.*[\u4e00-\u9fa5]+.*$/.test(fileName))
        // {
        //     alert("文件名含有中文");
        // }
        return true;
    }

    function checkExcel(serviceName, methodName, xlsType_list, parameter, okCallBack) {
        var file_path = getFileName("myfile");
        var fileName = file_path.replace(/(.*\/)*([^.]+).*/ig, "$2");
        var formData = new FormData();
        var name = $("#myfile").val();
        var file= $("#myfile")[0].files[0];
        formData.append("file",file);
        formData.append("name", fileName);
        formData.append("serviceName", serviceName);
        formData.append("methodName", methodName);
        formData.append("parameter", parameter);
        var xlsType = [];
        if (xlsType_list.constructor === Array) {//存在name或sheet
            for (var i = 0; i < xlsType_list.length; i++) {
                var key_name = xlsType_list[i].hasOwnProperty("name");
                var key_sheet = xlsType_list[i].hasOwnProperty("sheet");
                var val_name = xlsType_list[i].name;
                var val_type = xlsType_list[i].type;
                //如果未指定sheet頁,默認sheet1。否則按照指定sheet頁對照
                var val_sheet = "sheet1";
                if (key_sheet) {
                    val_sheet = "sheet" + xlsType_list[i].sheet;
                }
                if (key_name)//存在名稱,按名稱導入
                {
                    if (name.indexOf(val_name) >= 0) {
                        xlsType.push({"sheet":val_sheet,"type":val_type});
                        break;
                    }
                }else{
                    xlsType.push({"sheet":val_sheet,"type":val_type});
                }

            }
        }
        else {
            //未指定,則默認
            xlsType.push({"sheet":"sheet1","type":xlsType_list});
        }
        if (xlsType == "") {
            alert("參數錯誤");
            return;
        }

        formData.append("xlsType", JSON.stringify(xlsType));
/*        for (key in parameter) {
            formData.append(key, parameter[key]);
        }*/

        $.ajax({
            url: IPLATUI.CONTEXT_PATH + "/importExcel",
            timeout: 300000,
            type: 'POST',
            async: true,
            data: formData,
            processData: false,
            contentType: false,
            beforeSend: function (res) {
                IPLAT.progress($("body"), true);
            },
            success: function (res) {
                IPLAT.progress($("body"), false);
                if (typeof okCallBack == "function") {
                    okCallBack(res);
                }

            },
            error: function (errorStr) {
                IPLAT.progress($("body"), false);

            }
        });

    }

    function getFileName(id) {
        var fileName = document.getElementById(id).value;
        if (fileName != '') {
            var index1 = fileName.lastIndexOf('/');
            var index2 = fileName.lastIndexOf('\\');
            var index = 0;
            if (index1 != -1)
                index = index1;
            if (index2 != -1 && index2 > index1)
                index = index2;
            if (index == 0) {
                alert("上傳文件路徑不正確");
                return false;
            } else
                fileName = fileName.substring(index + 1);
            return fileName;
        } else
            return false;

    }


</script>

<div id="importExcel" title="文件上傳" height="150px" width="550px" top="250px" left="500px">
    <form action="" id="importMyExcel" enctype="multipart/form-data" method="post">
        <input type="file" name="myfile" id="myfile"> </br>
        <input type="button" value="導入" id="submitMyExcel" class="i-btn-lg" onclick=""/>
    </form>
</div>

3.配置訪問後臺servlet的web.xml

<servlet>
	   <servlet-name>ImportExcel</servlet-name>
	   <servlet-class>com.pacage.項目名.common.excel.handler.ImportExcelServlet</servlet-class>
	</servlet>
	 
	<servlet-mapping>
	   <servlet-name>ImportExcel</servlet-name>
	   <url-pattern>/importExcel</url-pattern>
	</servlet-mapping>

4.後臺對excle的簡單處理方法ImportExcelServlet.java

package com.pacage.項目名.common.excel.handler;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.baosight.bxyw.common.excel.util.ImportExcelUtil;
import com.baosight.iplat4j.core.ei.EiConstant;
import com.baosight.iplat4j.core.ei.EiInfo;
import com.baosight.iplat4j.core.log.Logger;
import com.baosight.iplat4j.core.log.LoggerFactory;
import com.baosight.iplat4j.core.service.soa.XLocalManager;
import com.baosight.iplat4j.core.web.threadlocal.UserSession;

import net.sf.json.JSONArray;
/**
 * EXCEL導入Servlet
 * @author 18078
 *
 */
public class ImportExcelServlet extends HttpServlet {

	private static final long serialVersionUID = 2783045756722791019L;

	Logger logger = LoggerFactory.getLogger(ImportExcelServlet.class);

	public static final String SUCCESS = "1";
	public static final String FAIL = "-1";

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		EiInfo outInfo =new EiInfo();
		try {
			//設置編碼
			response.setContentType("text/html;charset=UTF-8");
			UserSession.web2Service(request);
			//獲取參數
			Map params= paramManager.getMultiPartsParam(request);

			params.put("userId",UserSession.getUserId());//用戶編號
			params.put("loginName",UserSession.getLoginName());//用戶編號
			//轉數組
			JSONArray ar_xlsType = JSONArray.fromObject(params.get("xlsType"));
     		HashMap xlsData= new  LinkedHashMap();
			xlsData=ImportExcelUtil.parseExcel((InputStream)params.get("inputStream"),ar_xlsType);
            //存附件

            
            //-----根據配置serviceName,methodName請求相應的excel處理方法start-----
            //xlsData 即excel數據
	//-----根據配置serviceName,methodName請求相應的excel處理方法end-----

		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.getMessage());
			outInfo.setMsg(e.toString());
			outInfo.setStatus(-1);
			response.getWriter().write(outInfo.toJSONString());
			return;
		}

		response.getWriter().write(outInfo.toJSONString());
	}

}

5.解析excel數幫助類ImportExcelUtil.java

package com.pacage.項目.common.excel.util;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.apache.commons.lang.StringUtils;
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.ss.usermodel.WorkbookFactory;

import com.baosight.bxyw.common.util.daoUtil.BeanFactoryUtils;
import com.baosight.bxyw.yn.bs.domain.MTXLS;
import com.baosight.iplat4j.core.data.ibatis.dao.Dao;
import com.baosight.iplat4j.core.ioc.spring.PlatApplicationContext;
import com.baosight.iplat4j.core.log.Logger;
import com.baosight.iplat4j.core.log.LoggerFactory;

import net.sf.json.JSONArray;


/**
 * 導入office文件(xls)
 *
 * @author th
 * @time 2018-02-23
 */
public class ImportExcelUtil {

   
    private static final Dao dao = BeanFactoryUtils.getDaoLimitOf99999();
    private static final Logger logger = LoggerFactory.getLogger(ImportExcelUtil.class);


    private static final int MAX_COLS = 100;
    private static final int MAX_ROWS = 10000;

    //獲取數據庫配置表與excel文件的對照關係
    public static Map queryMapping(String xlsType) {

        HashMap map = new HashMap();
        map.put("xlsType", "import");
        if (!StringUtils.isBlank(xlsType)) {
            map.put("xlsClassify", xlsType);
        }
        List<MTXLS> plist = dao.query("YNBS08.query", map);
        Map<String, String> mapping = new HashMap<String, String>();
        for (int i = 0; i < plist.size(); i++) {
            MTXLS mtxls =  plist.get(i);
            String colcname = mtxls.getColCname();
            String colename = mtxls.getColEname();
            mapping.put(colcname.trim().replaceAll("\r|\n", ""), colename.trim().replaceAll("\r|\n", ""));
            //mapping.put(colename, colcname);
        }

        return mapping;
    }


    /**
     * 方法說明
     *
     * @param inStream 輸入流
     * @param mapping  字段名稱映射
     * @return 返回list
     * @throws Exception
     * @method 將流中的Excel數據轉成List<Map>
     * @author dada
     * @date 2018-02-23
     */
    public static HashMap parseExcel(InputStream inStream,
                                     JSONArray xlsType) throws Exception {

        //獲取多個對照關係
        Map<String,Map> mapping=new HashMap();
        for(int i=0;i<xlsType.size();i++){
            String map_sheet= xlsType.getJSONObject(i).getString("sheet");
            String map_type=xlsType.getJSONObject(i).getString("type");
            mapping.put(map_sheet, queryMapping(map_type));
        }
       // Map mapping = queryMapping(xlsType);
        //excel操作類
        Workbook work = WorkbookFactory.create(inStream);
        Sheet sheet = null;
        Row row = null;
        Cell cell = null;
        // 返回數據
        HashMap SheetMap = new LinkedHashMap();


        // 遍歷Excel中所有的sheet
        for (int i = 0; i < work.getNumberOfSheets(); i++) {
            List emptyCol = new ArrayList();
            List<Map<String, Object>> ls = new ArrayList<Map<String, Object>>();
            sheet = work.getSheetAt(i);//遍歷sheet
            if (sheet == null) {
                continue;
            }

            Map mapping_sheet=mapping.get("sheet"+(i+1));
            // 取第一行標題
            row = sheet.getRow(0);
            String title[] = null;
            if (row != null) {
                //title = new String[mapping.size()];
                title = new String[row.getLastCellNum()];//列頭
                for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
                    cell = row.getCell(y);
                    String key = (String)CellUtil.getCellValue(cell);
                    if ("".equals(key)) {
                        key = "col" + y;
                        emptyCol.add(key);
                    }
                    if (mapping_sheet.containsKey(key.trim().replaceAll("\r|\n", "")) || "none".equals(xlsType)) {
                        title[y] = key;
                    } else {
                        title[y] = "none";
                    }
                }

            } else//沒有列頭跳過
            {
                continue;
            }

            logger.info(JSONArray.fromObject(title));

            // 遍歷當前sheet中的所有行
            for (int j = 1; j < sheet.getLastRowNum() + 1; j++) {
                row = sheet.getRow(j);
                if (row == null) {
                    continue;
                }
                Map<String, Object> map = new LinkedHashMap<String, Object>();
                // 遍歷所有的列
                try {
                    for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {

                        cell = row.getCell(y);
                        String key = title[y];
                        if (key == null) {
                            key = "col" + y;
                        }

                        boolean isMerge = CellUtil.isMergedRegion(sheet, j,y);
                        Object val=CellUtil.getCellValue(cell);
                        //讀取合併單元格值
                        if(isMerge){
                            val=CellUtil.getMergedRegionValue(sheet, j, y);
                        }

                        if (!"none".equals(key)) {
                            if ("none".equals(xlsType)) {
                                map.put(key, val);
                            } else {
                                map.put(mapping_sheet.get(key).toString(), val);
                            	//map.put(key, val);
                            }
                        }
                    }
                } catch (Exception ex) {
                    String px = ex.toString();
                }

                if(map!=null)
                {
                    ls.add(map);
                }
            }
            filterList(ls, emptyCol);
            SheetMap.put("sheet" + (i + 1), ls);
        }
        return SheetMap;

    }

    /*
     * @Author: dada
     * @Description: 去除解析過程中的無效列
     * @Date: 19:21 2018/7/26/026
     * @Param: [sheeMap]
     * @return java.util.HashMap
     **/
    public static List<Map<String, Object>> filterList(List<Map<String, Object>> sheetList, List<String> emptyCol) {

        List<String> removeCol = new ArrayList();
        for (String col : emptyCol) {
            List isEmptyList = sheetList
                    .stream()
                    .filter((Map e) -> "".equals(e.get(col)))
                    .map((Map e) -> e.get(col))
                    .collect(Collectors.toList());
            if (isEmptyList.size() == sheetList.size()) {//都是空
                removeCol.add(col);
            }
        }
        for (Map<String, Object> row : sheetList) {
            for (String col : removeCol) {
                row.remove(col);
            }
        }
        return sheetList;

    }




    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {

        String filename = "C:/Users/Administrator/Downloads/t.xlsx";
        FileInputStream in = new FileInputStream(filename);
        try {
            Collection vals = null;//readXls(in);
            System.out.println(vals);
            System.out.println("import successfully." + (new Date()).toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            in.close();
        }

    }

}

6.最終把excel數據導入數據

/**
	 * @return
	 */
	public EiInfo method(EiInfo info){
		try{
			HashMap xlsData =(HashMap)info.get("data");
			List<Map<String, Object>> ls = (List<Map<String, Object>>)xlsData.get("sheet1");
			
			int i = 0;
			for (Map<String, Object> map : ls) {
				i++;
				//對map數據進行異常判斷處理

                //插入信息進入數據庫
				insert(map);
			}
		}catch(Exception e){
			logger.error(e.getMessage());
			return common.getReturn(msg, Constant.STATUS_FAILURE, "導入失敗!"+e.getMessage());
		}
		return common.getReturn(msg, Constant.STATUS_SUCCESS, "導入成功!");
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章