关于java读取excel的问题。读取到某行有空值的错误

zhiyankemeifen 2015-09-23 10:27:52
	private void readXml(String fileName) {

boolean isE2007 = false; //判断是否是excel2007格式
if(fileName.endsWith("xlsx"))
isE2007 = true;
try {
InputStream input = new FileInputStream(fileName); //建立输入流
Workbook wb = null;
//根据文件格式(2003或者2007)来初始化
if(isE2007)
wb = new XSSFWorkbook(input);
else
wb = new HSSFWorkbook(input);
Sheet sheet = wb.getSheetAt(0); //获得第一个表单
Iterator<Row> rows = sheet.rowIterator(); //获得第一个表单的迭代器
while (rows.hasNext()) {
Row row = rows.next(); //获得行数据
System.out.println("Row #" + row.getRowNum()); //获得行号从0开始
Iterator<Cell> cells = row.cellIterator(); //获得第一行的迭代器
String value = "";
while (cells.hasNext()) {
Cell cell = cells.next(); //获得列数据
System.out.println("Cell #" + cell.getColumnIndex());
switch (cell.getCellType()) { //根据cell中的类型来输出数据
case HSSFCell.CELL_TYPE_NUMERIC:
// System.out.println(cell.getNumericCellValue());
DecimalFormat df = new DecimalFormat("0");
String shu = df.format(cell.getNumericCellValue()); //将科学计数的转换
value += shu+ ",";
System.out.println(shu);
break;
case HSSFCell.CELL_TYPE_STRING:
System.out.println(cell.getStringCellValue());
value += cell.getStringCellValue() + ",";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
System.out.println(cell.getBooleanCellValue());
value += cell.getBooleanCellValue()+ ",";
break;
case HSSFCell.CELL_TYPE_FORMULA:
System.out.println(cell.getCellFormula());
value += cell.getCellFormula()+ ",";
break;
default:
System.out.println("unsuported sell type");
break;
}
}
//写入数据库
if(row.getRowNum()>0){
String[] val = value.split(",");
System.out.println(value);
AddressList addressList= new AddressList();
addressList.setName(val[0]);
addressList.setTel(val[1]);
addressList.setEmall(val[2]);
addressList.setFax(val[3]);
addressList.setRoomnum(val[4]);
addressList.setOph(val[5]);
addressList.setAddress(val[6]);
addressList.setComments(val[7]);
addressList.setSort(Integer.parseInt(val[8]));
//addressList.setBirthday(val[9]);

addressList.setPid(pid);
addressList.setUserid(userid);
addressList.setType(type);
addressList.setSex(0);
addressListService.save(addressList);
}
}

} catch (IOException ex) {
ex.printStackTrace();
}
}


