poi3 8大数据导出-poi3.8大数据量Excel导出连续查询导出不同的报表后导出速度非常慢

问题描述

poi3.8大数据量Excel导出连续查询导出不同的报表后导出速度非常慢
  poi3.8用((SXSSFSheet)sheet).flushRows()方法解决了大数据量的excel导出,但是我在使用过程中,由于每个单元格都要设置不同的颜色和数据格式,发现导出第一张报表时速度还勉强可以接受,但是继续导出另一张报表,速度就慢的跟蜗牛似的,要10分钟甚至3个小时,请问有什么方法可以解决?
        代码如下:

private static void fillExcel(KDTable kdtReport, SXSSFWorkbook book, Sheet sheet) {
int headRowCount = kdtReport.getHeadRowCount();
headRowCount=headRowCount+startRowCount;
Font font=book.createFont();
font.setFontHeightInPoints((short)10);
//改为保留整数
Short numFormat = book.createDataFormat().getFormat("0"); //numFormat==>0.00=0
//单元格样式或行样式
CellStyle cellStyle = book.createCellStyle(); // 建立新的cell样式
cellStyle.setBorderBottom(CellStyle.BORDER_THIN); //下边框

cellStyle.setBorderLeft(CellStyle.BORDER_THIN);//左边框

cellStyle.setBorderTop(CellStyle.BORDER_THIN);//上边框

cellStyle.setBorderRight(CellStyle.BORDER_THIN);//右边框

Set mergeBlockSet = new HashSet();

Cell cell = null;
Object value = null;
KDTMergeBlock mergeBlock = null;
IRow row2 = null;
Color color = null;
Row row = null;
int treeLevel = 0;
short colorIndex = IndexedColors.WHITE.getIndex();
for (int i = 0; i < kdtReport.getRowCount(); i++) {

row2 = kdtReport.getRow(i);
treeLevel = row2.getTreeLevel();
color = row2.getStyleAttributes().getBackground();
row = sheet.getRow(i + headRowCount);
if(row==null){
row = sheet.createRow(i+headRowCount);
}

cellStyle = book.createCellStyle();
cellStyle.setBorderBottom(CellStyle.BORDER_THIN); //下边框

cellStyle.setBorderLeft(CellStyle.BORDER_THIN);//左边框

cellStyle.setBorderTop(CellStyle.BORDER_THIN);//上边框

cellStyle.setBorderRight(CellStyle.BORDER_THIN);//右边框

cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);

        if(Color.white.getRed()==color.getRed()&&Color.white.getGreen()==color.getGreen()&&Color.white.getBlue()==color.getBlue()){
            colorIndex = IndexedColors.WHITE.getIndex();
        }else{
            colorIndex = spaceColorIndex[treeLevel];
        }
        cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
        cellStyle.setFillForegroundColor(colorIndex);
        for (int j = 0; j < kdtReport.getColumnCount(); j++) {
            value = row2.getCell(j).getValue();
            mergeBlock = row2.getCell(j).getMergeBlock();
            if(mergeBlock!=null){
                mergeBlockSet.add(mergeBlock);
            }
            if (value != null) {
                if(KDTableUtil.TREE_LEVEL_COLKEY.equals(kdtReport.getColumn(j).getKey()) || "curProject".equals(kdtReport.getColumn(j).getKey())){
                    if(!RptHelper.IndexHistoryChangeUIName.equals(tableName)){//指标历史变化表(这个好特殊啊)
                        value = value.toString().trim();
                        value = space1[treeLevel]+value;
                    }
                }
                cell = row.createCell(j);
                if(value instanceof BigDecimal || value instanceof Integer || value instanceof Long || value instanceof Double){
                    BigDecimal bValue = FDCHelper.toBigDecimal(value);
                    if(bValue.compareTo(BigDecimal.ZERO)!=0){
                        cell.setCellValue(bValue.doubleValue());
                        cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);
                    }
                    cellStyle.setDataFormat(numFormat);
                    cell.setCellStyle(cellStyle);
                }else{
                    cell.setCellValue(value.toString());
                    cell.setCellType(XSSFCell.CELL_TYPE_STRING);
                    if(cellStyle!=null){
                        cell.setCellStyle(cellStyle);
                    }else{
                        cellStyle = book.createCellStyle();

                        cell.setCellStyle(cellStyle);
                    }
                }
            }else{
                cell = row.createCell(j);
                cellStyle.setFillForegroundColor(colorIndex);
                cell.setCellStyle(cellStyle);
            }
        }
        //每100行,就设置分组和合并信息,最后把这100行内容从内存写入本地硬盘
         if(i>1&&i%100==0){
             System.out.println("i:"+i);
             try {
                // 设置分组和合并
                setRowGroup(kdtReport, sheet);
                // 设置分组数据显示
                sheet.setRowSumsBelow(false);
                sheet.setRowSumsRight(false);
                //这100行内容从内存写入本地硬盘
                ((SXSSFSheet)sheet).flushRows();
                cellStyle = book.createCellStyle();
              } catch (IOException e) {
                e.printStackTrace();
              }

          }
    }
    //把剩余行内容从内存写入本地硬盘
    try {
        // 设置分组和合并
        setRowGroup(kdtReport, sheet);
        // 设置分组数据显示
        sheet.setRowSumsBelow(false);
        sheet.setRowSumsRight(false);
        ((SXSSFSheet)sheet).flushRows();
        cellStyle = null;
    } catch (IOException e) {
        e.printStackTrace();
    }
    Iterator iterator = mergeBlockSet.iterator();
    CellRangeAddress cellRangeAddress =null;
    while (iterator.hasNext()) {
        mergeBlock = (KDTMergeBlock) iterator.next();

        int left = mergeBlock.getLeft();
        int right = mergeBlock.getRight();

        int top=mergeBlock.getTop()+headRowCount;
        int bottom=mergeBlock.getBottom()+headRowCount; 

        cellRangeAddress = new CellRangeAddress(top, bottom, left, right);
        sheet.addMergedRegion(cellRangeAddress);
    }
}

