POI操作EXCEL,追加或覆盖数据,输入输出流注意事项,jar包的选择

首先有两种数据格式,如果只是为用表格,那么用xls格式就够用了。但如果你还用得到XML的东西,那么需要用xlsx这个格式。

实现代码很简单。

2017.9.22补充:

1.一定要在XSSFWorkbook用输入流当成构造函数参数创建新对象后,再使用输入流。如果直接先把输入流,输出流建立好了以后,再创建新对象,就会报错。错误信息为: org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException: No valid entries or contents found, this is not a valid OOXML (Office Open XML) file。但是我并不想知道这是为什么了,因为我只想避开这个问题。

错误代码顺序如下(假设你已经新建了一个Excel文件):

		    File excel=new File("F:\\build.xlsx");
		    FileInputStream fs;
		    fs=new FileInputStream(excel);
		    FileOutputStream out=new FileOutputStream(excel);
		    XSSFWorkbook workbook = new XSSFWorkbook(fs);

正确代码顺序如下:

                    File excel=new File("F:\\build.xlsx");
		    FileInputStream fs;
		    fs=new FileInputStream(excel);		    
		    XSSFWorkbook workbook = new XSSFWorkbook(fs);
		    FileOutputStream out=new FileOutputStream(excel);
2. 输入流,输出流在使用之后(输入流用于构造函数,输出流用于写入数据), 再使用同样的流做之前的事会报错(再使用输入流报错流为空,再使用输出流报错为 org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : The part /docProps/app.xml failed to be saved in the stream with marshaller org.apache.poi.openxml4j.opc.internal.marshallers.DefaultMarshaller@4bbfb90a)。所以对于同一个引用的流,在使用之后还想要继续使用的话,必须重新新建一个流对象。

输入流被使用情况:

FileInputStream fs=new FileInputStream(excel);
XSSFWorkbook workbook = new XSSFWorkbook(fs);
输出流被使用情况:

FileOutputStream out=new FileOutputStream(excel);
workbook.write(out);
3. XSSFSheet,这个对象想要获得数据,必须是先获得行,再获得这行的某一个单元。即必须先行后列。即没有直接获得列数据的方法。

对于获得行数据,有两种方法createRow和getRow。顾名思义,前者是新建行,后者是获得行。createRow是不管原来这一行原来是不是有原始数据,都会新建一行。getRow是获得原始行数据,如果本来就是空行,那么就获得一个空行。

对于获得单元数据,有两种方法createCell和getCell。功能与上述内容类似。

所以,当我们想要追加数据,或者是想根据原来的内容修改数据,就应该使用get方法。而想要使用新的数据来直接覆盖掉旧的数据时,就应该使用create方法。



package trust;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map.Entry;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 

import dataStru.user;

public class JExcel {

	 public static void Export(LinkedHashMap<String,Integer> map) throws FileNotFoundException, IOException
	 {
		 HSSFWorkbook wb = new HSSFWorkbook();
		 HSSFSheet sheet = wb.createSheet("table");  //创建table工作薄
		 
		 HSSFRow row1,row2;
		 row1 = sheet.createRow(0);
		 row2 = sheet.createRow(1);
		 HSSFCell cell1,cell2;
		 int count=0;
		 for(Entry<String, Integer> a:map.entrySet())
		 {
			 cell1 = row1.createCell(count);
			 cell2 = row2.createCell(count);
			 cell1.setCellValue(a.getKey());
			 cell2.setCellValue(a.getValue());
			 count++;
		 }
		
		 
		 wb.write(new FileOutputStream("E:\\table.xls"));
	 }
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		ArrayList<user> userList=read.readtext();
		int[] biao=statistics.countFor(userList, 0.1, 0, 3);
		LinkedHashMap<String,Integer> map=statistics.qujian(biao, 10);//自己定义区间大小
		JExcel.Export(map);
	}

}
重点讲下poi-bin-3.16-20170419这个你去apace官网下的api文件,考虑到我实现的功能特别简单,在添加jar包时,各位可能还需要另外再添加jar包,但我这些肯定都是必须的。

先放下这个文件解压后的目录结构,


首先如果是使用xls这个老格式的EXCEL,那么就只需要poi-3.16.jar这一个jar包,我想一般工程都够用了吧

而如果是使用xlsx这个新格式的EXCEL,那么就还需要几个,如下图所示


还有就是代码的改动就只是把上面的HSSF全部变成XSSF就行。

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值