网站网络推广能优化,全国互联网安全管理服务平台官网,公司做网站的费用记什么科目,wordpress增加备案用一个程序生成另一个程序如果您具有业务应用程序开发的经验#xff0c;那么很可能会遇到要求该应用程序具有灵活的报告机制的需求。 我工作的公司主要专注于开发业务解决方案#xff0c;而报告是必不可少的#xff0c;实际上#xff0c;它必须包含我们开发的所有企业系统的… 用一个程序生成另一个程序 如果您具有业务应用程序开发的经验那么很可能会遇到要求该应用程序具有灵活的报告机制的需求。 我工作的公司主要专注于开发业务解决方案而报告是必不可少的实际上它必须包含我们开发的所有企业系统的方面。 为了在我们的系统中实现灵活的报告我们开发了自己的开源报告生成器-YARG 又一次获得了另一个报告生成器以Apache 2.0许可分发。 现在YARG是CUBA平台报告的核心-CUBA 平台本身就是我们开发的所有系统的基础。 为什么需要开发一个新的 首先让我指出我们不是车轮发明家。 只要这些解决方案适合我们我们就一直在寻找与之集成的解决方案。 不幸的是在这种情况下我们找不到符合我们确定的以下要求的任何开源工具 以模板格式生成报告和/或将输出转换为PDF 避免使用外部工具来创建报告模板Microsoft Office或Libreoffice应该足够了 支持各种格式的模板 DOCODTXLSDOCXXLSXHTML 能够将复杂的XLS和XLSX模板与图表公式等配合使用。 能够使用HTML布局和插入/嵌入图像 拆分出数据层报告结构和数据获取和表示层报告模板 启用各种数据获取方法例如SQLJPQL或Groovy脚本 与IoC框架 Spring Guice 集成的能力 将该工具用作独立应用程序的功能以便能够在Java生态系统之外使用它例如使用PHP生成报告 以透明XML格式存储报告结构 我们可以找到的最接近的工具是JasperReports 但是有一些阻止程序使我们无法使用它 免费版本无法生成DOC报告有一个提供此功能的商业库 XLS报告非常有限无法使用图表公式和单元格格式 要创建报告必须具有一定的技能和知识以及如何使用非常特定的工具例如iReports 数据层和表示层之间没有明确的分隔 当然我们研究了许多其他不同的工具但是我们发现的所有其他库都集中在某种特定格式上。 我们希望有一个万能的报表功能-一种用于所有报表的工具。 考虑到以上列出的所有观点和想法我们决定开发另一种定制的报告生成工具。 什么是内幕 当我们开始YARG时找到用于XLS集成的库 POI-HSSF JXLS等不是问题。 我们决定选择Apache POI作为最受欢迎和受支持的库。 DOC集成的情况则完全相反。 在开源市场上只有很少的选择 POI-HWPF COM和UNO Runtime 。 POI-HWPF库在许多方面都非常有限我们认为它不是合适的选择。 我们必须在COM和UNO运行时之间进行选择这实际上是用于OpenOffice服务器端集成的API。 因此经过深入调查我们决定选择UNO Runtime 主要是因为成功将其用于以完全不同的语言例如PythonRubyC等编码的系统的人们的积极反馈。 尽管POI-HSSF的使用非常简单图表除外但我们在集成UNO Runtime时面临许多挑战 没有明确的API可用于表格 每次生成报告时OpenOffice都会启动。 最初我们使用bootstrapconnector来管理OpenOffice进程但是后来很明显在很多情况下它不会在生成报告后终止该进程。 因此我们不得不重新实现OpenOffice启动和关闭的逻辑感谢jodconverter开发人员他们在此问题上指出了许多好主意 另外 UNO Runtime 和OpenOffice Server本身在线程安全方面也存在严重问题如果发生内部错误这可能导致服务器冻结或终止自身。 为了克服这个问题我们必须实现一种机制以便在服务器发生故障时重新启动报告这显然会对性能造成不利影响 后来当DOCX4J库变得非常成熟和流行时我们支持XLSX / DOCX。 DOCX4J库的主要优点是它提供了对文档结构的必要的低级访问基本上您使用XML进行操作。 使用DOCX4J的另一个好处是它不需要OpenOffice服务器集成即可生成DOCX报告。 另外还可以使用带有Freemarker标记的文档作为报告模板。 我们通常使用它生成非常自定义的HTML报表然后将结果转换为PDF 。 最后YARG基础结构是以可扩展的方式开发的因此有经验的用户可以自己实现与任何其他模板类型的集成。 你好世界报告 让我们认识一下YARG。 报告生成器的主要思想是将数据层和表示层分开。 数据层使脚本编制或直接SQL查询能够获取所需的信息而表示层则代表所获取数据的标记。 YARG的所有报告均由所谓的“乐队”组成 。 带是将数据和表示层链接在一起的东西。 因此每个乐队都知道从何处获取数据以及将数据放置在模板中的位置。 例如我们想将所有员工打印到Excel电子表格中。 我们将需要创建“ Staff”乐队并定义一个SQL查询以获取员工列表 select name, surname, position from staff Java代码 ReportBuilder reportBuilder new ReportBuilder();
ReportTemplateBuilder reportTemplateBuilder new ReportTemplateBuilder().documentPath(/home/haulmont/templates/staff.xls).documentName(staff.xls).outputType(ReportOutputType.xls).readFileFromPath();
reportBuilder.template(reportTemplateBuilder.build());
BandBuilder bandBuilder new BandBuilder();
ReportBand staff bandBuilder.name(Staff).query(Staff, select name, surname, position from staff, sql).build();
reportBuilder.band(staff);
Report report reportBuilder.build();Reporting reporting new Reporting();
reporting.setFormatterFactory(new DefaultFormatterFactory());
reporting.setLoaderFactory(new DefaultLoaderFactory().setSqlDataLoader(new SqlDataLoader(datasource)));ReportOutputDocument reportOutputDocument reporting.runReport(new RunParams(report), new FileOutputStream(/home/haulmont/reports/staff.xls)); 剩下的唯一事情就是创建XLS模板 开始了 只需运行该程序即可享受结果 没有Java的进阶范例 假设我们有一个书店网络。 需要生成一个XLS报告其中显示了已售书的列表并参考了售书的书店。 此外我们没有Java开发人员只有拥有XML和SQL基本技能的系统管理员。 首先我们需要为报告创建XLS模板 如您所见我们定义了两个命名区域对应于乐队商店蓝色和书籍实例白色。 现在我们必须从数据库中获取所需的数据 select shop.id as id, shop.name as name, shop.address as address
from store shopselect book.author as author, book.name as name, book.price as price, count(*) as count
from book book where book.store_id ${Shop.id}
group by book.author, book.name, book.price 最后我们使用XML声明报告的波段结构 ?xml version1.0 encodingUTF-8?
report namereporttemplatestemplate codeDEFAULT documentNamebookstore.xls documentPath./test/sample/bookstore/bookstore.xls outputTypexls outputNamePatternbookstore.xls//templatesrootBand nameRoot orientationHbandsband nameHeader orientationH/band nameShop orientationHbandsband nameBook orientationHqueriesquery nameBook typesqlscriptselect book.author as author, book.name as name, book.price as price, count(*) as count from book where book.store_id ${Shop.id} group by book.author, book.name, book.price/script/query/queries/band/bandsqueriesquery nameShop typesqlscriptselect shop.id as id, shop.name as name, shop.address as address from store shop/script/query/queries/band/bandsqueries//rootBand
/report 让我们启动报告并查看结果下面的“ 独立”部分描述了如何运行报告 该用例表明您可以引用父带book.store_id $ {Shop.id}。 这使我们能够过滤每个特定书店出售的书籍。 一个更高级的例子 现在我们创建一个发票报告。 我们将创建DOCX文档然后将其转换为不可变形式– PDF文档。 为了说明如何加载数据的另一种方式我们将使用groovy脚本而不是直接SQL查询 ?xml version1.0 encodingUTF-8?
report namereporttemplatestemplate codeDEFAULT documentNameinvoice.docx documentPath./test/sample/invoice/invoice.docx outputTypepdf outputNamePatterninvoice.pdf//templatesformatsformat nameMain.date formatdd/MM/yyyy/format nameMain.signature format${html}//formatsrootBand nameRoot orientationHbandsband nameMain orientationHqueriesquery nameMain typegroovyscriptreturn [[invoiceNumber:99987,client : Google Inc.,date : new Date(),addLine1: 1600 Amphitheatre Pkwy,addLine2: Mountain View, USA,addLine3:CA 94043,signature:![CDATA[htmlbodybfont colorredMr. Yarg/font/b/body/html]]]]/script/query/queries/bandband nameItems orientationHqueriesquery nameMain typegroovyscriptreturn [[name:Java Concurrency in practice, price : 15000],[name:Clear code, price : 13000],[name:Scala in action, price : 12000]]/script/query/queries/band/bandsqueries//rootBand
/report 您可能已经注意到Groovy脚本返回List Map StringObject 对象。 因此每个项目都表示为一个键参数名称和值参数值。 最后我们将需要创建一个DOCX模板 要将底部表格链接到书籍列表我们使用## band Items标记。 生成报告后我们得到以下输出 IoC框架集成 如前所述要求之一是提供集成到IoC框架 Spring Guice 的能力。 我们将YARG用作CUBA平台我们用于企业应用程序开发的高级Java框架中强大的报告引擎的一部分。 CUBA采用Spring作为IoC机制让我们看一下YARG如何集成到平台中 bean idreporting_lib_Scripting classcom.haulmont.reports.libintegration.ReportingScriptingImpl/
bean idreporting_lib_GroovyDataLoader classcom.haulmont.yarg.loaders.impl.GroovyDataLoaderconstructor-arg refreporting_lib_Scripting/
/bean
bean idreporting_lib_SqlDataLoader classcom.haulmont.yarg.loaders.impl.SqlDataLoaderconstructor-arg refdataSource/
/bean
bean idreporting_lib_JpqlDataLoader classcom.haulmont.reports.libintegration.JpqlDataDataLoader/
bean idreporting_lib_OfficeIntegrationclasscom.haulmont.reports.libintegration.CubaOfficeIntegrationconstructor-arg value${cuba.reporting.openoffice.path?:/}/constructor-arglistvalue8100/valuevalue8101/valuevalue8102/valuevalue8103/value/list/constructor-argproperty namedisplayDeviceAvailablevalue${cuba.reporting.displayDeviceAvailable?:false}/value/propertyproperty nametimeoutInSecondsvalue${cuba.reporting.openoffice.docFormatterTimeout?:20}/value/property
/bean
bean idreporting_lib_FormatterFactoryclasscom.haulmont.yarg.formatters.factory.DefaultFormatterFactoryproperty nameofficeIntegration refreporting_lib_OfficeIntegration/
/bean
bean idreporting_lib_LoaderFactory classcom.haulmont.yarg.loaders.factory.DefaultLoaderFactoryproperty namedataLoadersmapentry keysql value-refreporting_lib_SqlDataLoader/entry keygroovy value-refreporting_lib_GroovyDataLoader/entry keyjpql value-refreporting_lib_JpqlDataLoader//map/property
/bean
bean idreporting_lib_Reporting classcom.haulmont.yarg.reporting.Reportingproperty nameformatterFactory refreporting_lib_FormatterFactory/property nameloaderFactory refreporting_lib_LoaderFactory/
/bean 为了将YARG集成到Spring Framework中应注册以下bean reporting_lib_Reporting –提供对核心报告生成功能的访问。 report_lib_FormatterFactory –将输出管理为不同的格式DOCXXSLXDOC等 reporting_lib_LoaderFactory –提供数据加载功能包含与不同源相对应的多个Bean reporting_lib_OfficeIntegration –将报表生成器与OpenOffice服务器集成生成DOC和ODT报表所需 如您所见YARG可以轻松地嵌入到您的应用程序中。 独立使用 YARG的另一个重要功能是可以用作独立应用程序。 从技术上讲如果已安装JRE则可以从命令提示符下运行报告生成器。 例如如果您有服务器端PHP应用程序并且想在应用程序中启用报告则只需创建一个XLS模板以XML声明报告结构然后从命令提示符下启动YARG yarg -rp ~/report.xml -op ~/result.xls “-Pparam120/04/2014”CUBA平台提供的更多功能 YARG已深度集成到CUBA平台中并充当该平台中实现的强大报告机制的核心引擎。 首先您可以使用CUBA Studio一键式嵌入报告 此处提供只读演示版 CUBA为报表管理提供了方便的用户界面 报告浏览器带有导入/导出和运行报告的选项。 报告编辑器允许您创建任何复杂性的报告定义带输入参数管理模板使用GroovySQL和JPQL选择数据 CUBA引入了报告向导功能。 借助向导即使对编程的了解有限任何用户都可以快速创建报告 总结这篇文章让我跳过通常无聊的深层思考特别是因为可以在此处找到所有信息并提出了一些我最喜欢的报告 因此如果您有兴趣请点击链接并了解更多信息 请注意YARG是完全免费的可以在GitHub上使用 。 翻译自: https://www.javacodegeeks.com/2015/09/yet-another-report-generator.html用一个程序生成另一个程序