搜索
首页Javajava教程JasperReports库的基本介绍

1。简介
在实践中,我们看到以某种格式统计和导出数据的请求是很常见的。例如,我们收到导出客户统计报告、销售发票、采购发票等的请求,这需要人们(尤其是程序员)创建软件,您可以根据每个具体情况和要求灵活创建导出数据的模板。你可能立刻想到的解决方案是使用Word、Excel……,但是这种解决方案不适合大量不断变化、短时间内发展的数据,同时还需要支付软件费用和数据处理时间不是最佳的。
目前有一个相当流行的解决方案——很多程序员都喜欢使用的JasperReports库。
特别是,这个库是开源的,并且有免费版本。您可以访问其源代码:https://github.com/TIBCOSoftware/jasperreports

2。使用说明
关于如何使用这个库网上有很多说明,这里就不详细写了
如果您使用 Eclipse,JasperReports 有一个额外的插件可以帮助您创建报告模板。
在这篇文章中,我将指导您在IntelliJ IDEA上使用它,库管理器是maven。
首先,您需要一个模板来填写数据(如订单、发票等)。为此,请下载并安装 Jaspersoft Studio 软件(最新的社区版本链接当前为 https://community.jaspersoft.com/files/file/19-jaspersoft®-studio-community-edition /?do=getNewComment)。
安装并打开后,软件会有如下界面:

Giới thiệu căn bản về thư viện JasperReports

要创建新模板,请转到文件 ->新->贾斯珀报告。在“全部”部分中,选择“空白 A4”(或您喜欢的其他模板:>)。

Giới thiệu căn bản về thư viện JasperReports

单击“下一步”,指定文件的保存位置。点击下一步->下一步->结束。出现的新界面是模板界面,您可以根据自己的模板自由设计。

Giới thiệu căn bản về thư viện JasperReports

右侧是库支持的对象。

Giới thiệu căn bản về thư viện JasperReports

假设我必须创建一个带有标题和商品名称的简单购买发票表格。我将“静态文本”对象拖放到模板中,并输入名称“采购发票”(您可以在屏幕右上角自行调整格式)。
接下来,我再拖动 2 个类似的对象,但将项目类别设置在“书籍”和“钢笔”下方。
接下来我必须添加这 2 件商品的价格。这个值是动态的,所以我必须在这里包含一个变量(这也是这个库的一个非常有趣和灵活的功能)。在大纲部分、参数部分中,右键单击并选择“创建参数”。然后我在右角窗口修改了这个变量的值,变量名为book,数据类型为实数。

Giới thiệu căn bản về thư viện JasperReports

然后我将其拖放到“Book”标签旁边。与变量“笔”和总量相同。这里你可以分配的总金额等于变量“book”和“pen”的总和。
完成模板后,它会是这样的

Giới thiệu căn bản về thư viện JasperReports

您切换到源选项卡,这是系统将处理的数据。基本上,Jasper Report 将以类似于 XML 的文件格式接收输入数据,但标签名称将由库预先定义。例如,整个文件的超类的开始和结束标记必须是“jasperReport”标记。以下是一些必须注意的模板符号:

  • “$P{}”:动态添加到报表中的数据,可以是键值对,可以是数据源。
  • “$F{}”:从数据源添加到报告的复杂数据字段。
  • “$V{}”:根据现有表达式自动生成数据或手动添加数据。 ... 您可以参考更多信息(https://www.tutorialspoint.com/jasper_reports/jasper_report_expression.htm)

完成后,您可以开始将此文件复制到您的项目中以填充数据并进行处理。
然后继续导入以下库:

    <dependency>
      <groupid>net.sf.jasperreports</groupid>
      <artifactid>jasperreports</artifactid>
      <version>6.21.0</version>
    </dependency>

    <dependency>
      <groupid>net.sf.jasperreports</groupid>
      <artifactid>jasperreports-fonts</artifactid>
      <version>6.21.0</version>
    </dependency>

继续编写代码导入文件并填充数据。

final String outputFilename = "report.pdf";
Files.deleteIfExists(new File(outputFilename).toPath());
InputStream inputStream = Main.class.getResourceAsStream("/report.jrxml");
Map<string object> parameters = new HashMap();
parameters.put("book", 55000);
parameters.put("pen", 11111.1111);
JasperReport jasperReport = JasperCompileManager.compileReport(inputStream);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilename);
</string>

这里,因为我们直接填充,所以可以使用Map类。如果你想从数据源(Database,...)填充数据,可以参考(https://www.baeldung.com/spring-jasper)。
结果如下

Giới thiệu căn bản về thư viện JasperReports

3。安全编程
因为在渲染这个模板的过程中,库也会执行其中的函数,所以如果用户可以自定义模板标签,攻击者就会添加可以执行命令的恶意标签。此错误与 SSTI 非常相似。
假设允许用户直接编辑模板。源码如下:

final String outputFilename = "out.pdf";
Files.deleteIfExists(new File(outputFilename).toPath());
String input = "";
String template = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<jasperreport xmlns='\"http://jasperreports.sourceforge.net/jasperreports\"' xmlns:xsi='\"http://www.w3.org/2001/XMLSchema-instance\"' xsi:schemalocation='\"http://jasperreports.sourceforge.net/jasperreports' http: name='\"z\"' pagewidth='\"500\"' pageheight='\"1200\"' columnwidth='\"270\"'>\n" + input + "</jasperreport>";
InputStream inputStream = new ByteArrayInputStream(template.getBytes());
JasperReport jasperReport = JasperCompileManager.compileReport(inputStream);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(jasperPrint, outputFilename);

攻击者填充恶意函数来控制系统:

字符串输入=“



<p>结果,命令被执行。文件“out.pdf”包含以下内容:</p>

<p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173597147572303.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Giới thiệu căn bản về thư viện JasperReports"></p>

<p>所以程序员也必须小心,不要让用户直接在模板中输入内容。<br>
另外,该库在旧版本中也存在漏洞(<em>CVE-2018-18809、CVE-2022-42889</em>、...),编程时应注意使用最新版本并更新。定期。</p>


          

            
        

以上是JasperReports库的基本介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Java平台独立性:这对开发人员意味着什么?Java平台独立性:这对开发人员意味着什么?May 08, 2025 am 12:27 AM

Java'splatFormIndependecemeansDeveloperScanWriteCeandeCeandOnanyDeviceWithouTrecompOlding.thisAcachivedThroughThroughTheroughThejavavirtualmachine(JVM),WhaterslatesbyTecodeDecodeOdeIntComenthendions,允许univerniverSaliversalComplatibilityAcrossplatss.allospplats.s.howevss.howev

如何为第一次使用设置JVM?如何为第一次使用设置JVM?May 08, 2025 am 12:21 AM

要设置JVM,需按以下步骤进行:1)下载并安装JDK,2)设置环境变量,3)验证安装,4)设置IDE,5)测试运行程序。设置JVM不仅仅是让其工作,还包括优化内存分配、垃圾收集、性能调优和错误处理,以确保最佳运行效果。

