Invalid Row Number - Exportando Excel com POI

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

[code]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);
                }
            }
        }
    }[/code]

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!

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

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!

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

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

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.

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

[code]@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");
}[/code]

Boa tarde, alguém conseguiu resolver este erro?