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

  1. JAVA】特别注意,POIgetLastRowNum() getLastCellNum()的区别
  2. hssfSheet.getLastRowNum();//最后一行的下标,编号从0开始,即比行数小1。如果sheet中一行数据都没有,则返回-1,只有第一行有数据时,返回0
  3. 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)

  1. getPhysicalNumberOfRows  
  2. 获取有记录的行数,即:最后有数据的行是第n行,前面有m行是空行没数据,则返回n-m
  3.  
  4. getPhysicalNumberOfCells   
  5. 获取有记录的列数,即:最后有数据的列是第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)

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

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

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

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

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

  1. HSSFCell cell = row.createCell((short)0);
  2. cell.setCellStyle(cellStyle);
  3. cell.setCellValue(new HSSFRichTextString("hello/r/n world!"));
  1. public class ImportExcel {
  2.  
  3. private static Logger log = LoggerFactory.getLogger(ImportExcel.class);
  4.  
  5. /**
  6. * 工作薄对象
  7. **/
  8. private Workbook wb;
  9.  
  10. /**
  11. * 工作表对象
  12. **/
  13. private Sheet sheet;
  14.  
  15. /**
  16. * 标题行号
  17. */
  18. private int headerNum;
  19.  
  20. /**
  21. * 构造函数
  22. * @param path 导入文件,读取第1个工作表
  23. * @param headerNum 标题行号,数据行等于标题行号+1
  24. * @throws InvalidFormatException
  25. * @throws IOException
  26. */
  27. public ImportExcel(String fileName, int headerNum)
  28. throws InvalidFormatException, IOException {
  29. this(new File(fileName), headerNum);
  30. }
  31.  
  32. /**
  33. * 构造函数
  34. * @param path 导入文件对象,读取第1个工作表
  35. * @param headerNum 标题行号,数据行等于标题行号+1
  36. * @throws InvalidFormatException
  37. * @throws IOException
  38. */
  39. public ImportExcel(File file, int headerNum)
  40. throws InvalidFormatException, IOException {
  41. this(file, headerNum, 0);
  42. }
  43.  
  44. /**
  45. * 构造函数
  46. * @param path 导入文件
  47. * @param headerNum 标题行号,数据行等于标题行号+1
  48. * @param sheetIndex 工作表编号,以0开始
  49. * @throws InvalidFormatException
  50. * @throws IOException
  51. */
  52. public ImportExcel(String fileName, int headerNum, int sheetIndex)
  53. throws InvalidFormatException, IOException {
  54. this(new File(fileName), headerNum, sheetIndex);
  55. }
  56.  
  57. /**
  58. * 构造函数
  59. * @param path 导入文件对象
  60. * @param headerNum 标题行号,数据行等于标题行号+1
  61. * @param sheetIndex 工作表编号,以0开始、
  62. * @throws InvalidFormatException
  63. * @throws IOException
  64. */
  65. public ImportExcel(File file, int headerNum, int sheetIndex)
  66. throws InvalidFormatException, IOException {
  67. this(file.getName(), new FileInputStream(file), headerNum, sheetIndex);
  68. }
  69.  
  70. /**
  71. * 构造函数
  72. * @param file 导入文件对象
  73. * @param headerNum 标题行号,数据行等于标题行号+1
  74. * @param sheetIndex 工作表编号,以0开始、
  75. * @throws InvalidFormatException
  76. * @throws IOException
  77. */
  78.  
  79. /**
  80. * 构造函数
  81. * @param path 导入文件对象
  82. * @param headerNum 标题行号,数据行等于标题行号+1
  83. * @param sheetIndex 工作表编号,以0开始、
  84. * @throws InvalidFormatException
  85. * @throws IOException
  86. */
  87. public ImportExcel(String fileName, InputStream is, int headerNum, int sheetIndex)
  88. throws InvalidFormatException, IOException {
  89. if (StringUtils.isBlank(fileName)){
  90. throw new RuntimeException("导入文档为空!");
  91. }else if(fileName.toLowerCase().endsWith("xls")){
  92. this.wb = new HSSFWorkbook(is);
  93. }else if(fileName.toLowerCase().endsWith("xlsx")){
  94. this.wb = new XSSFWorkbook(is);
  95. }else{
  96. throw new RuntimeException("文档格式不正确?");
  97. }
  98. if (this.wb.getNumberOfSheets()<sheetIndex){
  99. throw new RuntimeException("文档中没有工作表!");
  100. }
  101. this.sheet = this.wb.getSheetAt(sheetIndex);
  102. this.headerNum = headerNum;
  103. log.debug("Initialize success.");
  104. }
  105.  
  106. /**
  107. * 获取行对象
  108. * @param rownum
  109. * @return
  110. */
  111. public Row getRow(int rownum){
  112. return this.sheet.getRow(rownum);
  113. }
  114.  
  115. /**
  116. * 获取数据行号
  117. * @return
  118. */
  119. public int getDataRowNum(){
  120. return headerNum+1;
  121. }
  122.  
  123. /**
  124. * 获取工作表中的最后一行的行号,以0开始
  125. * @return
  126. */
  127. public int getLastDataRowNum(){
  128. return this.sheet.getLastRowNum();
  129. }
  130.  
  131. /**
  132. * 获取一行记录总的列数
  133. * @return
  134. */
  135. public int getLastCellNum(){
  136. return this.getRow(headerNum).getLastCellNum();
  137. }
  138.  
  139. /**
  140. * 获取单元格的值
  141. * @param row 获取的行
  142. * @param column 获取单元格列号
  143. * @return 单元格的值
  144. */
  145. public Object getCellValue(Row row, int column){
  146. Object val = "";
  147. try{
  148. Cell cell = row.getCell(column);
  149. if (cell != null){
  150. if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
  151. val = cell.getNumericCellValue();
  152. }else if (cell.getCellType() == Cell.CELL_TYPE_STRING){
  153. val = cell.getStringCellValue();
  154. }else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA){
  155. val = cell.getCellFormula();
  156. }else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){
  157. val = cell.getBooleanCellValue();
  158. }else if (cell.getCellType() == Cell.CELL_TYPE_ERROR){
  159. val = cell.getErrorCellValue();
  160. }
  161. }
  162. }catch (Exception e) {
  163. return val;
  164. }
  165. return val;
  166. }
  167. /**
  168. * 导入测试
  169. */
  170. public static void main(String[] args) throws Throwable {
  171. ImportExcel ei = new ImportExcel("import.xls", 0);
  172. System.out.println(ei.getLastDataRowNum());
  173. System.out.println(ei.getDataRowNum());
  174.  
  175. for (int i = ei.getDataRowNum(); i <= ei.getLastDataRowNum(); i++) {
  176. Row row = ei.getRow(i);
  177. System.out.println("Row num:"+i);
  178. for (int j = 0; j < ei.getLastCellNum(); j++) {
  179. Object val = ei.getCellValue(row, j);
  180. System.out.print(val+", ");
  181. }
  182. System.out.print("\n");
  183. }
  184.  
  185. }
  186.  
  187. }

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. Ubuntu 14.04.3 LTS如何安装谷歌输入法

    谷歌输入法项目主页:https://code.google.com/p/scim-googlepinyin/ 一,打开Ubuntu 的“Ubunru的软件中心”,在搜索里面输入“googlepinyi ...

  2. windows查看和杀死占用端口的进程

    1.首先使用 netstat -ano查看占用端口的进程号 2.然后使用 taskkill /PID (进程号)杀死进程

  3. 6w6:第六周程序填空题3

    描述 下面的程序输出结果是: A::Fun A::Do A::Fun C::Do 请填空: #include <iostream> using namespace std; class A ...

  4. idea中文输入问题

    desc: idea2017.3.4输入中文,光标不跟随. 解决方案:

  5. SDUT OJ 数据结构实验之串二:字符串匹配

    数据结构实验之串二:字符串匹配 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  6. Codeforces Round #462 (Div. 2), problem: (C) A Twisty Movement (求可以转一次区间的不递增子序列元素只有1,2)

    题目意思: 给长度为n(n<=2000)的数字串,数字只能为1或者2,可以将其中一段区间[l,r]翻转,求翻转后的最长非递减子序列长度. 题解:求出1的前缀和,2的后缀和,以及区间[i,j]的最 ...

  7. UESTC - 1692 注意DP顺序

    #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #i ...

  8. C++ STL之Set

    set是关联容器,类似于集合. 特点是里面的元素不会重复,而且元素时有序的. 1.声明定义: #include<set> using namespace std; set<int&g ...

  9. Q942 增减字符串匹配

    给定只含 "I"(增大)或 "D"(减小)的字符串 S ,令 N = S.length. 返回 [0, 1, ..., N] 的任意排列 A 使得对于所有 i ...

  10. docker一键安装

    1.任意新服务器上一键安装最新版docker curl -s https://get.docker.com/ | sh 注:安装完成之后,docker默认是没有启动的,需要启动docker 2.doc ...