在gwt中读取xls文件

时间:2011-06-28 09:23:23

标签: gwt

我希望使用gwt RPC读取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 个答案:

答案 0 :(得分:1)

为什么使用系统类加载器而不是正常的?

但是,如果你还想使用,请看看这个..

正如您在使用Web应用程序一样。在这种情况下,您需要使用获得的ClassLoader,如下所示:

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

这个可以访问与所讨论的webapplication相关联的所有类路径路径,并且您不再依赖于哪个父类加载器(一个webapp有多个!)已经加载了您的类。

然后,在这个类加载器上,你需要调用getResourceAsStream()来获取类路径资源作为流,而不是getSystemResourceAsStream(),这取决于web应用程序的启动方式。您不希望依赖于此,因为您无法在外部托管中对其进行控制:

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

文件的位置应在CLASSPATH中。