首先有两种数据格式,如果只是为用表格,那么用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 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 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 userList=read.readtext();
int[] biao=statistics.countFor(userList, 0.1, 0, 3);
LinkedHashMap 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就行。