poi读取excel总是少读一行是什么个情况?

Gemerl 2014-08-14 11:56:45

package com.excel;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ReadExcel {
private static String path="D:/excel.xls";
public static void main(String[] args) throws Exception {
List<String> strUser=new ArrayList<String>();
File file=new File(path);
FileInputStream fs=new FileInputStream(file);
HSSFWorkbook wb=new HSSFWorkbook(fs);
HSSFSheet sheet=wb.getSheet("新生记录");
int lastRow=sheet.getLastRowNum();
StringBuffer values=null;
for(int i=1;i<lastRow+1;i++){
HSSFRow row=sheet.getRow(i);
short cellNum=row.getLastCellNum();
values=new StringBuffer();
for(int j=0;j<cellNum;j++){
HSSFCell cell=row.getCell(j);
if(j==0||j==2){
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
}
System.out.println(cell.getStringCellValue());
values.append(cell.getStringCellValue()+",");
}
values.delete(values.length()-1, values.length());
strUser.add(values.toString());
}
for(int i=0;i<strUser.size();i++){
String[] user=strUser.get(i).split(",");
System.out.println(new User(Integer.valueOf(user[0]),user[1],Integer.valueOf(user[2])));
}
}
}



excel截图 图片上传不上来哦。。

编号 姓名 年龄
1 张三 12
2 李四 15
3 王五 18

这四行都有边框 和底色,还设置了字体为楷体。。

现在问题是 这个row.getLastCellNum(); 得到的总是三行 应该四行才对哦。。
...全文
1282 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gemerl 2014-08-18
  • 打赏
  • 举报
回复
引用 21 楼 shixitong 的回复:
i<lastRow+1 不等价于i<=lastRow
是呀,我糊涂了。。 结贴了。。
小灯光环 2014-08-14
  • 打赏
  • 举报
回复
第24行i=0,row和cell的索引都是从0开始的吧。
致知Fighting 2014-08-14
  • 打赏
  • 举报
回复
要不咱从0开始读?
Php小哥 2014-08-14
  • 打赏
  • 举报
回复
大神的世界我不懂
NOHI 2014-08-14
  • 打赏
  • 举报
回复
i<=lastRow+1
shixitong 2014-08-14
  • 打赏
  • 举报
回复
i<lastRow+1 不等价于i<=lastRow
Gemerl 2014-08-14
  • 打赏
  • 举报
回复
引用 19 楼 shixitong 的回复:
[quote=引用 18 楼 Gemerl 的回复:] [quote=引用 4 楼 markcxz 的回复:] RowNum 应该一次为 0、1、2、3吧? LastRowNum自然就是3了
这个是这样的吗? 这个方法好像不是获取下标吧 是获取有多少行。。 所以应该获取4才对。。[/quote] 这个getPhysicalNumberOfRows才是真正的行数[/quote] 找到问题了 真吭呀。。。for(int i=1;i<=lastRow;i++){ 要小于等于
shixitong 2014-08-14
  • 打赏
  • 举报
回复
引用 18 楼 Gemerl 的回复:
[quote=引用 4 楼 markcxz 的回复:] RowNum 应该一次为 0、1、2、3吧? LastRowNum自然就是3了
这个是这样的吗? 这个方法好像不是获取下标吧 是获取有多少行。。 所以应该获取4才对。。[/quote] 这个getPhysicalNumberOfRows才是真正的行数
Gemerl 2014-08-14
  • 打赏
  • 举报
回复
引用 4 楼 markcxz 的回复:
RowNum 应该一次为 0、1、2、3吧? LastRowNum自然就是3了
这个是这样的吗? 这个方法好像不是获取下标吧 是获取有多少行。。 所以应该获取4才对。。
Gemerl 2014-08-14
  • 打赏
  • 举报
回复
引用 15 楼 u011048844 的回复:
row.getLastCellNum()不是获取的列数吗??
是呀 但是获取的会少一行呀。。 明明四行 它获取的是三。。
Gemerl 2014-08-14
  • 打赏
  • 举报
回复
引用 14 楼 shixitong 的回复:
换个excel试试,不用你生成的那个
自己新建的一样也是会少读一行。。 我用的是wps 是不是这个的原因?
醉欲眠卿且去 2014-08-14
  • 打赏
  • 举报
回复
row.getLastCellNum()不是获取的列数吗??
shixitong 2014-08-14
  • 打赏
  • 举报
回复
换个excel试试,不用你生成的那个
Gemerl 2014-08-14
  • 打赏
  • 举报
回复
我打印的结果 只会打印 张三和李四 王五不打印。。。。不知道何解?
Gemerl 2014-08-14
  • 打赏
  • 举报
回复


引用 11 楼 shixitong 的回复:
把excel贴出来给大家看看,截个图就行
截图在此 是我用poi生成的。。。

今天练习下excel的导入导出 。。
shixitong 2014-08-14
  • 打赏
  • 举报
回复
把excel贴出来给大家看看,截个图就行
Gemerl 2014-08-14
  • 打赏
  • 举报
回复
引用 9 楼 shixitong 的回复:
package excel;



import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ReadExcel {
	private static String path="F:\\stu.xls";
	public static void main(String[] args) throws Exception {
		List<String>  strUser=new ArrayList<String>();
		File file=new File(path);
		FileInputStream fs=new FileInputStream(file);
		HSSFWorkbook wb=new HSSFWorkbook(fs);
		HSSFSheet sheet=wb.getSheet("新生记录");
		int lastRow=sheet.getLastRowNum();
		StringBuffer values=null;
		for(int i=1;i<lastRow+1;i++){
			HSSFRow row=sheet.getRow(i);
			short cellNum=row.getLastCellNum();
			values=new StringBuffer();
			for(int j=0;j<cellNum;j++){
				HSSFCell cell=row.getCell((short) j);
				if(j==0||j==2){
					//cell.setCellType(HSSFCell.CELL_TYPE_STRING);
				}
				if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
					values.append(cell.getStringCellValue()+",");
				}
				else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
					values.append(cell.getNumericCellValue()+",");
				}
				else{
					//todo 
				}
			}
			values.delete(values.length()-1, values.length());
			strUser.add(values.toString());
		}
		System.out.println(strUser);
		/*for(int i=0;i<strUser.size();i++){
			String[] user=strUser.get(i).split(",");
			System.out.println(new User(Integer.valueOf(user[0]),user[1],Integer.valueOf(user[2])));
		}*/
	}
}

