/**
 * 
 */
package com.vteam.mul;import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;import jxl.Cell;
import jxl.CellType;
import jxl.LabelCell;
import jxl.Sheet;
import jxl.Workbook;/**
 * @作者 Jarvis
 * @创建日期 Nov 19, 2009
 * @版本 V 1.0
 */public class ReadExcel { /**
 * @param args
 */
private String ExcelPath ;
private HashMap ExcelMap ;
private int column1 ;//指定读取列1 从0 开始
private int column2 ;//指定读取列2 从0 开始
private int rowStart;//读取起始行下标 从0 开始

public ReadExcel(){

}
public ReadExcel(String ExcelPath){
this.ExcelPath = ExcelPath ;
}
/**
 * 读取Excel 按照sheet名称顺序读取
 * 需要设置Excel路径ExcelPath,读取起始行rowStart,读取的2列column1和column2
 * @return
 */
public HashMap ReadExcel(){
 try
       {
   ExcelMap = new HashMap();//存储 中文key-英文value    
   File file = new File(this.ExcelPath);
           Workbook rwb = Workbook.getWorkbook(file);
           String[] sheets = rwb.getSheetNames();
//            rwb.close();
//            Sheet st = rwb.getSheet(this.getSheetNo()) ;//下标获取表名,从0开始
           for(int i = 0 ; i< sheets.length ; i++){    
//             Workbook temrwb = Workbook.getWorkbook(file);
            Sheet st = rwb.getSheet(sheets[i]);//sheet名称获取方式     
            int row = st.getRows(); // /得到该sheet的行数
//             int column = st.getColumns(); // 得到该sheet的列数
            int starrow = this.rowStart ;
            Cell key = null ;
            Cell value = null ;
            while(starrow < 10){            
            key = st.getCell(this.getColumn1(),starrow);//第一个参数代表列 第二个参数代表行
            value = st.getCell(this.getColumn2(),starrow);
            //通用的获取cell值的方式,返回字符串
            String keyStr = key.getContents();
            String valueStr = key.getContents();
            //获得cell具体类型值的方式
            if(key.getType() == CellType.LABEL)
            {
            LabelCell labelkey = (LabelCell)key;
            keyStr = labelkey.getString();
            }
            if(value.getType() == CellType.LABEL)
            {
            LabelCell labelvalue = (LabelCell)value;
            valueStr = labelvalue.getString();
            }
            ExcelMap.put(keyStr,valueStr );//存储中文-英文
            starrow ++ ;//递增
            }
            System.out.println("从Excel文件:< "+this.ExcelPath+" >的sheet:["+sheets[i]+"]读取多语言共<"+starrow+">行");
            //关闭
            rwb.close();           
           }
           
     }catch(Exception e){
           e.printStackTrace();
       }        return ExcelMap ;
}


public static void main(String[] args) {
// TODO Auto-generated method stub
ReadExcel re = new ReadExcel();
re.setExcelPath("E:/1.xls");
re.setColumn1(0);//读取列1
re.setColumn2(1);//读取列 2
re.setRowStart(1);//读取起始行
HashMap map = re.ReadExcel();
Set set = map.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
String key = (String)it.next();
System.out.println(">> "+map.get(key));
}
}
// setter && getter-------------------start
public String getExcelPath() {
return ExcelPath;
}
public void setExcelPath(String excelPath) {
ExcelPath = excelPath;
}
public HashMap getExcelMap() {
return ExcelMap;
} public void setExcelMap(HashMap excelMap) {
ExcelMap = excelMap;
} public int getColumn1() {
return column1;
}
public void setColumn1(int column1) {
this.column1 = column1;
}
public int getColumn2() {
return column2;
}
public void setColumn2(int column2) {
this.column2 = column2;
}

public int getRowStart() {
return rowStart;
}
public void setRowStart(int rowStart) {
this.rowStart = rowStart;
} //setter && getter-------------------end
}JXL读取Excel报奇怪空指针错误。是在是没查出原因
测试Excel满足:至少2列,10行。多个sheet,即一个Excel里有2个以上表格页面 才会出现这个问题
请问下这个应该怎么解决?获取sheet名称后,我遍历sheet居然不成功,高手指教下在线等待 满意即给分

解决方案 »

  1.   

    会jxl.jar操作Excel的大侠都在干吗?
      

  2.   

    楼主贴那么多代码,还不如把异常贴出来更好。我觉得楼主还是顺着异常找下去,肯定是楼主在哪向一个为null的对象发送消息(调用方法)了,楼主试试找到报空指针异常的那行,要么单步debug一下,要么把那行所用到的所有对象的引用println一下,就能知道哪个对象在该存在的时候为null了。并且我猜最后问题与xls无关。
      

  3.   

    这个应该算是jxl的一个bug吧,我也曾遇到过这种问题!比如一个表格实际只有10行,但是会读到10行以后的数据,然后报一个NullPointException,通常遇到这种情况,我都直接吧表格10行后的空行选中,再删除,保存,在读取就可以了