如何查看产品的Java平台独立性?如何查看产品的Java平台独立性?May 08, 2025 am 12:12 AM

toensurejavaplatFormIntence,lofterTheSeSteps:1)compileAndRunyOpplicationOnmultPlatFormSusiseDifferenToSandjvmversions.2)upureizeci/cdppipipelinelikeinkinslikejenkinsorgithikejenkinsorgithikejenkinsorgithikejenkinsorgithike forautomatecross-plateftestesteftestesting.3)

Java的现代发展功能:实用概述Java的现代发展功能:实用概述May 08, 2025 am 12:12 AM

javastandsoutsoutinmoderndevelopmentduetoitsrobustfeatureslikelambdaexpressions,streams,andenhanced concurrencysupport.1)lambdaexpressionssimplifyfunctional promprogientsmangional programmanging,makencodemoreconciseandable.2)

掌握Java:了解其核心功能掌握Java:了解其核心功能May 07, 2025 pm 06:49 PM

Java的核心特点包括平台独立性、面向对象设计和丰富的标准库。1)面向对象设计通过多态等特性使得代码更加灵活和可维护。2)垃圾回收机制解放了开发者的内存管理负担,但需要优化以避免性能问题。3)标准库提供了从集合到网络的强大工具,但应谨慎选择数据结构以保持代码简洁。

爪哇可以到处跑吗?爪哇可以到处跑吗?May 07, 2025 pm 06:41 PM

Yes,Javacanruneverywhereduetoits"WriteOnce,RunAnywhere"philosophy.1)Javacodeiscompiledintoplatform-independentbytecode.2)TheJavaVirtualMachine(JVM)interpretsorcompilesthisbytecodeintomachine-specificinstructionsatruntime,allowingthesameJava

JDK和JVM有什么区别?JDK和JVM有什么区别?May 07, 2025 pm 05:21 PM

jdkincludestoolsfordevelveping and compilingjavacode,whilejvmrunsthecompiledbytecode.1)jdkcontainsjre,编译器和授权。2)

Java功能:快速指南Java功能:快速指南May 07, 2025 pm 05:17 PM

Java的关键特性包括:1)面向对象设计,2)平台独立性,3)垃圾回收机制,4)丰富的库和框架,5)并发支持,6)异常处理,7)持续演进。Java的这些特性使其成为开发高效、可维护软件的强大工具。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。