如果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. curl请求的url中含有空格

    curl请求的url中含有空格时(例如rul的参数是sql查询语句,url=www.tets.com/query.php?sql=select * from t1),curl_easy_perform ...

  2. [Android Pro] Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题

    参考博客: http://blog.csdn.net/t12x3456/article/details/9256609 http://blog.csdn.net/lihenair/article/de ...

  3. css3学习总结2--CSS3圆角边框

    绘制一个圆角边框的示例 .div{ border: solid 5px blue; border-radius: 20px; -moz-border-radius:20px; -o-border-ra ...

  4. 利用gitbash上传项目到github

    GitHub主要是用作基于Git的分布式版本管理系统的库,可以保存和管理自己的代码,而且主要用作代码的合作开发.不过对于我来说,Git控制系统还比较难以掌握,或者开发小系统还不太用得着,因此我把Git ...

  5. duilib WindowImplBase BUG修复 --- 按一次ESC键, 关闭多个窗口

    BUG造成的影响 继承自WindowImplBase的窗口类, 如果没有重写重写ResponseDefaultKeyEvent而由WindowImplBase默认处理的话, 会导致按一次有ESC键, ...

  6. 【现代程序设计】加分作业1-对Stack的理解

    要求:本次加分作业是要阅读这篇文章“ Stack的三种含义”,以及文章下方的评论,然后做出总结. ----------------------------------------华丽的分割线----- ...

  7. ML 04、模型评估与模型选择

    机器学习算法 原理.实现与实践——模型评估与模型选择 1. 训练误差与测试误差 机器学习的目的是使学习到的模型不仅对已知数据而且对未知数据都能有很好的预测能力. 假设学习到的模型是$Y = \hat{ ...

  8. 异步加载图片Universal-Image-Loader

    项目地址:https://github.com/nostra13/Android-Universal-Image-Loader

  9. mysql一次插入多条数据

    mysql一次插入多条数据: INSERT INTO hk_test(username, passwd) VALUES ('qmf2', 'qmf2'),('qmf3', 'qmf3'),('qmf4 ...

  10. BFS+模拟 ZOJ 3865 Superbot

    题目传送门 /* BFS+模拟:dp[i][j][p] 表示走到i,j,方向为p的步数为多少: BFS分4种情况入队,最后在终点4个方向寻找最小值:) */ #include <cstdio&g ...