java写出大数据(千万级别)的excel探索(一)

java写出大数据excel的方法探索(一)

需求:每个excel能够有1000W调数据量,这是个上限值。

计划方案:

1、JXL只能处理2003的而且有65535行数的限制,放弃;

2、POI处理写出,带基础样式,只能有15W左右就内存泄漏;不带样式,25W以上就内存泄漏;通过查看资源监视器,确认主要耗费内存为创建cell对象,导致内存泄漏,单纯增加JVM内存大小,并不能根本解决;放弃,实在没办法预留备选不带样式。

3、excel操作过程中,实际也是xml格式的读写,所以直接从基础的xml读写入手,本文就是一步步的探索使用xml怎么写出大数据的excel,虽然结果不是完美,但能够满足需求。


探索步骤:

以下步骤参考了很多百度搜到的各位大神的demo,借助了很多思路。

原理探索:

流程:excel--->xml---->excel

excel到xml:

①首先创建一个excel2003的xls文件,命名为test.xls;

②在默认的3个sheet页中任意填入一些数据,三个sheet都填,以便在xml中看到现象;

③另存为2003的xml电子表格;

④使用nodepad++打开xml,可以看到内容如下:




 
  2006-09-16T00:00:00Z
  2006-09-16T00:00:00Z
  14.00
 
 
  
  
 
 
  8010
  14805
  240
  105
  2
  False
  False
 
 
  
 
 
  
    1
    1
    1
    1
    1
   
    2
    2
    2
    2
    2
   
9 600 600 3 27 1 False False 3 3 3 4 4 4
3 1 2 False False Sheet3"> 5 5 5 5 6 6 6 6
3 5 7 False False

 
  

上面的xml我们主要关注的内容不多,可以看到每个sheet页的结构都是一致,由此可以猜测,可以一行行的写出,最终偏成这个格式;

④由此进行第二部xml转为excel;

使用最普通的字节流读取,效率最高;

简单demo如下:

public class WriteBigDataToExccel
{
	
	private static String path = System.getProperty("user.dir") + File.separator + "config/";
	
	public static void main(String[] args)
	{
		
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		FileInputStream fis = null;
		FileOutputStream fos = null;
		File fi = new File(path + "test.xml");
		File fo = new File(path + "t1.xls");
		try
		{
			fis = new FileInputStream(fi);
			bis = new BufferedInputStream(fis);
			fos = new FileOutputStream(fo);
			bos = new BufferedOutputStream(fos);
			byte[] b = new byte[1024];
			int len = 0;
			while(-1 != (len = bis.read(b)))
			{
				bos.write(b, 0, len);
				bos.flush();
			}
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		finally
		{
			close(fis, bis, fos, bos);
		}
		
	}

	/**
	 * close(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @param fis
	 * @param bis
	 * @param fos
	 * @param bos
	 *void
	 * @exception
	 * @since  1.0.0
	*/
	private static void close(FileInputStream fis, BufferedInputStream bis, FileOutputStream fos,
			BufferedOutputStream bos)
	{
		if(null != fis)
		{
			try
			{
				fis.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		if(null != bis)
		{
			try
			{
				bis.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		if(null != fos)
		{
			try
			{
				fos.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		if(null != bos)
		{
			try
			{
				bos.close();
			}
			catch (IOException e)
			{
				e.printStackTrace();
			}
		}
		
	}
	

运行之后得到一个excel,目前的话只能生产xls的格式,如果是xlsx的格式无法正常打开;

得到了一个与原excel内容完全相同的excel;


以上是接下来要进行写出大数据的原理,也是模版。


你可能感兴趣的:(excel,java)