解决方案

用性能监视工具看看内存有没有明显增加,代码的热区在哪里,看看能不能优化。

时间: 2024-11-02 18:52:25

poi3 8大数据导出-poi3.8大数据量Excel导出连续查询导出不同的报表后导出速度非常慢的相关文章

导出大数据量excel,用POI

问题描述 导出大数据量excel,用POI 需要导出的数据量可能非常大(超过10W条),而且要照顾到没装07Excel的机器,不能用SXSSFworkbook.鉴于一个sheet页最多65000多条记录,那么大数据就需要多个sheet页.由于导出前要先查数据库,是应该一次查出所有数据然后导出还是分次查询?每次查询65000条数据? 解决方案 这么大的文件,excel 2003未必能打开.建议分页存入多个excel文件. 解决方案二: 看速度和效率了,分次是不是速度还快点

junit-dbunit-2.4.8+poi-3.2-final测试报错,各位大神有知道的没,求指导

问题描述 dbunit-2.4.8+poi-3.2-final测试报错,各位大神有知道的没,求指导 java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFRow.getCell(I)Lorg/apache/poi/hssf/usermodel/HSSFCell; at org.dbunit.dataset.excel.XlsTable.createMetaData(XlsTable.java:91) at org.dbuni

大数据到底怎么学:数据科学概论与大数据学习误区

"数据科学家走在通往无所不知的路上,走到尽头才发现,自己一无所知."-Will Cukierski,Head of Competitions & Data Scientist at Kaggle 最近不少网友向我咨询如何学习大数据技术?大数据怎么入门?怎么做大数据分析?数据科学需要学习那些技术?大数据的应用前景等等问题.由于大数据技术涉及内容太庞杂,大数据应用领域广泛,而且各领域和方向采用的关键技术差异性也会较大,难以三言两语说清楚,本文从数据科学和大数据关键技术体系角度,来说

