Exportando Jasper -> Excel (XLS) :: Problema

4 respostas
P

Olá pessoal,

seguinte, estou fazendo uma apliação que precisa gerar um relatório.
Estou utilizando uma lista de objetos que passo como parâmetro para o relatório, ao invés de buscar no banco, por teste. O problema está quando tento exportar para o Excel é lançada uma exceção java.lang.IllegalArgumentException

O erro é o seguinte:

java.lang.IllegalArgumentException: Sheet name cannot be blank, greater than 31 chars, or contain any of /\*?[]

Acredito que 'sheet' seja a aba do Excel.
Já tentei setar o valor via parâmetro da seguinte forma:

exporter.setParameter( JRXlsExporterParameter.SHEET_NAMES, new String [] {"Teste"} );

sem sucesso. Está aqui abaixo o código do método que gera o relatório. Estou utilizando Struts e Hibernate (que não vem ao caso). A versão do iReport que utilizei para fazer o relatório é a mais recente : 1.2.6 e os jars dele eu coloquei na lib do meu projeto. Qualquer ideia, por favor, meu prazo já passou fazem três dias, hehehe. Obrigado.

private void carregaRelatorioIndicadoresExcel( HttpServletRequest request, HttpServletResponse response, List indicadores ) throws Exception {
		
		ServletOutputStream ouputStream = response.getOutputStream();

		try {

			Map parameters = new HashMap();			

			String reportFilePathRelative = "/src/br/com/cfn/gvp/relatorio/jasper/IndicadoresDasResidencias_Anderson.jasper";
			HttpServletRequest context = request;
			String reportFilePath = context.getRealPath(reportFilePathRelative);

			File reportFile = new File(reportFilePath);
			byte[] bytes2 = null;
			JRXlsExporter exporter = new JRXlsExporter();		
			// Abre aconexao com o sevidor 

			FileInputStream input = new FileInputStream(reportFile);

			JasperPrint jasperPrint = null;
			
                        // pegaBean() gera uma lista qualuqer com objetos para o relatorio
			List l = pegaBean();
			JRBeanCollectionDataSource beanSource = new JRBeanCollectionDataSource(
					l);
			jasperPrint = JasperFillManager.fillReport(reportFilePath,
					parameters, beanSource);
			try {
				ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
				exporter.setParameter( JRExporterParameter.JASPER_PRINT, jasperPrint );
				exporter.setParameter( JRExporterParameter.OUTPUT_STREAM, baos );
				exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
				exporter.setParameter( JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE );
				exporter.setParameter( JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE ); 
				
				exporter.exportReport();
				
				bytes2 = baos.toByteArray();				
			} catch (JRException e) {
				String er = e.getMessage();				
			}

			response.setContentType("application/vnd.ms-excel");
			response.setHeader("Content-disposition","attachment; filename=file1.xls");
		
			response.setContentLength(bytes2.length);
			ouputStream.write(bytes2, 0, bytes2.length);
			ouputStream.flush();
			ouputStream.close();

		} catch (Exception e) {
			String a = e.getMessage();
			throw new ServletException(e);
		}		
		
	}
[size="18"][/size][size="24"][/size][size="18"][/size]

4 Respostas

C

Isso no JasperViewer Funciona ?

P

Pessoal, resolvido o problema.
Modifiquei o valor do parâmetro JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET para true e funcionou.

exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
Agora, gostaria de saber se alguém consegue exportar para excel com qualidade, por que o meu sai todo errado, utilizando muitas células e totalmente impossível de se tutilizar: uma desorganização total, embora no iReport esteja a maor maravilha do mundo.
Algúem sabe se existe algum tipo de padrão de grid para definir no iReport que melhore a alocação de células no excel?

Cassolato, funionava sim no JasperViewer, tava tudo ok.

B

Puta cara, oq eu já apanhei para deixar o relatório certinho no Excel pelo Jasper…
Então, o esquema eh o seguinte, vc tem q alinhar todos os seus elementos na mesma linha.
Por exemplo, se vc utilizar um textfield como título e colocar na margem 0 tamanho 10, e vc criar uma tabela e o cabeçalho da tabela começar na margem 1, tamanho 9, ae começa a zona. O Jasper vai criar uma coluna minúscula na margem e 1 coluna minúscula depois do cabeçalho, entendeu?!?
Se vc tivesse algo do tipo:


TITULO
CAB

Pronto, fudeu…
O Jasper vai colocar uma coluna pequena no espaço onde começa o CAB e um depois onde acaba o CAB, mas antes de acabar o título.
Para não ocorrer isso, vc tem q alinhas todos os labels e deixar certinho. No exemplo, teria q ficar assim:

TITULO
CAB

Assim não ficaria milhões de linhas e colunas.

Entendeu?!?
Se não entendeu, posta ae q eu tento ajudar…

Abraços…
PS: O problema não ocorre apenas com as colunas. Isso ocorre tb com as linhas…

D

O meu excel não ta preenchendo todas as células com o conteudo. Por exemplo eu tenho campos com 500 caracteres por exemplo e o tamanho da célula suporta só 300, os 200 finais ele não mostra. Se eu usar a opção Strecth with overflow do iReport caga tudo, pq cria linhas e tal… se eu não usar não vejo todo o conteudo.

Alguem sabe se a classe JRXlsExporter implementa algum método para colar o valor inteiro do campo, ou alguma forma de mostrar tudo.

Criado 13 de setembro de 2006
Ultima resposta 10 de jan. de 2007
Respostas 4
Participantes 4