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

news/2024/7/21 4:09:12 标签: excel, poi, Java

首先有两种数据格式,如果只是为用表格,那么用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就行。


http://www.niftyadmin.cn/n/768488.html

相关文章

嵌入式硬件:电子元器件(1)电阻电容电感

感谢关注&#xff0c;微信公众号&#xff0c;干货满满&#xff1a; 一.电阻器 1. 电阻器的含义&#xff1a;在电路中对电流有阻碍作用并且造成能量消耗的部分叫电阻。 2. 电阻器的英文缩写&#xff1a;R&#xff08;Resistor&#xff09;及排阻RN 3. 电阻器在电路符号&…

RandomAccessFile读取文本最后一行以及倒序读取文本

首先需要说明几点&#xff1a;1.long len rf.length();获得的文件长度&#xff0c;在seek时是从0到len-1的&#xff0c;如果seek了len&#xff0c;那么用read方法返回-1&#xff0c;代表已经到了文件末尾。所以索引是0到length-1 2.用了RandomAccessFile的read方法后&#xf…

校招行测笔试--资料分析

面对校招笔试的行政能力测试&#xff08;简称“行测”&#xff09;环节&#xff0c;刚开始接触有些束手无策、摸不到头脑&#xff0c;其实是有技可循的&#xff0c;本文就帮助大家总结一下行测的相关技巧。如果对你有所帮助&#xff0c;记得关注笔者的公众号&#xff0c;干货满…

写两个线程,其中一个线程打印1-52,另一个打印A-Z,打印顺序为12A34B56C....5152Z

这是疯狂java讲义的一道题。在网上能搜到各种正确答案&#xff0c;有各种不同版本。在此我整理了一下&#xff0c;然后把其中的道理归纳总结一下。下面列出了各个版本&#xff1a; 1.有四个类&#xff0c;一个打印类&#xff0c;两个线程类&#xff0c;和一个测试类。打印类里…

keil使用J-Link烧录代码出现Error:Flash Download failed -“Cortex-M3”解决方案之一

出现问题 第一步&#xff1a;魔术棒–settings 第二步&#xff1a;SW改成JTAG.然后就能烧录成功了&#xff1a;&#xff09; 再把JTAG改回去&#xff0c;依然能成功&#xff0c;玄学||| 烧录成功 或者&#xff1a;将烧录速率改成2MHz。

嵌入式编程中的常用技巧

假设一个8位的寄存器&#xff0c;不能够直接进行位寻址&#xff0c;而又要使字赋值时不影响的其他位。那么要给某一位置0&#xff0c;置1&#xff0c;取反的常用写法。 下面以第四位为例进行说明(reg为该八位寄存器)&#xff1a; 将第4位置0&#xff1a;reg & ~(1<<…

编写一个递归方法,返回数N的二进制表示中1的个数

问题&#xff1a;编写一个递归方法&#xff0c;返回数N的二进制表示中1的个数 解决&#xff1a;利用这样一个事实&#xff1a;如果N是奇数&#xff0c;那么它等于N/2的二进制表示中1的个数加1。 通过自己笔算还能发现&#xff0c;如果N是偶数&#xff0c;那么它的个数等于&…

校招行测笔试-图形推理

校招行测笔试-图形推理 面对校招笔试的行政能力测试&#xff08;简称“行测”&#xff09;环节&#xff0c;刚开始接触有些束手无策、摸不到头脑&#xff0c;其实是有技可循的&#xff0c;本文就帮助大家总结一下行测的相关技巧。如果对你有所帮助&#xff0c;记得关注笔者的公…