Invalid Row Number - Exportando Excel com POI

7 respostas
P

Bom dia!

Manjo bem pouco (quase nada) de POI e peguei um BO pra corrigir aqui no trabalho...
Tem um relatório enorme, com 66mil linhas que tá dando erro quando exporta...

07/02/2013 11:26:10 com.sun.faces.lifecycle.InvokeApplicationPhase execute
AVISO: Invalid row number (65536) outside allowable range (0..65535)
java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
	at org.apache.poi.hssf.usermodel.HSSFRow.setRowNum(HSSFRow.java:207)
	at org.apache.poi.hssf.usermodel.HSSFRow.<init>(HSSFRow.java:73)
	at org.apache.poi.hssf.usermodel.HSSFSheet.createRow(HSSFSheet.java:204)
	at org.primefaces.component.export.ExcelExporter.export(ExcelExporter.java:54)
	at org.primefaces.component.export.DataExporter.processAction(DataExporter.java:94)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:777)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIData.broadcast(UIData.java:915)
	at org.primefaces.component.datatable.DataTable.broadcast(DataTable.java:630)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:115)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
	at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:662)

Esse é o erro...

o código está assim

HSSFWorkbook wb = (HSSFWorkbook) document;
        HSSFSheet sheet = wb.getSheetAt(0);
        int rowNum = 0;
        int cellNum = 0;
        HSSFRow row = sheet.createRow(rowNum++);
        for (int i = 0; i < getFieldList().size(); i++) {
            if (getField().isVisible()) {
                HSSFCell createCell = row.createCell(cellNum++);
                createCell.setCellValue(getFieldList().get(i).getLabel());
            }
        }

        for (int i = 0; i < result.size(); i++) {
            cellNum = 0;
            if(i == 60000){
                sheet = wb.createSheet();
                rowNum = 0;
            }
            row = sheet.createRow(rowNum++);
            for (int j = 0; j < getFieldList().size(); j++) {
                if (getField().isVisible()) {
                    HSSFCell createCell = row.createCell(cellNum++);
                    Object attribute = getColumn(result.get(i), getFieldList().get(j));
                    if (attribute instanceof Date) {
                        createCell.setCellValue((Date) attribute);
                    } else if (attribute instanceof Integer) {
                        createCell.setCellValue((Integer) attribute);
                    } else if (attribute instanceof BigDecimal) {
                        createCell.setCellValue(((BigDecimal) attribute).toString());
                    } else {
                        createCell.setCellValue((String) attribute);
                    }
                }
            }
        }

Dei uma procurada no google, mas não encontrei nada. Debugando o código, o documento fica com 2 sheet, uma com 60k de registro e outro com 6k. A var rowNum = 6k e pouco... sinceramente não tenho mais ideia do que pode ser.
E se alguém souber se tem um jeito certo pra jogar pra outra sheet, por favor me fale rs tirar aquela gambi dali haha

Desde já agradeço, caras!

7 Respostas

R

vc está tentando definir valor em uma linha 65.536, mas você só pode ir de 0 a 65535 isso é uma limitação do arquivo XLS.

Você já debugou seu código pra ver se ele está passando ai,

pq pelo StackTrace parace que o PrimeFaces está chamando diretamente o POI

P

Pior que não está estourando esse valor, Rafael.
Uma sheet fica com 60mil registros e quando chega nisso joga pra outra, que não dá 7mil :expressionless:

Valeu, cara!

R

Mas a planilha chega a ser gerada, com todos os registros do ResultSet? Se sim que horas esse problema ocorre então?

P

Gera sim. Quando eu paro e vejo a variável “wb” ele está com os 66mil registros divididos entre as 2 sheet.
O erro dá quando ele sai do método postado acima…

Valeu, Rafael \o

R

Qual o nome do método acima? Acho que vc não está conseguindo descobrir porque não é ai que está dando o erro, repare no seu stackTrace que não aparece o seu método.
Acho que depois do seu método o Primefaces por algum motivo está tentando gerar outra planilha e é ai que da o erro.

P

hmmm

está assim

xhtml
<h:commandLink>  
                            <p:graphicImage value="./../resources/imagens/icon-excel.png" />  
                            <p:dataExporter type="xls" target="consFSP" fileName="#{repBean.reportName}"  preProcessor="#{repBean.preProcessXLS}" />  
                        </h:commandLink>
método
@Override
    public void preProcessXLS(Object document) {
        HSSFWorkbook wb = (HSSFWorkbook) document;
        HSSFSheet sheet = wb.getSheetAt(0);
        int rowNum = 0;
        int cellNum = 0;
        HSSFRow row = sheet.createRow(rowNum++);
        for (int i = 0; i < getFieldList().size(); i++) {
            if (getField().isVisible()) {
                HSSFCell createCell = row.createCell(cellNum++);
                createCell.setCellValue(getFieldList().get(i).getLabel());
            }
        }

        for (int i = 0; i < result.size(); i++) {
            cellNum = 0;
            if(i == 60000){
                sheet = wb.createSheet();
                rowNum = 0;
            }
            row = sheet.createRow(rowNum++);
            for (int j = 0; j < getFieldList().size(); j++) {
                if (getField().isVisible()) {
                    HSSFCell createCell = row.createCell(cellNum++);
                    Object attribute = getColumn(result.get(i), getFieldList().get(j));
                    if (attribute instanceof Date) {
                        createCell.setCellValue((Date) attribute);
                    } else if (attribute instanceof Integer) {
                        createCell.setCellValue((Integer) attribute);
                    } else if (attribute instanceof BigDecimal) {
                        createCell.setCellValue(((BigDecimal) attribute).toString());
                    } else {
                        createCell.setCellValue((String) attribute);
                    }
                }
            }
        }
        System.out.println("aos");
    }
I

Boa tarde, alguém conseguiu resolver este erro?

Criado 7 de fevereiro de 2013
Ultima resposta 23 de jul. de 2015
Respostas 7
Participantes 3