2011-06-28 115 views
0

我正在使用gwt RPC讀取xls文件,並且當我使用在正常文件中執行良好的代碼時,它無法加載文件並給出空指針異常。在gwt中讀取xls文件

以下是代碼 { {

import com.arosys.readExcel.ReadXLSX; 
import com.google.gwt.user.server.rpc.RemoteServiceServlet; 
import org.Preview.client.GWTReadXL; 
import java.io.InputStream; 
import com.arosys.customexception.FileNotFoundException; 
import com.arosys.logger.LoggerFactory; 
import java.util.Iterator; 
import org.apache.log4j.Logger; 
import org.apache.poi.xssf.usermodel.XSSFCell; 
import org.apache.poi.xssf.usermodel.XSSFRow; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
/** 
* 
* @author Amandeep 
*/ 
public class GWTReadXLImpl extends RemoteServiceServlet implements GWTReadXL 
{ 
    private String fileName; 
    private String[] Header=null; 
    private String[] RowData=null; 
    private int sheetindex; 
    private String sheetname; 
    private XSSFWorkbook workbook; 
    private XSSFSheet sheet; 
    private static Logger logger=null; 


public void loadXlsxFile() throws Exception 
    { 
     logger.info("inside loadxlsxfile:::"+fileName); 
     InputStream resourceAsStream =ClassLoader.getSystemClassLoader().getSystemResourceAsStream("c:\\test2.xlsx"); 
     logger.info("resourceAsStream-"+resourceAsStream); 
     if(resourceAsStream==null) 
      throw new FileNotFoundException("unable to locate give file"); 
     else 
     { 
       try 
       { 
        workbook = new XSSFWorkbook(resourceAsStream); 
        sheet = workbook.getSheetAt(sheetindex); 
       } 
       catch (Exception ex) 
       { 
        logger.error(ex.getMessage()); 
       } 
     } 

    }// end loadxlsxFile 
    public String getNumberOfColumns() throws Exception 
    { 
     int NO_OF_Column=0; XSSFCell cell = null; 
     loadXlsxFile(); 
     Iterator rowIter = sheet.rowIterator(); 
     XSSFRow firstRow = (XSSFRow) rowIter.next(); 
     Iterator cellIter = firstRow.cellIterator(); 
      while(cellIter.hasNext()) 
      { 
        cell = (XSSFCell) cellIter.next(); 
        NO_OF_Column++; 
      } 

     return NO_OF_Column+""; 
    } 

} 

} 

我通過這段代碼調用它的客戶端程序:

 final AsyncCallback<String> callback1 = new AsyncCallback<String>() { 
     public void onSuccess(String result) { 
      RootPanel.get().add(new Label("In success")); 
      if(result==null) 
      { 
      RootPanel.get().add(new Label("result is null")); 
      } 
      RootPanel.get().add(new Label("result is"+result)); 


     } 
      public void onFailure(Throwable caught) { 
      RootPanel.get().add(new Label("In Failure"+caught)); 
      } 
     }; 
     try{ 
     getService().getNumberOfColumns(callback1); 
    }catch(Exception e){} 

}

請告訴我,我怎麼能解決這個因爲通過正常的java文件運行時代碼運行良好。

回答

1

爲什麼要使用系統類加載器,而不是普通的?

但是,如果你仍然想使用再看看這個..

當你使用的是像一個Web應用程序。在這種情況下,你需要使用它得到ClassLoader如下:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 

這其中有獲得綁有問題的web應用中的所有類路徑的路徑和你不再依賴於哪個父類加載器(一個webapp有不止一個!)已經加載你的課程。

然後,在這個類加載器上,您只需調用getResourceAsStream()來獲取類路徑資源作爲流,而不是getSystemResourceAsStream(),這取決於Web應用程序的啓動方式。你不希望依賴於,以及因爲你必須在外部託管沒有對其進行控制:

InputStream input = classLoader.getResourceAsStream("filename.extension"); 

文件的位置應該在你的CLASSPATH