JasperReports与Java集成: 如何在Java项目中使用JasperReports

发布时间: 2023-12-20 16:18:21 阅读量: 659 订阅数: 35
# 1. 简介 ## 1.1 介绍JasperReports和其在Java项目中的应用 JasperReports是一个开源的Java报表生成库,可以用于在Java应用程序中创建和展示各种类型的报表。它使用XML定义报表的布局和样式,并通过填充数据源生成最终的报表。JasperReports提供了丰富的功能,使开发人员可以在生成报表时进行高度定制和控制。 在Java项目中,使用JasperReports可以轻松地生成各种类型的报表,如表格、图表、条形码等等。无论是生成PDF、Excel、HTML还是打印输出,都可以实现。 ## 1.2 目标读者群体 本文适合具备一定的Java编程知识和基础的开发人员,特别是那些希望了解如何使用JasperReports在Java项目中生成报表的人员。读者应该对Java编程语言、XML和SQL有一定的了解。 ## 1.3 本文概述 本文将介绍JasperReports在Java项目中的基本应用和使用方法。首先,我们将向您展示如何安装和配置JasperReports库到您的Java项目中。然后,我们将详细介绍如何创建JasperReports模板,包括模板的结构、使用iReport设计器创建模板以及设计模板的布局和样式。接下来,我们将探讨如何在Java项目中使用JasperReports生成报表,包括创建JasperReports引擎、填充数据到模板中以及导出生成的报表。此外,我们还将介绍一些高级特性和定制化选项,如子报表、多页面报表以及导出选项和格式定制等。最后,我们将分享一些最佳实践和常见问题解决方法,帮助您在使用JasperReports时更加高效和灵活。 本文将以简洁清晰的方式呈现相关代码示例,以帮助读者更好地理解和掌握JasperReports的使用方法。希望本文能够帮助读者快速上手并熟练使用JasperReports在Java项目中生成报表。 # 2. 安装和配置JasperReports JasperReports是一个流行的报表工具,可以在Java应用程序中方便地生成丰富多样的报表。本章将介绍如何下载、安装和配置JasperReports库,并将其集成到Java项目中。 ### 2.1 下载和安装JasperReports库 首先,我们需要从JasperReports官方网站(https://community.jaspersoft.com/project/jasperreports-library)下载最新版本的JasperReports库。下载完成后,解压缩文件,并将其中的JAR文件添加到Java项目的类路径中。 ### 2.2 配置JasperReports库到Java项目中 在Eclipse或IntelliJ IDEA等集成开发环境中,右键单击项目名称,选择“属性”或“Module Settings”,然后在“构建路径”或“依赖项”中添加JasperReports库的JAR文件。 如果是使用Maven进行项目构建,可以在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.17.0</version> <!-- 替换为你所下载的JasperReports版本号 --> </dependency> ``` ### 2.3 需要注意的常见配置问题和解决方法 在配置JasperReports库到Java项目中的过程中,可能会遇到一些常见的问题,比如版本冲突、依赖库缺失等。此时,可以通过查阅官方文档或在开发社区中寻求帮助来解决这些问题。另外,也可以通过调试和日志来定位并解决配置中的错误。 在下一章节中,我们将会介绍如何创建JasperReports模板,敬请期待! # 3. 创建JasperReports模板 在本章节中,我们将介绍如何创建JasperReports模板,包括模板的结构和特点,使用iReport设计器创建模板,以及数据源和参数的设置,还有模板布局和样式的设计。 #### 3.1 介绍JasperReports模板的结构和特点 JasperReports模板是以.jasper文件形式存在的报表模板,它定义了报表的布局和样式,以及数据源与参数的关联。模板的结构主要包括报表设计的元素(如文本框、图片、表格等)以及对应的数据字段,通过模板可以实现对报表的灵活设计和定制。 #### 3.2 使用iReport设计器创建JasperReports模板 iReport是一个强大的报表设计器工具,可以帮助我们轻松创建JasperReports模板。我们可以通过iReport的可视化界面来设计报表的布局、样式,设置数据源和参数,以及定义各种元素的属性,极大地简化了模板的创建过程。 以下是一个简单的iReport模板创建示例,用来展示员工基本信息的报表: ```java // 代码示例 public class EmployeeReport { public static void main(String[] args) { try { // 创建一个JasperReport模板文件 JasperDesign jasperDesign = new JasperDesign(); // 设置报表的属性和样式 // ... // 创建数据源 JRDataSource dataSource = new JREmptyDataSource(); // 编译模板 JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); // 填充数据并生成报表 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, dataSource); // 导出报表 JasperExportManager.exportReportToPdfFile(jasperPrint, "EmployeeReport.pdf"); System.out.println("报表生成成功!"); } catch (JRException e) { e.printStackTrace(); } } } ``` #### 3.3 数据源和参数设置 在模板创建过程中,我们需要设置报表的数据源和参数。数据源可以是各种数据类型,如数据库查询结果、JavaBean集合等,而参数则可以用来动态传递数据,实现报表的灵活性和可定制性。 以下是一个使用JavaBean数据源和参数的示例: ```java // 数据Bean类 public class Employee { private String name; private int age; // ... // 省略getter和setter方法 } // 填充数据到模板中 public class EmployeeReport { public static void main(String[] args) { try { // 创建一个JasperReport模板文件 JasperDesign jasperDesign = new JasperDesign(); // 设置报表的属性和样式 // ... // 创建JavaBean数据源 List<Employee> employeeList = new ArrayList<>(); // 添加员工数据到列表中 JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(employeeList); // 设置报表参数 Map<String, Object> parameters = new HashMap<>(); parameters.put("ReportTitle", "员工基本信息报表"); // 编译模板 JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); // 填充数据并生成报表 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, beanColDataSource); // 导出报表 JasperExportManager.exportReportToPdfFile(jasperPrint, "EmployeeReport.pdf"); System.out.println("报表生成成功!"); } catch (JRException e) { e.printStackTrace(); } } } ``` #### 3.4 设计模板布局和样式 在iReport设计器中,我们可以设置报表的布局和样式,包括文本框、图片、表格等元素的排版和样式,以及字体、颜色、边框等属性的设置。通过合理的布局和样式设计,可以使报表呈现出更加美观和直观的效果。 通过上述内容,我们详细介绍了如何创建JasperReports模板,并且展示了使用iReport设计器创建模板的示例,接下来我们将继续讨论在Java项目中使用JasperReports的相关内容。 # 4. 在Java项目中使用JasperReports 在前面的章节中,我们已经介绍了如何创建和配置JasperReports模板。接下来,我们将学习如何在Java项目中使用JasperReports引擎来生成报表并导出。 #### 4.1 创建JasperReports引擎 在使用JasperReports之前,我们首先需要创建一个JasperReports引擎。引擎是执行报表生成和导出的核心组件。 以下是在Java项目中创建JasperReports引擎的代码示例: ```java import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; public class ReportGenerator { public void generateReport() { try { // 编译JasperReports模板文件(.jrxml) String reportTemplate = "report_template.jrxml"; JasperCompileManager.compileReportToFile(reportTemplate); // 填充数据到模板中 String reportFile = "compiled_report.jasper"; JasperPrint jasperPrint = JasperFillManager.fillReport(reportFile, null, dataSource); // 导出生成的报表 String exportFile = "generated_report.pdf"; JasperExportManager.exportReportToPdfFile(jasperPrint, exportFile); System.out.println("报表生成并导出成功!"); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上述代码中,我们首先使用`JasperCompileManager`编译JasperReports模板文件(.jrxml)。然后,使用`JasperFillManager`填充数据到模板中,其中`null`表示没有任何参数传入。最后,使用`JasperExportManager`将报表导出为PDF文件。 #### 4.2 填充数据到模板中 前面的代码示例中,我们使用`JasperFillManager.fillReport()`方法将数据填充到模板中。为了能够成功地填充数据,我们需要提供一个数据源(dataSource),它可以是任何符合JasperReports要求的数据源,如SQL数据库、Java集合等。 以下是使用SQL数据库作为数据源填充数据到模板的示例代码: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; public class ReportGenerator { public void generateReport() { try { // 连接数据库 String jdbcDriver = "com.mysql.jdbc.Driver"; String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password"; Connection conn = DriverManager.getConnection(jdbcUrl, username, password); // 填充数据到模板中 String reportFile = "compiled_report.jasper"; Map<String, Object> params = new HashMap<>(); JasperPrint jasperPrint = JasperFillManager.fillReport(reportFile, params, conn); // 导出生成的报表 String exportFile = "generated_report.pdf"; JasperExportManager.exportReportToPdfFile(jasperPrint, exportFile); System.out.println("报表生成并导出成功!"); // 关闭数据库连接 conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 在上述代码中,我们首先通过`DriverManager`类建立与MySQL数据库的连接。然后,使用`JasperFillManager.fillReport()`方法填充数据到模板中,并传递了一个参数`params`用于传递参数到报表模板中。最后,使用`JasperExportManager.exportReportToPdfFile()`方法导出报表。 #### 4.3 导出生成的报表 完成数据填充后,我们可以使用`JasperExportManager.exportReportToPdfFile()`方法将生成的报表导出为PDF文件,也可以导出为其他格式,例如HTML、Excel等。 以下是导出为Excel文件的示例代码: ```java import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.export.JExcelApiExporter; import net.sf.jasperreports.export.SimpleExporterInput; import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput; public class ReportGenerator { public void generateReport() { try { // ... // 导出为Excel文件 String exportFile = "generated_report.xls"; JExcelApiExporter exporter = new JExcelApiExporter(); exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(exportFile)); exporter.exportReport(); System.out.println("报表生成并导出成功!"); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上述代码中,我们使用`JExcelApiExporter`来导出为Excel文件,并指定导出文件的路径。可以根据需要使用不同的`JRExporter`子类来实现不同格式的导出。 这就是在Java项目中使用JasperReports创建报表和导出的基本步骤。通过配置JasperReports模板和使用JasperReports引擎,我们可以轻松地生成各种格式的报表。 下一章,我们将介绍JasperReports的高级特性和定制化。敬请期待! # 5. 高级特性和定制化 JasperReports提供了一些高级特性和定制化选项,使得报表生成更加灵活和个性化。本章将介绍一些常用的高级特性和定制化方法。 ### 5.1 子报表和多页面报表 #### 子报表 子报表是在主报表中插入其他报表的一种方式,可以在一个报表中引用另一个报表的内容。这种模块化的设计可以实现报表的复用和组合,方便开发和维护。 在创建主报表时,可以使用iReport设计器将子报表插入到主报表中。在子报表数据源和参数设置完毕后,可以使用`<subreport>`标签将子报表插入到主报表的合适位置。在填充数据时,JasperReports会自动处理子报表的填充。 以下是一个使用子报表的示例代码: ```java String subreportPath = "path/to/subreport.jasper"; parameters.put("SUBREPORT_DIR", subreportPath); ``` #### 多页面报表 JasperReports支持生成包含多个页面的报表。可以通过设置页码和分页规则来实现多页面报表的创建。 在设计模板时,可以使用iReport设计器中的分页选项来设置分页规则。示例代码如下: ```java JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource); jasperPrint.setPageNumber(pageNumber); // 设置页码 jasperPrint.setPageWidth(pageWidth); // 设置页面宽度 jasperPrint.setPageHeight(pageHeight); // 设置页面高度 ``` ### 5.2 导出选项和格式定制 JasperReports允许将报表导出为多种格式,如PDF、Excel、HTML等。可以根据项目的需求选择合适的导出格式。 可以使用`JasperExportManager`类中的方法来实现报表的导出。以下是一个导出为PDF格式的示例代码: ```java JasperExportManager.exportReportToPdfFile(jasperPrint, "path/to/output.pdf"); ``` 可以通过设置导出选项和格式定制来满足不同的需求。例如,可以设置是否显示导出选项界面、是否压缩文件、是否显示打印对话框等等。示例代码如下: ```java JRExporter exporter = new JRPdfExporter(); exporter.setParameter(JRPdfExporterParameter.PDF_JAVASCRIPT, "this.print();"); // 设置打印JavaScript exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new File("path/to/output.pdf")); exporter.exportReport(); ``` ### 5.3 使用JasperReports API进行更高级的定制开发 除了使用iReport设计器和基础的API,JasperReports还提供了更高级的定制开发选项。可以使用JasperReports的API来实现自定义数据源、自定义组件、自定义表达式等等。 通过实现相关接口和方法,可以根据项目的需求进行更高级的报表定制开发。以下是一个使用自定义数据源的示例代码: ```java public class CustomDataSource implements JRDataSource { // 实现自定义数据源的相关方法 } CustomDataSource dataSource = new CustomDataSource(); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource); ``` JasperReports的API提供了丰富的功能和选项,可以根据项目的需要进行灵活的定制开发。 ## 总结与展望 本章介绍了JasperReports的高级特性和定制化方法,包括子报表和多页面报表的使用、导出选项和格式定制以及使用API进行更高级的定制开发。通过灵活运用这些特性和方法,可以满足不同项目的需求,并实现个性化的报表生成。在接下来的章节中,将介绍一些最佳实践和解决常见问题的方法,帮助读者更好地应用JasperReports。 # 6. 最佳实践和常见问题解决 在使用JasperReports和Java集成的过程中,有一些最佳实践和常见问题需要我们关注和解决。本节将分享一些最佳实践,并总结一些常见问题的解决方案,帮助您更好地应用JasperReports于您的Java项目中。 #### 6.1 最佳实践分享 在使用JasperReports时,有一些最佳实践可以帮助我们更高效地创建和集成报表功能到Java项目中: - **合理的数据源选择**:根据项目实际需求和数据规模,选择合适的数据源,如数据库查询、JavaBean集合等。 - **模板设计的灵活性**:设计模板时要考虑不同输出格式和布局的灵活性,以适应不同的打印和导出需求。 - **充分利用参数和变量**:合理使用参数和变量,可以使报表生成的结果更加灵活和可定制。 - **定期维护和更新模板**:定期检查和更新报表模板,以适应业务需求的变化和优化报表性能。 #### 6.2 常见问题及解决方案汇总 在使用JasperReports过程中,可能会遇到一些常见问题,下面是一些常见问题的解决方案汇总: - **中文乱码**:在导出PDF格式报表时出现乱码,可在导出时设置字体为支持中文的TrueType字体。 - **报表性能问题**:当报表数据量较大时,可以通过优化查询语句、使用报表数据集缓存等方式来提升报表生成性能。 - **报表模板无法加载**:检查模板文件路径是否正确,以及文件是否存在等问题。 #### 6.3 总结与展望 通过本文的学习,我们了解了如何在Java项目中使用JasperReports,包括安装配置、模板设计、数据填充以及高级特性和定制化等内容。同时,我们也总结了一些最佳实践和常见问题的解决方案,希望能对您的实际应用提供帮助。在未来,JasperReports在Java项目中的应用将更加广泛,也期待它能为我们带来更多的便利和创新。
corwn 最低0.47元/天 解锁专栏
买1年送3个月
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

