如果POI-3.10往一个工作表(sheet)里面插入数据的话,需要注意了,其有一个不太被容易发现的bug。 被插入的工作表(sheet)里面的单元格没有包含任何的注解(comment)的时候,插入一行数据,不会有任何问题。但是如果被插入的工作表(sheet)里面的单元格只要包含任何的注解(comment)的时候,这个时候插入一行数据的时候,就会破坏这个文件。当程序执行完后,如果打开被插入数据的Excel文件,我们将会发现,其会弹出下面的对话框。

程序代码如下,

  1. package com.tibco.poi.xssf;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import org.apache.poi.xssf.usermodel.XSSFCell;
  8. import org.apache.poi.xssf.usermodel.XSSFRow;
  9. import org.apache.poi.xssf.usermodel.XSSFSheet;
  10. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  11. public class CreatRowTest {
  12. //当前文件已经存在
  13. private String excelPath = "D:\\exceltest\\comments.xlsx";
  14. //从第几行插入进去
  15. private int insertStartPointer = 3;
  16. //在当前工作薄的那个工作表单中插入这行数据
  17. private String sheetName = "Sheet1";
  18. /**
  19. * 总的入口方法
  20. */
  21. public static void main(String[] args) {
  22. CreatRowTest crt = new CreatRowTest();
  23. crt.insertRows();
  24. }
  25. /**
  26. * 在已有的Excel文件中插入一行新的数据的入口方法
  27. */
  28. public void insertRows() {
  29. XSSFWorkbook wb = returnWorkBookGivenFileHandle();
  30. XSSFSheet sheet1 = wb.getSheet(sheetName);
  31. XSSFRow row = createRow(sheet1, insertStartPointer);
  32. createCell(row);
  33. saveExcel(wb);
  34. }
  35. /**
  36. * 保存工作薄
  37. * @param wb
  38. */
  39. private void saveExcel(XSSFWorkbook wb) {
  40. FileOutputStream fileOut;
  41. try {
  42. fileOut = new FileOutputStream(excelPath);
  43. wb.write(fileOut);
  44. fileOut.close();
  45. } catch (FileNotFoundException e) {
  46. e.printStackTrace();
  47. } catch (IOException e) {
  48. e.printStackTrace();
  49. }
  50. }
  51. /**
  52. * 创建要出入的行中单元格
  53. * @param row
  54. * @return
  55. */
  56. private XSSFCell createCell(XSSFRow row) {
  57. XSSFCell cell = row.createCell((short) 0);
  58. cell.setCellValue(999999);
  59. row.createCell(1).setCellValue(1.2);
  60. row.createCell(2).setCellValue("This is a string cell");
  61. return cell;
  62. }
  63. /**
  64. * 得到一个已有的工作薄的POI对象
  65. * @return
  66. */
  67. private XSSFWorkbook returnWorkBookGivenFileHandle() {
  68. XSSFWorkbook wb = null;
  69. FileInputStream fis = null;
  70. File f = new File(excelPath);
  71. try {
  72. if (f != null) {
  73. fis = new FileInputStream(f);
  74. wb = new XSSFWorkbook(fis);
  75. }
  76. } catch (Exception e) {
  77. return null;
  78. } finally {
  79. if (fis != null) {
  80. try {
  81. fis.close();
  82. } catch (IOException e) {
  83. e.printStackTrace();
  84. }
  85. }
  86. }
  87. return wb;
  88. }
  89. /**
  90. * 找到需要插入的行数,并新建一个POI的row对象
  91. * @param sheet
  92. * @param rowIndex
  93. * @return
  94. */
  95. private XSSFRow createRow(XSSFSheet sheet, Integer rowIndex) {
  96. XSSFRow row = null;
  97. if (sheet.getRow(rowIndex) != null) {
  98. int lastRowNo = sheet.getLastRowNum();
  99. sheet.shiftRows(rowIndex, lastRowNo, 1);
  100. }
  101. row = sheet.createRow(rowIndex);
  102. return row;
  103. }
  104. }

不过,值得高兴的是,这个bug已经在POI-3.12的版本解决了

