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)。
安装并打开后,软件会有如下界面:
要创建新模板,请转到文件 ->新->贾斯珀报告。在“全部”部分中,选择“空白 A4”(或您喜欢的其他模板:>)。
单击“下一步”,指定文件的保存位置。点击下一步->下一步->结束。出现的新界面是模板界面,您可以根据自己的模板自由设计。
右侧是库支持的对象。
假设我必须创建一个带有标题和商品名称的简单购买发票表格。我将“静态文本”对象拖放到模板中,并输入名称“采购发票”(您可以在屏幕右上角自行调整格式)。
接下来,我再拖动 2 个类似的对象,但将项目类别设置在“书籍”和“钢笔”下方。
接下来我必须添加这 2 件商品的价格。这个值是动态的,所以我必须在这里包含一个变量(这也是这个库的一个非常有趣和灵活的功能)。在大纲部分、参数部分中,右键单击并选择“创建参数”。然后我在右角窗口修改了这个变量的值,变量名为book,数据类型为实数。
然后我将其拖放到“Book”标签旁边。与变量“笔”和总量相同。这里你可以分配的总金额等于变量“book”和“pen”的总和。
完成模板后,它会是这样的
您切换到源选项卡,这是系统将处理的数据。基本上,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)。
结果如下
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中文网其他相关文章!

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

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

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

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

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

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

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

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


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

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

WebStorm Mac版
好用的JavaScript开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

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

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