PDF和Excel
Spring提供了除了HTML之外的其他输出方式,包括PDF和Excel电子表格。本节将介绍如何使用这些功能。
从Spring Framework 7.0开始,org.springframework.web.servlet.view.document包中的视图类已被弃用。相反,库可以适配现有的代码,用自己的*View类型来提供支持。作为一种替代方案,应用程序可以在Web处理程序中直接进行渲染。
文档视图介绍
HTML页面并不总是用户查看模型输出的最佳方式,而Spring可以简化从模型数据动态生成PDF文档或Excel电子表格的过程。生成的文档即为用户所看到的“视图”,并通过服务器以正确的内容类型进行流式传输,以便(希望如此)让客户端电脑能够运行相应的电子表格或PDF阅读器应用程序来显示这些内容。
为了使用Excel视图功能,你需要在类路径中添加Apache POI库。对于PDF生成,你还需要添加(最好是)OpenPDF库。
如果可能的话,你应该使用最新的文档生成库版本。特别是,我们强烈推荐使用OpenPDF(例如OpenPDF 1.2.12),而不是过时的iText 2.1.7,因为OpenPDF得到了积极的维护,并且修复了一个与不可信PDF内容相关的重要漏洞。
PDF视图
一个简单的单词列表PDF视图可以扩展org.springframework.web.servlet.view.document.AbstractPdfView并实现buildPdfDocument()方法,如下例所示:
- Java
- Kotlin
public class PdfWordList extends AbstractPdfView {
protected void buildPdfDocument(Map<String, Object> model, Document doc, PdfWriter writer,
HttpServletRequest request, HttpServletResponse response) throws Exception {
List<String> words = (List<String>) model.get("wordList");
for (String word : words) {
doc.add(new Paragraph(word));
}
}
}
class PdfWordList : AbstractPdfView() {
override fun buildPdfDocument(model: Map<String, Any>, doc: Document, writer: PdfWriter,
request: HttpServletRequest, response: HttpServletResponse) {
val words = model["wordList"] as List<String>
for (word in words) {
doc.add(Paragraph(word))
}
}
}
控制器可以从外部视图定义中返回这样的视图(通过名称引用它),也可以从处理方法中作为View实例返回。
Excel视图
自Spring Framework 4.2以来,org.springframework.web.servlet.view.document.AbstractXlsView被作为Excel视图的基础类提供。它基于Apache POI,有一些专门的子类(AbstractXlsxView和AbstractXlsxStreamingView),这些子类取代了过时的AbstractExcelView类。
该编程模型与AbstractPdfView类似,其中buildExcelDocument()是核心的模板方法,控制器可以从外部定义中(通过名称)返回这样的视图,或者从处理方法中返回一个View实例作为视图。