(6) 如何用Apache POI操作Excel文件-----POI-3.10的一个和注解(comment)相关的另外一个bug的更多相关文章

  1. java使用POI操作excel文件,实现批量导出,和导入

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...

  2. java使用Apache POI操作excel文件

    官方介绍 HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format. XSSF is ...

  3. Java使用POI操作Excel文件

    1.简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式文件读和写的功能. 2.依赖的jar包 <!-- ex ...

  4. 如何用Apache POI操作Excel文件-----如何对一个单元格加注解?

    有的时候,我们需要通过操作Apache POI,在生成Cell数据的同时,能对其生成的Cell,加上注解(comments),类似于下面的. 那么对于这种情况,我们的代码应该如何写呢? 借花献佛,我就 ...

  5. 如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?

    在POI的第一节入门中,我们提供了两个简单的例子,一个是如何用Apache POI新建一个工作薄,另外一个例子是,如果用Apache POI新建一个工作表.那么在这个章节里面,我将会给大家演示一下,如 ...

  6. 如何用Apache POI操作Excel文件-----如何用Apache POI 画一个离散图

    有的时候,我们需要Excel中的数据,通过一个图画,可视化的表现出来. 那么这个时候,应该如何做呢?现在就借花献佛,以Apache POI自己提供的一个例子为例,给大家演示一下POI的API 如何画图 ...

  7. 使用Apache POI操作Excel文件---在已有的Excel文件中插入一行新的数据

    package org.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundEx ...

  8. [转载]Java操作Excel文件的两种方案

    微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:Word,Excel.时至今日,它的源代码仍然不公开已封锁了我们的进一步应用和开发.在我们实际开发企业办公系统的过程中,常常有客户这样子要 ...

  9. POI操作Excel异常Cannot get a text value from a numeric cell

    控制台抛出异常:java.lang.IllegalStateException: Cannot get a text value from a numeric cell 在java中用POI解析exc ...

随机推荐

  1. Maximum sum(poj 2479)

    题意:给一段数列,将这个数列分成两部分,使两部分的最大子段和的和最大,输出和 /* 看数据没想到是(O)n的算法,求出从前向后的最大子段和和从后向前的最大子段和, 然后枚举断点. 第一次提交不小心折在 ...

  2. C语言 给字符数组赋值的方法

    typedef struct _tagTESTCHAR { char szTest[30];}TESTCHAR , *PTESTCHAR; int main(int argc, char* argv[ ...

  3. Fresco 源码分析(一) DraweeView-DraweeHierarchy-DraweeController(MVC) DraweeHierachy+DraweeController的分析

    4.1.5.2 模型层DraweeHierachy继承体系以及各个类的作用 DraweeHierachy (I) --| SettableDraweeHierarchy (I) ------| Gen ...

  4. 消息队列入门(三)JMS标准及实现

    >>消息中间件 消息中间件即Message-oriented middleware(MOM),消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集 ...

  5. Wordpress模板制作、改造、设计

    如何定义index.php以及如何派生出其它文件,在index.php文件中,在body元素内,新建如下结构化标记元素,各元素都带有不同的id属性: <div id=”page”> < ...

  6. C++学习网站总结(转)

    总结帖: http://club.topsage.com/thread-361504-1-1.html Visual C++ (VC) / MFC 电子书下载: Visual C++ 2008 入门经 ...

  7. calendar 示例

    package unit5; import java.text.DateFormatSymbols; public class MyMonth { private int month; private ...

  8. POJ1135 Domino Effect(SPFA)

    题目大概是,普通骨牌连接两张关键骨牌,一旦一张关键骨牌倒下与其相邻的普通骨牌也倒下,普通骨牌倒下与其相邻的骨牌也倒下.给出所有有普通骨牌相连的两个关键骨牌之间普通骨牌倒下所需时间,问1号关键骨牌开始倒 ...

  9. onclientclick和onclick区别

    OnClientClick是客户端脚本,一般使用javascript,在客户端,也就是IE中运行,点击后马上执行OnClick是服务器端事件处理函数,使用C#或者vb.net,在服务器端,也就是IIS ...

  10. ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络赛 B Mission Impossible 6

    #1228 : Mission Impossible 6 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You must have seen the very famou ...