超越梦想,一起飞!!!

宁静致远,淡泊明志!

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

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


程序代码如下,

package com.tibco.poi.xssf;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class CreatRowTest {
	//当前文件已经存在
	private String excelPath = "D:\\exceltest\\comments.xlsx";
	//从第几行插入进去
	private int insertStartPointer = 3;
	//在当前工作薄的那个工作表单中插入这行数据 
	private String sheetName = "Sheet1";

	/**
	 * 总的入口方法
	 */
	public static void main(String[] args) {
		CreatRowTest crt = new CreatRowTest();
		crt.insertRows();
	}
	/**
	 * 在已有的Excel文件中插入一行新的数据的入口方法
	 */
	public void insertRows() {
		XSSFWorkbook wb = returnWorkBookGivenFileHandle();
		XSSFSheet sheet1 = wb.getSheet(sheetName);
		XSSFRow row = createRow(sheet1, insertStartPointer);
		createCell(row);
		saveExcel(wb);

	}
    /**
     * 保存工作薄
     * @param wb
     */
	private void saveExcel(XSSFWorkbook wb) {
		FileOutputStream fileOut;
		try {
			fileOut = new FileOutputStream(excelPath);
			wb.write(fileOut);
			fileOut.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
    /**
     * 创建要出入的行中单元格
     * @param row
     * @return
     */
	private XSSFCell createCell(XSSFRow row) {
		XSSFCell cell = row.createCell((short) 0);
		cell.setCellValue(999999);
		row.createCell(1).setCellValue(1.2);
		row.createCell(2).setCellValue("This is a string cell");
		return cell;
	}
   /**
    * 得到一个已有的工作薄的POI对象
    * @return
    */
	private XSSFWorkbook returnWorkBookGivenFileHandle() {
		XSSFWorkbook wb = null;
		FileInputStream fis = null;
		File f = new File(excelPath);
		try {
			if (f != null) {
				fis = new FileInputStream(f);
				wb = new XSSFWorkbook(fis);
			}
		} catch (Exception e) {
			return null;
		} finally {
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return wb;
	}
   /**
    * 找到需要插入的行数,并新建一个POI的row对象
    * @param sheet
    * @param rowIndex
    * @return
    */
	private XSSFRow createRow(XSSFSheet sheet, Integer rowIndex) {
		XSSFRow row = null;
		if (sheet.getRow(rowIndex) != null) {
			int lastRowNo = sheet.getLastRowNum();
			sheet.shiftRows(rowIndex, lastRowNo, 1);
		}
		row = sheet.createRow(rowIndex);
		return row;
	}

	

}

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


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chancein007/article/details/46241983
文章标签: poi Apache Java POI Bug
个人分类: Java POI Excel
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