SW_孙维

开发技术专家
知名科技公司工程师,开发技术领域拥有丰富的工作经验和专业知识。曾负责设计和开发多个复杂的软件系统,涉及到大规模数据处理、分布式系统和高性能计算等方面。
专栏简介
JasperReports专栏是一个介绍和教授使用JasperReports报表工具的系列文章。从初步了解JasperReports的简介和使用开始,到如何在Java项目中集成JasperReports,以及制作简单的报表模板和连接数据库等方面的内容,本专栏涵盖了广泛的主题。还包括如何传递参数、管理报表数据、添加图表元素、创建复杂报表以及实现国际化等更高级的技巧。此外,专栏还介绍了如何在Spring框架和微服务架构中使用JasperReports,并利用JasperReports创建RESTful API。此外,还探讨了报表的导出、打印设置以及定时生成和邮件发送等自动化功能。专栏还涵盖了自定义字体和样式的使用、条件格式化、分页和分组报表设计、子报表和嵌套设计以及脚本编写等高级技术。通过该专栏,读者将能全面掌握使用JasperReports创建强大报表的技能,拓展报表功能,提高报表的质量和效率。
最低0.47元/天 解锁专栏
买1年送3个月
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

【数据清洗艺术】:R语言density函数在数据清洗中的神奇功效

