用户有时可能希望将应用中的内容导出为Excel或PDF格式。Java中,有一些库可以帮助生成这些格式的文件。
然而,在web应用中直接使用这些库,你就需要在后台生成文件,并作为binary attachments返回给用户,
你需要处理HTTP响应头以及输出流。
Spring将Excel以及PDF文件的生成集成到了它的MVC框架中。你可以将Excel以及PDF当作是特殊类型的
视图,在controller中处理请求,将数据添加到model传给Excel和PDF视图。用这种办法,你就不需要处理
HTTP响应头以及输出流。
Spring MVC支持用Apache POI或JExcelAPI来生成Excel文件。相应的视图类是AbstractExcelView和
AbstractJExcelView。 导出PDF用的是iText库,相应的视图类是AbstractPdfView。
一、原理
假设用户需要生成一个报表,内容是某天的reservation summary。那么先在service层声明一个方法返回
某天的所有reservations。
package com.apress.springrecipes.court.service;
...
public interface ReservationService {
...
public List<Reservation> findByDate(Date date);
}
实现类代码:
package com.apress.springrecipes.court.service;
...
public class ReservationServiceImpl implements ReservationService {
...
public List<Reservation> findByDate(Date date) {
List<Reservation> result = new ArrayList<Reservation>();
for (Reservation reservation : reservations) {
if (reservation.getDate().equals(date)) {
result.add(reservation);
}
}
return result;
}
}
接下来是编写一个简单的controller从URL中得到date参数,此参数被格式化成一个date对象,传给
service层。controller依赖content negotiation resolver,因此,controller返回一个逻辑视图,让resolver
来决定该报表是以Excel还是PDF还是默认的HTML页面来展示。
package com.apress.springrecipes.court.web;
...
@Controller
@RequestMapping("/reservationSummary*")
public class ReservationSummaryController {
private ReservationService reservationService;
@Autowired
public ReservationSummaryController(ReservationService reservationService) {
this.reservationService = reservationService;
}
@RequestMapping(method = RequestMethod.GET)
public String generateSummary(
@RequestParam(required = true, value = "date") String selectedDate,
Model model) {
List<Reservation> reservations = java.util.Collections.emptyList();
try {
Date summaryDate = new SimpleDateFormat("yyyy-MM-dd").parse(selectedDate);
reservations = reservationService.findByDate(summaryDate);
} catch (java.text.ParseException ex) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
throw new ReservationWebException("Invalid date format for reservation summary",new
Date(),sw.toString());
}
model.addAttribute("reservations",reservations);
return "reservationSummary";
}
}
上面的controller只包含一个默认的HTTP GET处理器方法。如果创建Date对象失败,程序抛出一个自定义
Spring异常叫ReservationWebException。如果try/catch块没有发生错误,控制器的Model对象中将放入
查询结果。最后,方法将控制交给reservationSummary视图。注意,控制器只返回一个视图,即使它
支持PDF,XLS以及HTML视图。原因是它利用了ContentNegotiatingViewResolver解析器,它会决定
用哪个视图。
1.1 创建Excel视图
我们可以扩展AbstractExcelView(POI)或AbstractJExcelView(JExcelAPI)来创建Excel视图。
这里,我们用AbstractExcelView举例。在buildExcelDocument()方法中,可以访问从控制器传来的
model,还有一个预先创建的Excel workbook,你的任务就是用model中的数据填充此workbook。
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10-FINAL</version>
</dependency>
package com.apress.springrecipes.court.web.view;
...
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView;
public class ExcelReservationSummary extends AbstractExcelView {
protected void buildExcelDocument(Map model, HSSFWorkbook workbook,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
List<Reservation> reservations = (List) model.get("reservations");
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
HSSFSheet sheet = workbook.createSheet();
HSSFRow header = sheet.createRow(0);
header.createCell((short) 0).setCellValue("Court Name");
header.createCell((short) 1).setCellValue("Date");
header.createCell((short) 2).setCellValue("Hour");
header.createCell((short) 3).setCellValue("Player Name");
header.createCell((short) 4).setCellValue("Player Phone");
int rowNum = 1;
for (Reservation reservation : reservations) {
HSSFRow row = sheet.createRow(rowNum++);
row.createCell((short) 0).setCellValue(reservation.getCourtName());
row.createCell((short) 1).setCellValue(
dateFormat.format(reservation.getDate()));
row.createCell((short) 2).setCellValue(reservation.getHour());
row.createCell((short) 3).setCellValue(
reservation.getPlayer().getName());
row.createCell((short) 4).setCellValue(
reservation.getPlayer().getPhone());
}
}
}
可以用下面的URL来访问该excel视图:
http://localhost:8080/court/reservationSummary.xls?date=2009-01-14
相关推荐
- `viewExcel` 方法接收 HTTP 请求,创建数据列表,然后使用 `ViewExcel` 类(假设是自定义的类,用于生成 Excel)来组装数据并返回一个 `ModelAndView` 对象,该对象包含了视图名称和模型数据,告诉 ...
4. **调整视图**:如果需要,可以调整列宽和行高,以确保在PDF中呈现的最佳效果。这可以通过拖动列边框或行号下方的分割线来完成。 5. **保存为PDF**:转到“文件”>“另存为”,在弹出的对话框中,选择“PDF”作为...
2. **创建Excel应用实例**: 使用Jacob的`ActiveXComponent`类,可以创建一个Excel应用程序的实例。这使得你可以像操作Excel界面一样,通过编程方式与之交互。 3. **打开Excel文件**: 通过`Dispatch`类的方法,可以...
- **easypoi-base**: 导入导出包,是核心功能所在,它提供了数据和Excel文件互相转换的核心实现。 - **easypoi-web**: 这个包提供了与Spring MVC整合的视图工具,简化了在Spring Web环境下进行导出的操作,但非必须...
1. **界面介绍与设置**:熟悉Excel工作环境,调整视图和选项设置以提高个人工作习惯。 2. **单元格操作**:输入数据、编辑内容、格式化单元格,以及对齐、边框和填充色的应用。 3. **公式与函数**:了解基本的算术...
添加多个视图是Excel的一个高级特性,允许用户创建并保存不同的工作视图,针对不同任务切换不同的布局和设置,提高个性化工作的便利性。 设置打印区域可以确保只打印所需的部分工作表,避免浪费纸张。录制“宏”...
为了实现文档预览,我们需要创建一个Controller,该Controller接收前端请求,读取服务器上的PDF、Word或Excel文件,然后将文件内容转换为适合在浏览器中展示的格式。 对于PDF文件,在Java Web环境中,可以使用...
8.13 创建Excel和PDF视图 344 8.13.1 问题 344 8.13.2 解决方案 345 8.13.3 工作原理 345 8.14 小结 351 第9章 Spring REST 352 9.1 用Spring发布一个REST服务 352 9.1.1 问题 352 9.1.2 解决方案...
8.13 创建Excel和PDF视图 344 8.13.1 问题 344 8.13.2 解决方案 345 8.13.3 工作原理 345 8.14 小结 351 第9章 Spring REST 352 9.1 用Spring发布一个REST服务 352 9.1.1 问题 352 9.1.2 解决方案...
1. `buildExcelDocument`方法是核心,它会在实际创建Excel文档时被调用。在这里,我们首先设置了文件的响应头,指定文件类型为"application/octet-stream",并设置"Content-Disposition"为"attachment",以确保...
功能区是Excel的主要操作面板,分为8大页次,包括“文件”、“开始”、“插入”、“页面布局”、“公式”、“数据”、“审阅”和“视图”。每个页次下有多个功能群组,如“开始”页次包含了基本的文字格式设置,而...
- 另一种方法是使用开源库如EPPlus,它无需依赖Office,能高效地处理大量数据,创建Excel文件并支持样式和公式。 - 还有NPOI,也是一款非微软的.NET Excel处理库,适用于.NET Framework和.NET Core。 2. **PDF...
它能读取、创建、编辑和转换PDF文件,并且支持在Web应用中预览PDF内容。通过将PDF页面渲染为图像,开发者可以在浏览器中展示PDF内容,用户无需安装额外的PDF阅读器。 5. **在线预览实现流程** - **文件上传**:...
由于提供的【部分内容】中文字串重复且无序,且出现了诸如“CtrlZ”、“CtrlA”、“Delete”、“AVERAGEfx”等显而易见的Excel2003操作指令和函数名,结合文件标题《Excel2003基础教程(全).pdf》和描述信息,可以...
通过添加控件工具箱,Excel不仅变得更加灵活,还能帮助用户创建更加动态和具有交互性的电子表格,这对于数据分析、报告制作以及教学资源的创建都大有裨益。在教学环境中,教师可以利用控件工具箱设计互动式的练习题...
本教程将探讨如何利用Asp.NET MVC框架,结合aspose库和pdfobject.js JavaScript库,实现在线预览Word、Excel、PowerPoint(PPT)以及PDF文件。这个功能允许用户无需下载文件,直接在浏览器中查看文档内容,极大地...
4. **视图组件**:创建一个自定义的View或使用现有的第三方库(如Android PDF Viewer, XWalkView等)来展示预览内容。对于非PDF格式,可能需要利用Aspose库将文件转换成HTML,然后在WebView中显示。 5. **权限管理*...
对于PDF和Excel格式的输出,Spring MVC可以通过Apache POI库来处理Excel,使用Flying Saucer或iText库来生成PDF。这些库能够将HTML内容转换为所需的格式,方便导出和下载。 总的来说,Spring MVC是Spring框架的重要...
同时,它还支持执行查询、查看结果集,并能将结果导出为多种格式,如CSV、Excel或PDF。 3. **数据浏览与操作**:用户可以通过直观的网格视图浏览数据库表中的数据,进行添加、修改、删除等操作。还可以进行数据过滤...
它还提到了受保护的视图和受信任的文档设置,这些都可以提高文档的安全性。辅助功能检查器帮助开发者创建更易于访问的应用程序。 11. 其他改进 还包括了一些其他方面的改进,例如改进了的 Office 主题、实时预览...