注意:
(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. HashMap数据结构的C++实现

    Hash表在计算机的应用编程中是一种很常用的数据结构,很多算法的实现都离不开它.虽然C++11标准模板库中的有hashmap类型的实现,但在工程实践中,若项目本身使用的是较低版本的C++,或是出于性能 ...

  2. nginx理解与配置

    准备: http服务器:①tomcat②apache③nginx(c语言开发) 文件系统:①mgfs ②mgbd:存储小文件 ③fastDFS:存储大文件.小文件,分布式文件系统 nginx是一种ht ...

  3. Xcode9新功能

    1.折叠代码 局部折叠(折叠一个函数):Command+Option+Left/Right 全局折叠(折叠当前文件下的全部函数): Shift+Command+Option+Left/Right 折叠 ...

  4. Timer(定时器)

    默认情况下,在每个采样器之前没有任何延时,这样不能很好的模拟现实生活中人们访问网页,因为现实生活中人们点击一个请求后,会有一定的时间,然后再点击下一个请求,JMeter提供了定时器来模拟这种行为. 定 ...

  5. java 列表与集合总结

    列表与集合 (一切输出都用for each!丢弃迭代器) 列表List 1 顺序表 Arraylist  适用于静态查找2   链式双向表 Linkedlist 适用于增删该查3 (容器) Vecto ...

  6. javaee--学生成绩录入与显示--Struts2标签的使用

    类Score.java:各课程的成绩及平均成绩 类Student.java:学生姓名.学号及Score类 类ScoreAction.java:将Student类存在一个List对象中, execute ...

  7. JavaScript随机数组(数组、随机、取整、取值的过程)

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&q ...

  8. EF进阶篇(三)——上下文

    前言 上下文,到底什么是上下文,且听我仔细吹来. 内容 在对EF实体进行关系操作的时候,第一步需要我们创建上下文实例对象,然后根据实体的变化进而通过上下文对该实体进行状态的修改,我的理解就是上下文就是 ...

  9. MVC进阶篇(三)——model层数据验证

    前言 常常在想,姓名性别那些个验证,真的有必要每次遇到,每次写验证吗?好麻烦,于是学到MVC这里,发现MVC自带数据验证,这个东西着实是个好东西.我写了一个小demo,分享给大家. 内容 一个表单的提 ...

  10. Reviewing notes 1.1 of Analytic geometry

    Chapter 1 Vector Algebra ♦ Vector Space Vector and vector space A vector is described as a quantity ...