【大数据100分】大数据架构及行业大数据应用(中级教程)

[大数据100分]南大通用CTO武新:大数据架构及行业大数据应用[大数据中级教程] 主讲嘉宾:武新 主持人:中关村大数据产业联盟 副秘书长陈新河 承办:中关村大数据产业联盟 武新,南大通用高级副总裁兼CTO,法国奥尔良大学和法国国家科研中心博士:南大通用GBASE系列数据库产品的总设计师.在著名的甲骨文公司任职12年,是世界顶级的Oracle数据库专家.2010年获得中组部实施的国家"千人计划"荣誉(海外高层次人才引进计划),是国内基础软件行业唯一入选的数据库技术专家.对目前最新兴的列

Excel数据透视表10大常用技巧

  Excel数据透视表10大常用技巧           1.样式改变为表格样式 2.计数项改为求和项 3.套用样式 4.隐藏和显示汇总项 5.合并单元格 6.列宽及格式保持不变

初学者,想问大神,如何比较一组数据, 不同类型的 数据 ?求指教

问题描述 初学者,想问大神,如何比较一组数据, 不同类型的 数据 ?求指教 想问大神,如何比较一组数据, 不同类型的 数据 ?求指教,别人说可以用链表(我不会)有别的方法吗 解决方案 比较数据的关键不在链表还是数组,而在于算法本身. 如果你觉得链表复杂,就用数组,以及任何你可以用来表示一组数字的类型. 解决方案二: 不同类型的 数据,你的比较规则是什么? 一组数据,是如何保存的呢?如果是连续保存,直接按内存中的内容比较,简单一些:除非是按链表保存的,才可以用链表.否则不是在自找麻烦! 解决方案三

用sql语句遍历一个表里异常(时间段内很大或者很小)的数据,并将异常数据修改成相应时间段前的数据

问题描述 用sql语句遍历一个表里异常(时间段内很大或者很小)的数据,并将异常数据修改成相应时间段前的数据 我有一张表,里面3字段id.time.value. 由于value中的部分值异常的大,我想批量修改数据,比如说4.1日-4.20日出现中出现异常大的数据,我想把异常大的数据修改成和他时间段(时间段前或者后)差不多的数据,请问下这个sql应该怎么写啊.我用游标的方法怎么实现.谢谢啊! 解决方案 不知道你的数据库是什么,用MS SQL SERVER示意 建表SQL如下 CREATE TABLE

2017年大数据向左走、向右走?且看阿里数据经济研究中心六位大咖怎么看

2016年的市场热点从大数据已经过渡到了人工智能,但大数据.计算能力和算法这三大要素结合在一起才真正造就了人工智能在2016年的崛起.那么,业内专家如何看过去的2016和2017年大数据的发展呢?让我们看下6位ADEC(阿里数据经济研究中心)的特邀研究员的观点吧. 数据隐私界定和保护是焦点 田杰棠 国务院发展研究中心技术经济部副部长 2016年是大数据从探索性应用走向纵深发展的一年,两批共八个国家级大数据综合试验区启动建设,越来越多的行业试水数据分析和应用,一些高校已经开设大数据专业,大数据和人

初创公司:大数据时代,如何靠数据挣钱

大数据时代下,数据就如同矿石,如果能够充分挖掘并善加利用,大数据将会成为大财富.在很多情况下虽然大数据的价值还没得到充分证明,但分析人士指出这一市场正在扩大,越来越多的有经验的投资者希望能得到不为人知的独家数据. 大数据时代下,数据就如同矿石,如果能够充分挖掘并善加利用,大数据将会成为大财富.在很多情况下虽然大数据的价值还没得到充分证明,但分析人士指出这一市场正在扩大,越来越多的有经验的投资者希望能得到不为人知的独家数据. 目前已经有很多初创公司认识到了这一点,接下来本文将介绍三家利用大数据挣钱