Esses dias comecei a estudar como integrar algum sistema de relatório ao Rails. O problema principal é que nenhum sistema de relatórios possui editor visual (para Layout, essas coisas fazem uma diferença…). Felizmente, existe o Jasper, com o iReport que é um editor visual. O problema é que ele é em Java… a solução é que existe JRuby!
Mas, como integrar bem essas duas tecnologias?
Estou montando, agora, um software aonde vai ser possível incluir relatórios, e depois com uma chamada RESTful o Jasper montará seu relatório. Para os que estão curiosos, para montar um relatório com JRuby basta seguir os seguintes passos:
- Descompacte o pacote Jasper. Crie um relatório para usar formato XML;
- Crie um aplicativo JRuby, e inclua a biblioteca .jar do Jasper, e todas as bibliotecas que estiverem no diretório lib do Jasper.
- O aplicativo deverá conter o que segue:
java_import Java::net::sf::jasperreports::engine::xml::JRXmlLoader java_import Java::net::sf::jasperreports::engine::JasperManager java_import Java::net::sf::jasperreports::engine::JasperExportManager java_import Java::net::sf::jasperreports::engine::JasperFillManager java_import Java::net::sf::jasperreports::engine::query::JRXPathQueryExecuterFactory java_import Java::net::sf::jasperreports::engine::util::JRXmlUtils java_import Java::net::sf::jasperreports::engine::util::JRLoader java_import Java::net::sf::jasperreports::engine::util::xml::JRXPathExecuterFactory arquivo = '<seu_relatorio>.jasper' string = File.read('<dados_para_o_relatorio>.xml') documento = JRXmlUtils.parse( Java::org.xml.sax::InputSource.new( Java::java::io::StringReader.new(string) ) ) params = { JRXPathQueryExecuterFactory::PARAMETER_XML_DATA_DOCUMENT => documento } fill = JasperFillManager.fill_report(arquivo, params) pdf = JasperExportManager.export_report_to_pdf(fill) File.open('<relatorio>.pdf', 'wb') do |arq| arq.print(String.from_java_bytes(pdf)) end
Substitua as “tags” pelos seus arquivos, obviamente. Basicamente, o programa lê o arquivo de relatório, lê o arquivo de dados (os dados que você quer passar ao relatório, em formato XML), preenche o relatório (com o FILL) e depois cria um arquivo .pdf. A grande vantagem do Jasper é que ele suporta arquivos de Word, PDF, Excel, CSV, XML, e mais um monte de formatos. Até o momento eu consegui montar um pequeno projeto, aonde você coloca seus relatórios num diretório específico, e com uma chamada (GET) ele monta um relatório… o projeto está hospedado no meu github (http://github.com/mauricioszabo/jasper_on_rails). Alguém conhece algum plugin/aplicativo Rails que permite acessar uma pasta qualquer como se fosse um daqueles “discos virtuais”?
4 Comments
Eleudson · 2009-11-07 at 13:50
Maurício, legal seu post, principalmente porque também estamos integrando o Jasper com JRuby.
Uma dúvida que tenho é como você configura o relatório no iReport para receber e utilizar os dados em XML. Você pode me ajudar?
Maurício Szabo · 2009-11-16 at 20:28
Bom, é bem simples na verdade: basta criar um relatório, e no relatório tem uma opção Language for dataset query. Basta colocar xPath, e na configuração de DataSources escolher XML Datasource.
Para buscar os dados no XML você precisa usar xPath, procura no w3schools.com que lá tem uns tutoriais.
Wander · 2010-09-09 at 12:28
Ola, legal a possibilidade de utilizar jasper com rails. Mas nao entendi se o seu projeto no github funciona como plugin ou apenas eh um codigo de exemplo,
nao entendi tambem como passar os dados de parametro para o relatorio, no caso do exemplo alunos.xml
grato,
Wander
Paulo C. D. · 2010-12-06 at 13:32
Maurício
Como posso colocar o código para que este leia a url do xml em vez de um arquivo na raiz.
string = File.read(‘.xml’)
Trocar este File.read para a url, ex.: localhosta:3000/customers.xml
Comments are closed.