![R语言数据包使用详细教程density](https://raw.githubusercontent.com/rstudio/cheatsheets/master/pngs/thumbnails/tidyr-thumbs.png) # 1. 数据清洗的必要性与R语言概述 ## 数据清洗的必要性 在数据分析和挖掘的过程中,数据清洗是一个不可或缺的环节。原始数据往往包含错误、重复、缺失值等问题,这些问题如果不加以处理,将严重影响分析结果的准确性和可靠性。数据清洗正是为了纠正这些问题,提高数据质量,从而为后续的数据分析和模型构建打下坚实的基础。 ## R语言概述 R语言是一种用于统计分析

【保险行业extRemes案例】:极端值理论的商业应用,解读行业运用案例

![R语言数据包使用详细教程extRemes](https://static1.squarespace.com/static/58eef8846a4963e429687a4d/t/5a8deb7a9140b742729b5ed0/1519250302093/?format=1000w) # 1. 极端值理论概述 极端值理论是统计学的一个重要分支,专注于分析和预测在数据集中出现的极端情况,如自然灾害、金融市场崩溃或保险索赔中的异常高额索赔。这一理论有助于企业和机构理解和量化极端事件带来的风险,并设计出更有效的应对策略。 ## 1.1 极端值理论的定义与重要性 极端值理论提供了一组统计工具,

【R语言t.test实战演练】:从数据导入到结果解读,全步骤解析

![【R语言t.test实战演练】:从数据导入到结果解读,全步骤解析](http://healthdata.unblog.fr/files/2019/08/sql.png) # 1. R语言t.test基础介绍 统计学是数据分析的核心部分,而t检验是其重要组成部分,广泛应用于科学研究和工业质量控制中。在R语言中,t检验不仅易用而且功能强大,可以帮助我们判断两组数据是否存在显著差异,或者某组数据是否显著不同于预设值。本章将为你介绍R语言中t.test函数的基本概念和用法,以便你能快速上手并理解其在实际工作中的应用价值。 ## 1.1 R语言t.test函数概述 R语言t.test函数是一个

【R语言统计推断】:ismev包在假设检验中的高级应用技巧

![R语言数据包使用详细教程ismev](https://www.lecepe.fr/upload/fiches-formations/visuel-formation-246.jpg) # 1. R语言与统计推断基础 ## 1.1 R语言简介 R语言是一种用于统计分析、图形表示和报告的编程语言和软件环境。由于其强大的数据处理能力、灵活的图形系统以及开源性质,R语言被广泛应用于学术研究、数据分析和机器学习等领域。 ## 1.2 统计推断基础 统计推断是统计学中根据样本数据推断总体特征的过程。它包括参数估计和假设检验两大主要分支。参数估计涉及对总体参数(如均值、方差等)的点估计或区间估计。而

R语言prop.test应用全解析:从数据处理到统计推断的终极指南

![R语言数据包使用详细教程prop.test](https://media.geeksforgeeks.org/wp-content/uploads/20220603131009/Group42.jpg) # 1. R语言与统计推断简介 统计推断作为数据分析的核心部分,是帮助我们从数据样本中提取信息,并对总体进行合理假设与结论的数学过程。R语言,作为一个专门用于统计分析、图形表示以及报告生成的编程语言,已经成为了数据科学家的常用工具之一。本章将为读者们简要介绍统计推断的基本概念,并概述其在R语言中的应用。我们将探索如何利用R语言强大的统计功能库进行实验设计、数据分析和推断验证。通过对数据的

R语言数据分析高级教程:从新手到aov的深入应用指南

![R语言数据分析高级教程:从新手到aov的深入应用指南](http://faq.fyicenter.com/R/R-Console.png) # 1. R语言基础知识回顾 ## 1.1 R语言简介 R语言是一种开源编程语言和软件环境,特别为统计计算和图形表示而设计。自1997年由Ross Ihaka和Robert Gentleman开发以来,R已经成为数据科学领域广受欢迎的工具。它支持各种统计技术,包括线性与非线性建模、经典统计测试、时间序列分析、分类、聚类等,并且提供了强大的图形能力。 ## 1.2 安装与配置R环境 要开始使用R语言,首先需要在计算机上安装R环境。用户可以访问官方网站

【R语言编程实践手册】:evir包解决实际问题的有效策略

![R语言数据包使用详细教程evir](https://i0.hdslb.com/bfs/article/banner/5e2be7c4573f57847eaad69c9b0b1dbf81de5f18.png) # 1. R语言与evir包概述 在现代数据分析领域,R语言作为一种高级统计和图形编程语言,广泛应用于各类数据挖掘和科学计算场景中。本章节旨在为读者提供R语言及其生态中一个专门用于极端值分析的包——evir——的基础知识。我们从R语言的简介开始,逐步深入到evir包的核心功能,并展望它在统计分析中的重要地位和应用潜力。 首先,我们将探讨R语言作为一种开源工具的优势,以及它如何在金融

R语言数据包个性化定制:满足复杂数据分析需求的秘诀

![R语言数据包个性化定制:满足复杂数据分析需求的秘诀](https://statisticsglobe.com/wp-content/uploads/2022/01/Create-Packages-R-Programming-Language-TN-1024x576.png) # 1. R语言简介及其在数据分析中的作用 ## 1.1 R语言的历史和特点 R语言诞生于1993年,由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发,其灵感来自S语言,是一种用于统计分析、图形表示和报告的编程语言和软件环境。R语言的特点是开源、功能强大、灵活多变,它支持各种类型的数据结

【R语言时间序列预测大师】:利用evdbayes包制胜未来

![【R语言时间序列预测大师】:利用evdbayes包制胜未来](https://img-blog.csdnimg.cn/20190110103854677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zNjY4ODUxOQ==,size_16,color_FFFFFF,t_70) # 1. R语言与时间序列分析基础 在数据分析的广阔天地中,时间序列分析是一个重要的分支,尤其是在经济学、金融学和气象学等领域中占据

【R语言极值事件预测】:评估和预测极端事件的影响,evd包的全面指南

![【R语言极值事件预测】:评估和预测极端事件的影响,evd包的全面指南](https://ai2-s2-public.s3.amazonaws.com/figures/2017-08-08/d07753fad3b1c25412ff7536176f54577604b1a1/14-Figure2-1.png) # 1. R语言极值事件预测概览 R语言,作为一门功能强大的统计分析语言,在极值事件预测领域展现出了其独特的魅力。极值事件,即那些在统计学上出现概率极低,但影响巨大的事件,是许多行业风险评估的核心。本章节,我们将对R语言在极值事件预测中的应用进行一个全面的概览。 首先,我们将探究极值事