代码如上,原文http://blog.csdn.net/shuwei003/article/details/6741649 ,我在原文的基础上修改的,我是导入到sql里面 出现问题的地方是在//写入数据库,
当读取到第五列的时候因为是空的,addressList.setName(val[0]); 这就取不到,因为是根据数字来取值的,没有值就错。一错整个方法就运行不了
...全文
6504 点赞 收藏 32
写回复
32 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
try { InputStream is = file.getInputStream(); // 得到excel Workbook wb = null; if (file.getOriginalFilename().endsWith("xlsx")) { wb = new XSSFWorkbook(is); } else { wb = new HSSFWorkbook(is); } List<String> listCode = new ArrayList<>(); String sql = ""; Sheet sheet = wb.getSheetAt(0); // 获得第一个表单 Iterator<Row> rows = sheet.rowIterator(); // 获得第一个表单的迭代器 while (rows.hasNext()) { Row row = rows.next(); // 获得行数据 if (row.getRowNum() == 0) { // 第一行 跳过 continue; } //判断读取的单元格是否为空 if (row.getCell(0)== null) { break; } // System.out.println("Row #" + row.getRowNum()); // 获得行号从0开始 Iterator<Cell> cells = row.cellIterator(); // 获得第一行的迭代器 String value = ""; while (cells.hasNext()) { Cell cell = cells.next(); // 获得列数据 // System.out.println("Cell #" + cell.getColumnIndex()); switch (cell.getCellType()) { // 根据cell中的类型来输出数据 case HSSFCell.CELL_TYPE_NUMERIC: DecimalFormat df = new DecimalFormat("0"); String shu = df.format(cell.getNumericCellValue()); // 将科学计数的转换 value += shu + ","; // System.out.println(shu); break; case HSSFCell.CELL_TYPE_STRING: // System.out.println(cell.getStringCellValue()); value += cell.getStringCellValue() + ","; break; case HSSFCell.CELL_TYPE_BOOLEAN: // System.out.println(cell.getBooleanCellValue()); value += cell.getBooleanCellValue() + ","; break; case HSSFCell.CELL_TYPE_FORMULA: // System.out.println(cell.getCellFormula()); value += cell.getCellFormula() + ","; break; default: // System.out.println("unsuported sell type"); break; } } //写入数据库 if(row.getRowNum()>0){ String[] val = value.split(",");
回复
菠萝科技 2017-02-10
引用 30 楼 baidu_21939429 的回复:
引用 29 楼 wabiaozia 的回复:
[quote=引用 27 楼 wabiaozia 的回复:] 博主解决这个问题解决了吗
我已经找到解决方案:获得参数的数量和读取excel里表格数量比较
还有具体实现的源码么。 没太理解你说的这个[/quote]http://gaosheng08.iteye.com/blog/624758
回复
啧啧 2017-02-10
引用 29 楼 wabiaozia 的回复:
引用 27 楼 wabiaozia 的回复:
博主解决这个问题解决了吗
我已经找到解决方案:获得参数的数量和读取excel里表格数量比较
还有具体实现的源码么。 没太理解你说的这个
回复
菠萝科技 2016-05-18
[quote=引用 27 楼 wabiaozia 的回复:] 博主怎么解决这个问题的,能提供个思路吗
回复
菠萝科技 2016-05-18
引用 27 楼 wabiaozia 的回复:
博主解决这个问题解决了吗
我已经找到解决方案:获得参数的数量和读取excel里表格数量比较
回复
菠萝科技 2016-05-17
博主解决这个问题解决了吗
回复
兔子托尼啊 2015-09-24
我那个只是测试,因为你不是找不到空值的地方啊。所以我把类型全部都放出来。 严谨点,就像他上面的 , 看看 switch (cell.getCellType()) { 除了那几种类型以为还有其他的不。 有的话再后面也加上 逗号。 你上次错误就是那几种类型以为的话 没有加逗号。
回复
zhiyankemeifen 2015-09-24
引用 22 楼 rui888 的回复:
while (rows.hasNext()) {  
             Row row = rows.next();  //获得行数据                     
             System.out.println("Row #" + row.getRowNum());  //获得行号从0开始  
             Iterator<Cell> cells = row.cellIterator();    //获得第一行的迭代器  
             String value = "";  
             while (cells.hasNext()) {  
                 Cell cell = cells.next();  //获得列数据
                 System.out.println("Cell #" + cell.getColumnIndex());  
                 System.out.println(cell.getStringCellValue());  
                 value += cell.getStringCellValue() + ","; 
                                     
             } 
             //去掉最后一个逗号。
             value.substring(0, value.length()-1);
             //写入数据库
             if(row.getRowNum()>0){
             String[] val = value.split(",");
             System.out.println(value);
             AddressList addressList= new AddressList();                    
             addressList.setName(val[0]); 
             addressList.setTel(val[1]);
             addressList.setEmall(val[2]);
             addressList.setFax(val[3]);
             addressList.setRoomnum(val[4]);
             addressList.setOph(val[5]);
             addressList.setAddress(val[6]);
             addressList.setComments(val[7]); 
             addressList.setSort(Integer.parseInt(val[8]));
          //addressList.setBirthday(val[9]);
              
             addressList.setPid(pid);
             addressList.setUserid(userid);                    
             addressList.setType(type);      
             addressList.setSex(0);                    
             addressListService.save(addressList);
             }
         }   
		
大牛 你这好像直接把那个判断他是什么类型的数据给省略了。直接有出现类型错误了
回复
zhiyankemeifen 2015-09-24
引用 21 楼 zhe_noob 的回复:
String a=cell.getStringCellValue() ; 把A打出来看看是啥玩意
这里是判断表格里面是什么类型 然后取值。
回复
兔子托尼啊 2015-09-23
0,1,2,3 那么找源头处理啊。为空的时候,0,1,,,,,2,3 要占位。
回复
zhiyankemeifen 2015-09-23
引用 6 楼 caolong0210 的回复:
http://blog.csdn.net/shuwei003/article/details/6741649 试试能不能满足你的需求
我就是安装他这个改的。他这个没有判断空值的方法。
回复
zhiyankemeifen 2015-09-23
引用 7 楼 rui888 的回复:
addressList.setName(val[0]); 是 val[0] 出的问题吗 ,如果是,name你可以设置空白吗
是这个val取值的问题,我取是把整个行按照0,1,2,3这样排 然后name就取0就是val[0],这个但是空的 就把后面的数去取到前面了
回复
兔子托尼啊 2015-09-23
addressList.setName(val[0]); 是 val[0] 出的问题吗 ,如果是,name你可以设置空白吗
回复
哎呦喂哈 2015-09-23
回复
zhiyankemeifen 2015-09-23
引用 3 楼 rui888 的回复:
addressList.setName(val[0]); 具体没看。 为空的数据就不要写了
判断不了空,Cell cell = cells.next(); //获得列数据 那把空的给排除了 有其他java poi读取表格的例子么
回复
zhiyankemeifen 2015-09-23
引用 2 楼 wula0010 的回复:
取数前先判断是否为空值啊,如果允许空值,换成""继续,如果不允许,抛出异常。
调试后发现他是把空给排除了然后就从有值的放前面
回复
兔子托尼啊 2015-09-23
addressList.setName(val[0]); 具体没看。 为空的数据就不要写了
回复
wula0010 2015-09-23
取数前先判断是否为空值啊,如果允许空值,换成""继续,如果不允许,抛出异常。
回复
zhiyankemeifen 2015-09-23
大家有其他的方法也可以说一下,但是要支持xls和xlsx两种格式的方法
回复
加载更多回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2015-09-23 10:27
社区公告
暂无公告