注意:
(1)判断行的最大数量建议使用sheet.getLastRowNum();
(2)判断每行最大列数建议使用row.getLastCellNum();

【JAVA】特别注意,POI中getLastRowNum() 和getLastCellNum()的区别
hssfSheet.getLastRowNum();//最后一行的下标,编号从0开始,即比行数小1。如果sheet中一行数据都没有,则返回-1,只有第一行有数据时,返回0
hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1.如果row中一列数据都没有,则返回-1,只有第一列有数据时,返回1

getLastRowNum()获取的是最后一行的编号(编号从0开始)。

int org.apache.poi.ss.usermodel.Sheet.getLastRowNum()

Gets the last row on the sheet
Returns: last row contained in this sheet (0-based)

getPhysicalNumberOfRows  
获取有记录的行数,即:最后有数据的行是第n行,前面有m行是空行没数据,则返回n-m; getPhysicalNumberOfCells   
获取有记录的列数,即:最后有数据的列是第n列,前面有m列是空列没数据,则返回n-m;

getPhysicalNumberOfRows()获取的是物理行数,也就是不包括那些空行(隔行)的情况。
int org.apache.poi.ss.usermodel.Sheet.getPhysicalNumberOfRows()

Returns the number of physically defined rows (NOT the number of rows in the sheet)

java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的形式
当使用POI处理excel的时候,遇到了比较长的数字,虽然excel里面设置该单元格是文本类型的,但是POI的cell的类型就会变成数字类型。
而且无论数字是否小数,使用cell.getNumbericCellValue() 去获取值的时候,会得到一个double,而且当长度大一点的时候会变成科学计数法形式。
那么获取这个单元格的原始的数据,就其实是一个double怎么转换成整数的问题了。
使用DecimalFormat对这个double进行了格式话,随后使用format方法获得的String就是你想要的值了。
DecimalFormat df = new DecimalFormat("0");
String whatYourWant = df.format(cell.getNumericCellValue());

单元格内容换行:
Java利用POI生成Excel强制换行
1. 首先在需要强制换行的单元格里使用poi的样式,并且把样式设定为自动换行

HSSFCellStyle cellStyle=workbook.createCellStyle();
cellStyle.setWrapText(true);
cell.setCellStyle(cellStyle); 

2. 其次是在需要强制换行的单元格,使用/就可以实再强制换行

换行用"\r\n",和文本分开

HSSFCell cell = row.createCell((short)0);
cell.setCellStyle(cellStyle);
cell.setCellValue(new HSSFRichTextString("hello/r/n world!"));
public class ImportExcel {

    private static Logger log = LoggerFactory.getLogger(ImportExcel.class);

    /**
* 工作薄对象
**/
private Workbook wb; /**
* 工作表对象
**/
private Sheet sheet; /**
* 标题行号
*/
private int headerNum; /**
* 构造函数
* @param path 导入文件,读取第1个工作表
* @param headerNum 标题行号,数据行等于标题行号+1
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcel(String fileName, int headerNum)
throws InvalidFormatException, IOException {
this(new File(fileName), headerNum);
} /**
* 构造函数
* @param path 导入文件对象,读取第1个工作表
* @param headerNum 标题行号,数据行等于标题行号+1
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcel(File file, int headerNum)
throws InvalidFormatException, IOException {
this(file, headerNum, 0);
} /**
* 构造函数
* @param path 导入文件
* @param headerNum 标题行号,数据行等于标题行号+1
* @param sheetIndex 工作表编号,以0开始
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcel(String fileName, int headerNum, int sheetIndex)
throws InvalidFormatException, IOException {
this(new File(fileName), headerNum, sheetIndex);
} /**
* 构造函数
* @param path 导入文件对象
* @param headerNum 标题行号,数据行等于标题行号+1
* @param sheetIndex 工作表编号,以0开始、
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcel(File file, int headerNum, int sheetIndex)
throws InvalidFormatException, IOException {
this(file.getName(), new FileInputStream(file), headerNum, sheetIndex);
} /**
* 构造函数
* @param file 导入文件对象
* @param headerNum 标题行号,数据行等于标题行号+1
* @param sheetIndex 工作表编号,以0开始、
* @throws InvalidFormatException
* @throws IOException
*/ /**
* 构造函数
* @param path 导入文件对象
* @param headerNum 标题行号,数据行等于标题行号+1
* @param sheetIndex 工作表编号,以0开始、
* @throws InvalidFormatException
* @throws IOException
*/
public ImportExcel(String fileName, InputStream is, int headerNum, int sheetIndex)
throws InvalidFormatException, IOException {
if (StringUtils.isBlank(fileName)){
throw new RuntimeException("导入文档为空!");
}else if(fileName.toLowerCase().endsWith("xls")){
this.wb = new HSSFWorkbook(is);
}else if(fileName.toLowerCase().endsWith("xlsx")){
this.wb = new XSSFWorkbook(is);
}else{
throw new RuntimeException("文档格式不正确?");
}
if (this.wb.getNumberOfSheets()<sheetIndex){
throw new RuntimeException("文档中没有工作表!");
}
this.sheet = this.wb.getSheetAt(sheetIndex);
this.headerNum = headerNum;
log.debug("Initialize success.");
} /**
* 获取行对象
* @param rownum
* @return
*/
public Row getRow(int rownum){
return this.sheet.getRow(rownum);
} /**
* 获取数据行号
* @return
*/
public int getDataRowNum(){
return headerNum+1;
} /**
* 获取工作表中的最后一行的行号,以0开始
* @return
*/
public int getLastDataRowNum(){
return this.sheet.getLastRowNum();
} /**
* 获取一行记录总的列数
* @return
*/
public int getLastCellNum(){
return this.getRow(headerNum).getLastCellNum();
} /**
* 获取单元格的值
* @param row 获取的行
* @param column 获取单元格列号
* @return 单元格的值
*/
public Object getCellValue(Row row, int column){
Object val = "";
try{
Cell cell = row.getCell(column);
if (cell != null){
if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
val = cell.getNumericCellValue();
}else if (cell.getCellType() == Cell.CELL_TYPE_STRING){
val = cell.getStringCellValue();
}else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA){
val = cell.getCellFormula();
}else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){
val = cell.getBooleanCellValue();
}else if (cell.getCellType() == Cell.CELL_TYPE_ERROR){
val = cell.getErrorCellValue();
}
}
}catch (Exception e) {
return val;
}
return val;
}
/**
* 导入测试
*/
public static void main(String[] args) throws Throwable {
ImportExcel ei = new ImportExcel("import.xls", 0);
System.out.println(ei.getLastDataRowNum());
System.out.println(ei.getDataRowNum()); for (int i = ei.getDataRowNum(); i <= ei.getLastDataRowNum(); i++) {
Row row = ei.getRow(i);
System.out.println("Row num:"+i);
for (int j = 0; j < ei.getLastCellNum(); j++) {
Object val = ei.getCellValue(row, j);
System.out.print(val+", ");
}
System.out.print("\n");
} } }

