如果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. c++ 继承 虚函数与多态性 重载 覆盖 隐藏

    http://blog.csdn.net/lushujun2011/article/details/6827555 2011.9.27 1) 定义一个对象时,就调用了构造函数.如果一个类中没有定义任何 ...

  2. device unauthorized & ANDROID_ADB_SERVER_PORT 问题解决

    最近做安卓开发的时候,碰到了如下两个极品问题,刚开始晕头转向,仔细一研究终于解决了: FAQ1: C:\Users\xxx>adb shelladb: Env var ANDROID_ADB_S ...

  3. keytool生成证书与Tomcat SSL配置

    转自:http://tomhat.iteye.com/blog/2087673 一.Keytool介绍 Keytool是一个Java数据证书的管理工具.Keytool将密钥(key)和证书(certi ...

  4. [转载]有了 malloc/free 为什么还要 new/delete ?

      malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符.他们都可以用于申请动态内存和释放内存.      对于非内部数据类型的对象(如类对象)而言,光用m ...

  5. JVM的数据类型

    Java虚拟机是通过某些数据类型来执行计算的,数据类型可以分为两种:基本类型和引用类型,基本类型的变量持有原始值,而引用类型的变量持有引用值. Java语言中的所有基本类型同样也都是Java虚拟机中的 ...

  6. Xamarin提示Build-tools版本过老

    Xamarin提示Build-tools版本过老 错误信息:G:\XamarinDemo\Xamarin.Forms-master\packages\Xamarin.Android.Support.V ...

  7. mysql之对索引的操作

    1. 为什么使用索引? 数据库对象索引与书的目录非常类似,主要是为了提高从表中检索数据的速度.由于数据储存在数据库表中,所以索引是创建在数据库表对象之上的,由表中的一个字段或多个字段生成的键组成,这些 ...

  8. 递推DP URAL 1081 Binary Lexicographic Sequence

    题目传送门 题意:问第k个长度为n的01串是什么(不能有相邻的1) 分析:dp[i][0/1] 表示前i个,当前第i个放1或0的方案数,先预处理计算,dp[i][1]只能有dp[i-1][0]转移过来 ...

  9. 递推DP URAL 1225 Flags

    题目传送门 /* 1 r; 2 b; 3 w 2不能在最前面,所以dp[1] = 2; dp[2] = 2: 13 or 31 dp[i] = dp[i-1] + dp[i-2]; 只加1或3时,总数 ...

  10. html基本标签练习

    Alt  显示工具栏 f2修改文件名称 内联元素:<div>只占一行</div> 块级元素:<span></span> 以utf8无bom格式编码 安装 ...