Vamos ao tópico e apresentar o JasperReport de hoje, o IRORPORT ou JASPERSTUDIO, e então dois são suas ferramentas de visualização.
O que é JasperReport?
Este produto realmente tem muitos usuários domésticos. É um produto estrangeiro e pode -se dizer que é amplamente utilizado no campo de relatório Java.
Quando entrei em contato com este relatório, gostei muito. O mais importante é sua ferramenta de visualização, o que realmente me deixou incapaz de parar. Na verdade, eu poderia projetar relatórios de java simplesmente desenhando fotos. Falando em desenho, podemos usar as ferramentas visuais para projetar modelos de relatório visualmente, e os formatos de arquivo que ele suporta são muito amplos, incluindo Excel, Word, PDF, HTML, XML, CSV, etc.
Não parece muito poderoso? Ele foi projetado ao mesmo tempo e reutilizado várias vezes. Obviamente, coisas poderosas geralmente têm dois lados. Encontrei isso e me torturou por um longo tempo. Vou descrevê -lo em detalhes mais tarde.
Os seios grandes de Jasperreport
Eu disse anteriormente que Jasperreport, Ireport ou Jaspestudio é realmente impreciso. O segundo irmão Ireport e o terceiro irmão Jaspestudio são na verdade as ferramentas de design visual auxiliar de Jasper. Você pode projetar relatórios Jasper sem usá -lo e escrever mais brancos XML. Antes de 5.5, essa ferramenta era chamada de IRERORT. Depois de 5.5, com o nascimento do meu terceiro irmão Jaspestudio, o Ireport foi completamente substituído. De fato, essas duas ferramentas são basicamente as mesmas compatriotas de um filho.
Fluxo de trabalho específico:
① Primeiro, Jasper obterá o arquivo XML das informações de formato que precisam ser emitidas e, em seguida, compilará um arquivo .jasper Type do arquivo XML. Em seguida, este arquivo Jasper pode ser carregado em nosso aplicativo para gerar o relatório final. Você tem um sentimento muito familiar? Sim, isso é muito semelhante ao Java e precisa ser compilado.
A figura a seguir mostra a interface de operação do IRORPORT. É semelhante a Jaspestudio, então não vou postar. Você pode baixá -lo no Baidu sozinho.
Deixe -me apresentar brevemente cada tipo de banda na imagem acima.
(1) Banda do título: O segmento de título é exibido apenas na parte superior da primeira página de todo o relatório. Exceto na primeira página, não importa quantas páginas existam no relatório, o conteúdo da banda de título não aparecerá mais.
(2) PageHeader Band: Como o nome sugere, o conteúdo do segmento Pageheader aparecerá em todas as páginas de todo o relatório e será exibido na parte superior da página. Se for a primeira página do relatório, o conteúdo no PageHeader será exibido sob a banda do título. Em todas as outras páginas, exceto na primeira página, o conteúdo do PageHeader será exibido na parte superior da página.
(3) PageFooter Band: exibido na extremidade inferior da página.
(4) Banda LastPageFooter: exibida na parte inferior da última página.
(5) Banda detalhada: Relatório de conteúdo segmento, conteúdo que precisa ser repetido no relatório de design nesta banda e o conteúdo no segmento de detalhes aparecerá em todas as páginas.
(6) ColumnHeader Band: para o segmento de cabeçalho da banda de detalhes, geralmente neste segmento, o cabeçalho do relatório é desenhado.
(7) Banda de columnfooter: para o final da tabela da banda de detalhes.
(8) Banda de resumo: o segmento total da tabela aparece após a faixa de detalhes na última página de todo o relatório. Geralmente é usado para contar o valor total de um ou vários campos no relatório.
O exposto acima são todas as ferramentas de visualização. De fato, é muito simples de usar. Você pode encontrá -lo explorando -o. Como é um registro real do poço, esse naturalmente não é o ponto, então não vou falar sobre isso.
Aplicativos no código
Estas são as etapas que resumi. Talvez a descrição não seja muito precisa. Por favor, faça isso.
① Modelos de design, gerar arquivos JRXML, ↑↑ The Above Visualization Tool Fool projeta os estilos de modelo que você precisa
② Modelos de compilação, JRXML é compilado em arquivos Jasper, assim como os arquivos .java e .class em java, o programa precisa executar o arquivo binário de *.jasper.
De fato, esta etapa pode ser compilada diretamente com o IRORPORT para gerar .jasper e, é claro, também pode ser compilado através do programa Jasper em tempo de execução. No entanto, é recomendável que, se compilado no programa, a versão Jasper seja melhor consistente com a versão IRERORT ou Jaspestudio.
③Execute Relatório (os dados são preenchidos no relatório)
1. Carregue o modelo para gerar um objeto JasperReport
2. Use JasperfillManager para gerar objeto Jasperprint
④ Finalmente, use o jrxlsxExporter para exportar o relatório ou exibi -lo
Modelos de carregamento
Como geramos arquivos .jasper ou .jrxml usando ferramentas de visualização, naturalmente precisamos deixar o programa carregá -lo.
Código carregado, retornar o objeto Jasperport
if (urlpath.endswith (". Jasperreport = JasperCompilemanager.compilereport (IS); } catch (ioexception e) {lança a nova baséexception ("Load Jasper Error", e); } catch (jrexception e) {lança a nova base Baseexception ("O modelo JRXML transforma em erro de arquivo Jasper", e); } catch (throwable e) {lança nova baseexception ("o modelo jrxml transforma em erro de arquivo jasper", e); } catch (throwable e) {log.error (e); lançar uma nova Baseexception (e.getMessage ()); }} else if (urlpath.endswith (". Jasperreport = (JasperReport) jrloader.loadObject (IS); } catch (ioexception e) {lança a nova baséexception ("Load Jasper Error", e); } catch (jrexception e) {lança nova baseexception ("o erro do arquivo de modelo jrxml", e); } catch (throwable e) {log.error (e); lançar uma nova Baseexception (e.getMessage ()); }} else {lança a nova Baseexception ("arquivo inválido!"); }Obtenha a fonte de dados no relatório
Aqui eu uso o Javabean para obtê -lo
JrdataSource DataSource = null; if (fieldValues! = null && FieldValues.size ()> 0) {DataSource = new JrbeaCollectionDataSource (FieldValues); } else {DataSource = new JrEmptyDataSource (); } FieldValues é a coleção de Pojos obtidos no banco de dados.
Executar o preenchimento de relatórios
Obtenha o objeto Jasperprint
Mapa <string, object> parameTervalue = new hashmap <string, object> (); jasperprint = jasperfillmanager.fillreport (jasperreport, parameterValue, dataSource);
Finalmente, usamos o jrxlsxExporter para exportar o relatório
Este também é o lugar onde são necessários os mais parâmetros de configuração
Baos = novo byteArrayOutputStream (); export = novo jrxlsxExporter (); export.setParameter (jrexporterparameter.jasper_print, jasperprint); export.setParameter (jrexporterParameter.output_stream, Baos);
export.exporTreport ();
Concluído, os dados foram gravados no fluxo de saída. Você decide como produzir você mesmo, é muito mais breve do que outros métodos de introdução de código.
De fato, Jasperreport tem uma vantagem incomparável na redação de código e várias APIs foram embaladas. Mas pode ser que Chacha tenha feito muito e há muitos problemas.
Problema de Jasperreport
1. O espaço em branco antes de duas linhas
Se você usar o código acima para exportar o Excel, descobrirá que o fundo do Excel é branco, sem pequenas grades do Excel. Isso ocorre porque o fundo padrão do Jasper é branco, por isso é mais fácil ser compatível ao exportar outros formatos. Obviamente, não é necessário exportar o Excel. Basta adicionar as duas linhas a seguir para resolvê -las.
// Remova o export.setparameter em branco antes de duas linhas (jrxlSexporterParameter.is_remove_empty_space_between_rows, boolean.true); export.setParameter (jrxlSexporterParameter.is_remove_empty_space_between_columns, boolean.true); // Defina a cor de fundo da tabela Excel como o exportador branco padrão.setParameter (jrxlSexporterParameter.is_white_page_background, boolean.false);
2. O volume de dados é grande, o título é escrito várias vezes
Se você tiver muitos dados da planilha, poderá encontrar a situação em que o cabeçalho da tabela é impresso várias vezes. Nesse caso, você precisa adicionar a configuração de altura.
Página de campo pageHeight.setAccessible (true); pageHeight.SetInt (Jasperreport, Integer.max_value);
3. Problema do tipo de célula
Às vezes, o relatório do Excel que exportamos precisa ser calculado usando as funções do Excel. Se todos eles estiverem em formatos de texto, naturalmente não podemos calculá -lo. Nesse caso, precisamos usar
// Selecione automaticamente o Exportador do formato.SetParameter (jrxlSexporterParameter.is_detect_cell_type, boolean.true);
Lembre -se, ao projetar um relatório, selecione o tipo correto do campo.
4. O problema de várias folhas
O exemplo simples acima é apenas um arquivo que contém uma página da folha. E se nosso requisito for exportar várias folhas em um arquivo? Não se preocupe, este Japser já pensou nisso para nós.
Basta alterar as etapas de exportação acima para o seguinte
Baos = novo byteArrayOutputStream (); export = novo jrxlsxExporter (); export.setParameter (jrexporterParameter.jasper_print_list, listjasperprint); export.setParameter (jrexporameter. export.setParameter (jrxlSexporterParameter.is_one_page_per_sheet, boolean.true);
JrexporterParameter.jasper_print_list, passe em uma coleção de listjasperprints, cada jasperprint é uma página da folha.
5. Não há erro relatado na startup Linux, mas o relatório não pode ser exportado
De fato, esse problema me incomodou há muito tempo. Mais tarde, com a ajuda do chefe, lembrei -me do problema, porque não fez uma exceção, mas um erro. Vi que alguns colegas de classe fizeram essa pergunta on -line, então eu a publiquei.
Você pode usar o Throwable para capturar a mensagem de erro e obter a mensagem de erro: java.lang.internalError: Não é possível conectar -se ao X11 Window Server usando ': 0.0' como
Solução: modifique o tomcat/bin/catalina.sh e adicione java_Opts = "$ java_Opts -djava.awt.headless = true"
6. Problemas de excesso de memória de big data e vazamento de memória! !
Preciso falar sobre a diferença entre as versões do Excel 03 e 07. Lembro que a versão 03 suporta apenas 65532 linhas, mas após a versão 07, ela se tornou muito maior. Esqueci o número específico, não é a mesma ordem de magnitude de qualquer maneira.
O JRXLSXexporter suporta exportar arquivos XLSX.
O JRXLSEXporter é um arquivo XLS, que é fácil de identificar. As ferramentas exportadas são as mesmas que as do Excel.
Depois, há os problemas de transbordamento de memória e vazamento de memória. Eu acredito que os amigos que jogam Java basicamente encontraram isso.
A solução mais comum para o excesso de memória é aumentar o tamanho da memória do contêiner e aumentar o tamanho da memória do tomcat. Você pode usar o Baidu, existem muitos métodos, para não refazer a roda.
Aqui está um lembrete de que, se você estiver usando o Tomcat, os métodos de configuração da instalação do Windows, descompressão e Linux são diferentes; portanto, preste atenção.
O que eu preciso apresentar aqui é o método JasperReport. De fato, Jasperreport tem uma solução para o Big Data. Foi lançado em uma versão muito precoce, o emulador do JRFileVirtualizer.
Para que coisa é usada? De fato, ele gravará dados em um arquivo temporário no disco rígido de acordo com os parâmetros que você definir, que resolve o problema do uso excessivo de memória e transbordamento ao preencher os relatórios.
Atualmente, Jasperreport possui 3 emuladores, todos usados para resolver esse problema.
Eles são:
①jrFileVirtualizer
②jrswapFileVirtualizer
③jrgzipvirtualizador
Qual é a diferença entre esses três emuladores?
Primeiro, lancei o primeiro JrfileVirtualizer. Quando eu estava testando, quando exportei cerca de 30W de dados, ele relataria o estouro de memória. Mais tarde, depois de adicionar isso, eu poderia exportá -lo normalmente. Este emulador gerará um arquivo temporário para cada objeto e o armazenará no disco rígido para resolver o problema de uso da memória. No entanto, como existem muitos arquivos temporários gerados, o consumo de memória da criação e exclusão de arquivos é invisivelmente aumentado, por isso não é muito recomendado.
// Escreva vários arquivos jrfilevirtualizer virtualizer = new jrfilevirtualizer (2, patchpath); Mapa <string, object> paramenetValue = new hashmap <string, object> (); parameTervalue.put (jrparameter.report_virtualizer, virtualizer);
virtualizer.SetReadonly (true);
Catchpath é o caminho do cache do arquivo e deve existir, caso contrário, um erro será relatado.
Depois, há o JRSWAPFileVirtualizer, que foi lançado para resolver o problema do JRFileVirtualizer. Esse emulador criará apenas um arquivo temporário e cada objeto será responsável por uma parte desse arquivo; portanto, o consumo de memória da criação e exclusão do arquivo é reduzido. De fato, isso não é particularmente recomendado.
// Escreva um único arquivo rswapfile arquivoswap = new jrswapfile (catchpath, 4096, 25); jrabstractLruvirtualizer virtualizer = new jrswapFilevirtualizer (2, arquivoswap, true); Mapa <string, object> parameTervalue = new hashmap <string, object> (); parameTervalue.put (jrparameter.report_virtualizer, virtualizador);
virtualizer.SetReadonly (true);
Finalmente, há Jrgzipvirtualizer. Quando você vê o GZIP, não sabe se tem alguma conexão com a palavra compactação. É isso mesmo, este emulador usa um algoritmo especial de compressão que pode comprimir a pegada de memória para um trem ou um tweet, o que é incrível.
JRABSTRACTRATLRUVATUALIZER Virtualizer = new Jrgzipvirtualizer (2); map <string, object> parameTervalue = new hashmap <string, object> (); parametValue.put (jasperfillmanGer.report_virtualizer, virtualizer);
Dito muito, em resumo, existem três tipos de emuladores para resolver o problema de transbordamento da memória. Também li muitos blogs que usam o JRFileVirtualizer para resolver o problema de Big Data Memory. Então, quero dizer aqui que menos recomendo o uso do emulador JRFileVirtualizer, porque não apenas consome muitos arquivos para criar, mas também tem um vazamento de bug e memória muito grave! ! ! Há também o JRSWAPFileVirtualizer que tem esse problema.
Além disso, deve -se notar que, sem usar o emulador, haverá problemas de vazamento de memória. Quando você exporta o relatório, despeje as informações da pilha e descobre que existem muitas instâncias da classe Net.sf.jasperreports.engine.fill.jrtemplateprinttext, que não pode ser reciclada e não pode ser reciclada! ! ! E esse problema ainda existe na versão mais recente do JapserReport 6.x. Existem muitos problemas na comunidade Jasper e no excesso de pilha, mas não há solução.
Aqui recomendamos o emulador JRGZIPVirTualizer. Embora ainda haja problemas de vazamento, devido ao algoritmo exclusivo de compressão, o problema de vazamento de memória foi controlado para uma faixa muito pequena. É considerado uma solução para aliviar o uso de memória vazado em cerca de 90%.
Em geral, desisti deste plano agora e escrevi para que meus irmãos evitem desvios mais tarde. Depois de obter uma aula de ferramentas POI, prepararei -me para alterar todos os relatórios dos métodos de exportação de POI. Falando nisso, a solução POI Big Data é muito boa.