java poi reader常用API汇总的更多相关文章

  1. Java时间操作常用api

    - 如何取得年月日.小时分钟秒?- 如何取得从1970年1月1日0时0分0秒到现在的毫秒数?- 如何取得某月的最后一天?- 如何格式化日期?答:问题1:创建java.util.Calendar 实例, ...

  2. java selenium常用API汇总

    (WebElement.iFrame.select.alert.浏览器窗口.事件.js)     一 WebElement相关方法 1.点击操作 WebElement button = driver. ...

  3. Java反射常用API汇总

    “JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性” 一.类对象的获取 1.通过对象获取 Object obj = ne ...

  4. java基础(15):常用API(Object、String、StringBuffer)

    1. Java的API及Object类 在以前的学习过程中,我们都在学习对象基本特征.对象的使用以及对象的关系.接下来我们开始使用对象做事情,那么在使用对象做事情之前,我们要学习一些API中提供的常用 ...

  5. 12.Java连接Redis_Jedis_常用API

    上一篇总结我们使用我们本地的Eclipse中创建的jedis工程,链接到了我们处于VMware虚拟机上的Linux系统上的Redis服务,我们接下来讲一下jedis的一些常用的API. (1)jedi ...

  6. Selenium2(java)selenium常用API 四

    WebElement相关方法 1.点击操作 WebElement button = driver.findElement(By.id("login")); button.click ...

  7. VSTO之PowerPoint(PPT)插件开发常用API汇总

    VSTO简介 VSTO(Visual Studio Tools for Office )是VBA的替代,使得开发Office应用程序更加简单,并且用VSTO来开发office应用程序可以使用Visua ...

  8. Java学习随笔---常用API(二)

    Object类的toString方法 将一个对象返回为字符串形式,但一般使用的时候会覆盖重写toString方法 Object类是所有类的父亲 // public class Person { pri ...

  9. HDFS连接JAVA,HDFS常用API

    先在pom.xml中导入依赖包 <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.hadoop/ha ...

随机推荐

  1. spring mvc 框架启动报错:nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal 解决办法

    今天准备将以前自己搭建的一个框架拿出来用一下,结果发现启动报错:nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/Elem ...

  2. 深入解析mapreduce 笔记

    Hadoop组成: mapreduce简单介绍: 伪代码演示: maptask和reducetask执行流程:

  3. bzoj2440完全平方数

    题目链接 上来先吐槽题面!!!!!! 你跟我说$1$不是完全平方数昂? 看了半天样例啊. 活生生的半天$……$ 莫比乌斯 反演    函数容斥一下,每次二分就好 反正本宝宝不知道反演是啥. 每次判断应 ...

  4. Python——可变和不可变类型数据

    什么是不可变类型? 存储空间保存的数据不允许被修改,这种数据就是不可变类型. 常见的不可变类型有: 数字类型 int, bool, float, complex, long(2.x) 字符串 str ...

  5. SDUT OJ 迷之好奇 (字典树 )

    迷之好奇 Time Limit: 2000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description FF得到了一个有n个数字的集 ...

  6. state-表单

    /*** 需求: 定义一个组件,可以将用户在输入框内输入的内容 进行实时显示** 分析:组件与用户交互过程中,存在状态的变化,即输入框的值** */var Input = React.createCl ...

  7. 【webservice】Two classes have the same XML type name(转)

    引言 需要调用另一个系统的提供的webservice接口,但是调用之后总是报错,用SoapUI测试接口却没有问题: 那就应该是代码的问题了,但是同样的代码也调用过其他系统却没有问题,不过最终还是解决了 ...

  8. win10系统常用操作

    1.打开控制面板 (1)选中“此电脑”,右键选择“属性”. (2)可见 控制面板主页 2.设置环境变量和系统变量 (1)选中“此电脑”,右键选择“属性”. (2)可见 控制面板主页 (3)点击高级系统 ...

  9. 老男孩python作业6-选课系统开发

    角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. 课程包含,周期,价格 ...

  10. [BZOJ 1489][HNOI2009]双递增序

    传送门 满满的负罪感,昨晚的刷题历程:写几道难题吧-->算了,还是只切道水题吧-->RNG赢了...... 背包一下就行了 #include <bits/stdc++.h> u ...