JAVAExecel大数据导出

JAVA操作Execel需要用到,Apache POI

以下是一个简单的xls导出数据主要代码

String tempFile = "C:/XXXXX/xxxx.xls";
File excelFile = new File(tempFile);
excelFile.createNewFile();
OutputStream out = new FileOutputStream(excelFile);
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("XXXXX");//表下的TAB名字
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
cellStyle.setWrapText(true);
HSSFFont font = workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("黑体");
cellStyle.setFont(font);
HSSFRow row = sheet.createRow((short) 0);
for () //循环放入第一行中文信息
{
HSSFCell ce = row.createCell(cloumn);
        ce.setCellValue("中文");//第一列的中文都是放在这里  这里通常会出现第一个问题,如果列名是通过外部传入会出现乱码,这里最好做一个判断,如果是乱码就进行处理
        ce.setCellStyle(cellStyle);
cloumn++;
}
for () //循环数据条目录
{
for ()//循环1条数据条目的属性并且插入数据
}
//把已经写入信息的excelFile输入到输出流中
workbook.write(out);
//实际每个地方的返回的下载文件都会有自己的封装类,所以下面的就不用写了,自己测试用的时候就把他输出到一个指定的空间就行了


而不同JVM下只要是有限制,数据超过一定的数量就会报内存溢出的错误;

方法1:兼容性2003以上的版本打开
基本要对整个代码进行修改,这里提供主要的代码:




首选指定一个PATH,创建一个文件夹
String PATH="C:/XXXXX/XXXX/";
File f = new File(PATH);

if (!f.exists()) {

 f.mkdirs();

 }
    
数据插入excel不能只插一个excel,需要通过循环把数据分批导入到多个xls中
int page=30;
for(int i=0,j=count/page+1;i<j;i++)//通过总数与分页数算出需要多少个文件及,这里的分页设少只是方便测试,分页数按照实际情况大概有5K-5W的区间
{
String tempFile = PATH +"XXXXXX_"+i+ ".xls";
File excelFile = new File(tempFile);
excelFile.createNewFile();
OutputStream out = new FileOutputStream(excelFile);
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("XXXXX");//表下的TAB名字
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
cellStyle.setWrapText(true);
HSSFFont font = workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("黑体");
cellStyle.setFont(font);
HSSFRow row = sheet.createRow((short) 0);
for () //循环
{
HSSFCell ce = row.createCell(cloumn);
   ce.setCellValue("中文");//第一列的中文都是放在这里  这里通常会出现第一个问题,如果列名是通过外部传入会出现乱码,这里最好做一个判断,如果是乱码就进行处理
   ce.setCellStyle(cellStyle);
cloumn++;
}
//这里的循环第一次就是插入0-29的数据,第二次插入的是30-59,所以需要在本来的方法有修改
for () //循环数据条目录
{
for ()//循环1条数据条目的属性并且插入数据
}
workbook.write(out);
Writetolocal( new FileInputStream(excelFile) , PATH + File.separator + excelFile.getName());//把文件写入对应的文件夹
}
ZipCompressorByAnt zip = new ZipCompressorByAnt(PATH + ".zip");
zip.compress(PATH);  //压缩文件夹
java.io.File zipFile = new java.io.File(PATH + ".zip");  //根据实际的调用类把文件类放入类中下载            





方法2: 不兼容2007以下的版本,获得的单个xlsx后缀的文件,但是支持单个文件,使用POI 3.8版本支持大数据的数据导出
把上面标红的代码替换掉
String tempFile = "C:/XXXXX/xxxx.xls";
File excelFile = new File(tempFile);
excelFile.createNewFile();
OutputStream out = new FileOutputStream(excelFile);
Workbook workbook = new SXSSFWorkbook(5000);
Sheet sheet = workbook.createSheet("XXXXX");;//表下的TAB名字
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
cellStyle.setWrapText(true);
Font font = workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("黑体");
cellStyle.setFont(font);
Row row = sheet.createRow((short) 0);
for () //循环
{
Cell ce = row.createCell(cloumn);
        ce.setCellValue("中文");//第一列的中文都是放在这里  这里通常会出现第一个问题,如果列名是通过外部传入会出现乱码,这里最好做一个判断,如果是乱码就进行处理
       ce.setCellStyle(cellStyle);
cloumn++;
}
for () //循环数据条目录
{
for ()//循环1条数据条目的属性并且插入数据
}
//把已经写入信息的excelFile输入到输出流中
workbook.write(out);
//实际每个地方的返回的下载文件都会有自己的封装类,所以下面的就不用写了,自己测试用的时候就把他输出到一个指定的空间就行了

猜你喜欢

转载自blog.csdn.net/kiranet/article/details/50527227