引用 9 楼 shixitong 的回复:
package excel;



import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ReadExcel {
	private static String path="F:\\stu.xls";
	public static void main(String[] args) throws Exception {
		List<String>  strUser=new ArrayList<String>();
		File file=new File(path);
		FileInputStream fs=new FileInputStream(file);
		HSSFWorkbook wb=new HSSFWorkbook(fs);
		HSSFSheet sheet=wb.getSheet("新生记录");
		int lastRow=sheet.getLastRowNum();
		StringBuffer values=null;
		for(int i=1;i<lastRow+1;i++){
			HSSFRow row=sheet.getRow(i);
			short cellNum=row.getLastCellNum();
			values=new StringBuffer();
			for(int j=0;j<cellNum;j++){
				HSSFCell cell=row.getCell((short) j);
				if(j==0||j==2){
					//cell.setCellType(HSSFCell.CELL_TYPE_STRING);
				}
				if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
					values.append(cell.getStringCellValue()+",");
				}
				else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
					values.append(cell.getNumericCellValue()+",");
				}
				else{
					//todo 
				}
			}
			values.delete(values.length()-1, values.length());
			strUser.add(values.toString());
		}
		System.out.println(strUser);
		/*for(int i=0;i<strUser.size();i++){
			String[] user=strUser.get(i).split(",");
			System.out.println(new User(Integer.valueOf(user[0]),user[1],Integer.valueOf(user[2])));
		}*/
	}
}

你的跟我的一样呀。。。为何我的就读不到最后一行。。。
shixitong 2014-08-14
  • 打赏
  • 举报
回复
package excel;



import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ReadExcel {
private static String path="F:\\stu.xls";
public static void main(String[] args) throws Exception {
List<String> strUser=new ArrayList<String>();
File file=new File(path);
FileInputStream fs=new FileInputStream(file);
HSSFWorkbook wb=new HSSFWorkbook(fs);
HSSFSheet sheet=wb.getSheet("新生记录");
int lastRow=sheet.getLastRowNum();
StringBuffer values=null;
for(int i=1;i<lastRow+1;i++){
HSSFRow row=sheet.getRow(i);
short cellNum=row.getLastCellNum();
values=new StringBuffer();
for(int j=0;j<cellNum;j++){
HSSFCell cell=row.getCell((short) j);
if(j==0||j==2){
//cell.setCellType(HSSFCell.CELL_TYPE_STRING);
}
if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
values.append(cell.getStringCellValue()+",");
}
else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
values.append(cell.getNumericCellValue()+",");
}
else{
//todo
}
}
values.delete(values.length()-1, values.length());
strUser.add(values.toString());
}
System.out.println(strUser);
/*for(int i=0;i<strUser.size();i++){
String[] user=strUser.get(i).split(",");
System.out.println(new User(Integer.valueOf(user[0]),user[1],Integer.valueOf(user[2])));
}*/
}
}




shixitong 2014-08-14
  • 打赏
  • 举报
回复
而且你后面的代码
for(int i=1;i<lastRow+1;i++){
已经去掉了第一行,就是从第二行开始读的,是对的
shixitong 2014-08-14
  • 打赏
  • 举报
回复
引用 6 楼 Gemerl 的回复:
[quote=引用 5 楼 shixitong 的回复:] 就应该是三行,从0开始(0,1,2,3,)刚好是4行 cell.setCellType(HSSFCell.CELL_TYPE_STRING); 可能会报异常 如果单元格类型不是文本的话
第一行 不是标题栏吗? 编号 姓名 年龄 我不需要读取这个呀。。[/quote] 是的, int lastRow=sheet.getLastRowNum(); 但是这句不会把第一行去掉的,他还是会包含第一行
加载更多回复(4)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