`

SpringMVC杂记(十一) 使用Excel视图

阅读更多
SpringMVC杂记(十一) 使用Excel视图

一) 其实这个功能在spring2.x时代就提供了。一直没用过,今天在spring-mvc3.2.x的环境下试验了一次。还算简单易用。
二) 依赖。
spring依赖POI或jExcel来实现对excel输出的支持,前者是apache出品,貌似名气更大,本例使用第一个。
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.7</version>
</dependency>


三) spring提供了一个AbstractExcelView作为自己实现的视图的父类。实例代码如下。
poi的api一般人不会太熟悉,可以参考apache-poi官方文档
package ying.car.view;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.view.document.AbstractExcelView;

import ying.car.binding.DateRange;
import ying.car.domain.RefuelingRecord;

public class RefuelingRecordExcelView extends AbstractExcelView {

	private static final Logger LOGGER = LoggerFactory.getLogger(RefuelingRecordExcelView.class);
	private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");
	
	@Override
	@SuppressWarnings({"unchecked"})
	protected void buildExcelDocument(
			Map<String, Object> model,		// MVC中的M就在这里了
			HSSFWorkbook workbook,
			HttpServletRequest request,
			HttpServletResponse response) throws Exception
	{
		List<RefuelingRecord> rrl = (List<RefuelingRecord>) model.get("refuelingRecordList");
		DateRange dr = (DateRange) model.get("dateRange");
		
		if (LOGGER.isDebugEnabled()) {
			LOGGER.debug("refueling-record-list-size: {}", rrl.size());
			LOGGER.debug("dateRange: {}", dr);
			if (dr != null) {
				LOGGER.debug("start: {}", new DateTime(dr.getStart()).toString("yyyy/MM/dd"));
				LOGGER.debug("end: {}", new DateTime(dr.getEnd()).toString("yyyy/MM/dd"));
			}
		}

		HSSFSheet sheet = workbook.createSheet(DATE_FORMAT.format(dr.getStart()) + "-" + DATE_FORMAT.format(dr.getEnd()));

		setColumnsWidth(sheet);
		fillTableHeader(workbook, sheet);
		fillTableBody(workbook, sheet, rrl);
	}
	
	private void setColumnsWidth(HSSFSheet sheet) {
		final int[] warr = new int[] {
			500,  // <空>
			4500, // 日期
			4500, // 车辆
			4500, // 燃油种类
			4500, // 燃油单价
			4500, // 加油方式
			4500, // 加油量
			3000, // 花费
			12000  // 备注
		};
		for (int i = 0; i < warr.length; i ++) {
			sheet.setColumnWidth(i, warr[i]);
		}
	}

	// 填充表格头
	private void fillTableHeader(HSSFWorkbook workbook, HSSFSheet sheet) {
		final String[] contents = new String[] {
			"日期",
			"车辆",
			"燃油种类",
			"燃油单价(元/升)",
			"加油方式",
			"加油量(升)",
			"花费(元)",
			"备注"
		};
		
		int r = 1;
		int c = 1;
		
		CellStyle style = workbook.createCellStyle();
		style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());		// 填充黄色
		style.setFillPattern(CellStyle.SOLID_FOREGROUND);			// 填充方式
		
		// 设置border
		style.setBorderLeft(CellStyle.BORDER_THIN);
		style.setBorderRight(CellStyle.BORDER_THIN);
		style.setBorderTop(CellStyle.BORDER_THIN);
		style.setBorderBottom(CellStyle.BORDER_THIN);

		for (int i = 0; i < contents.length; i ++) {
			Cell cell = getCell(sheet, r, c + i);
			cell.setCellValue(contents[i]);
			cell.setCellStyle(style);
		}
	}
	
	private void fillTableBody(HSSFWorkbook workbook, HSSFSheet sheet, List<RefuelingRecord> records) {
		// 通用style
		CellStyle style = workbook.createCellStyle();
		style.setFillForegroundColor(IndexedColors.WHITE.getIndex());		// 填充白色
		style.setFillPattern(CellStyle.SOLID_FOREGROUND);					// 填充方式
		style.setBorderLeft(CellStyle.BORDER_THIN);
		style.setBorderRight(CellStyle.BORDER_THIN);
		style.setBorderTop(CellStyle.BORDER_THIN);
		style.setBorderBottom(CellStyle.BORDER_THIN);
		
		// 日期style
		CellStyle dateStyle = workbook.createCellStyle();
		dateStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());		// 填充白色
		dateStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);					// 填充方式
		dateStyle.setBorderLeft(CellStyle.BORDER_THIN);
		dateStyle.setBorderRight(CellStyle.BORDER_THIN);
		dateStyle.setBorderTop(CellStyle.BORDER_THIN);
		dateStyle.setBorderBottom(CellStyle.BORDER_THIN);
		dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
		
		int r = 2;
		int c = 1;
		Cell cell = null;
		
		for (int i = 0; i < records.size(); i ++) {
			RefuelingRecord rr = records.get(i);
			
			// 日期
			cell = getCell(sheet, r, c + 0);
			if (rr.getDate() != null)
			cell.setCellValue(rr.getDate());
			cell.setCellStyle(dateStyle);

			// 车辆
			cell = getCell(sheet, r, c + 1);
			if (rr.getVehicle().getNickname() != null)
			cell.setCellValue(rr.getVehicle().getNickname());
			cell.setCellStyle(style);
			
			// 燃油种类
			cell = getCell(sheet, r, c + 2);
			if (rr.getGasType() != null) {
				String s = null;
				switch (rr.getGasType()) {
				case _0: s  = "0号柴油"; break;
				case _93: s = "93号汽油"; break;
				case _97: s = "97号汽油"; break;
				case _98: s = "98号汽油"; break;
				}
				cell.setCellValue(s);
			}
			cell.setCellStyle(style);
			
			// 单价
			cell = getCell(sheet, r, c + 3);
			if (rr.getPriceOfGas() != null)
			cell.setCellValue(rr.getPriceOfGas());
			cell.setCellStyle(style);
			
			// 加油方式
			cell = getCell(sheet, r, c + 4);
			if (rr.getRefuelingType() != null) {
				String s = null;
				switch (rr.getRefuelingType()) {
				case FIXED_CUBAGE:
					s = "固定容积"; break;
				case FIXED_MONEY:
					s = "固定金额"; break;
				case FULL:
					s = "加满"; break;
				}
				cell.setCellValue(s);
			}
			cell.setCellStyle(style);
			
			// 加油量
			cell = getCell(sheet, r, c + 5);
			if (rr.getCubageOfGas() != null)
			cell.setCellValue(rr.getCubageOfGas());
			cell.setCellStyle(style);
			
			// 花费
			cell = getCell(sheet, r, c + 6);
			if (rr.getSumOfMoney() != null)
			cell.setCellValue(rr.getSumOfMoney());
			cell.setCellStyle(style);
			
			// 备注
			cell = getCell(sheet, r, c + 7);
			if (rr.getComment() != null)
			cell.setCellValue(rr.getComment());
			cell.setCellStyle(style);

			r ++;
		}
	}
}


四) Controller中返回逻辑视图名 (代码片段)
@RequiresUser		// 安全框架用元注释
@RequiresRoles({"ROLE_USER"})
@RequestMapping(value = "/list/excel", method = RequestMethod.GET)
public String listByExcel(
		@DateRangeFormat(pattern = "yyyy-MM-dd") @RequestParam("dateRange") DateRange dateRange,
		ModelMap modelMap
	)
{
	Integer currentUserId = ShiroUtils.getPrincipalDomainId();

	if (LOGGER.isDebugEnabled()) {
		LOGGER.debug("currentUserId: {}", currentUserId);
		if (dateRange != null) {
			LOGGER.debug("start: {}", new DateTime(dateRange.getStart()).toString("yyyy/MM/dd"));
			LOGGER.debug("end: {}", new DateTime(dateRange.getEnd()).toString("yyyy/MM/dd"));
		}
	}

	// 放入model
	modelMap.put("dateRange", dateRange);
	modelMap.put("refuelingRecordList", gasService.findRefuelingRecordByDateRange(currentUserId, dateRange));
	
	return "refueling-record-list"; // 最终返回逻辑视图名
}


五) 为spring-mvc配置多个视图解析器。
spring-mvc.xml(片段)
<bean class="org.springframework.web.servlet.view.XmlViewResolver">
	<property name="order" value="1" /> <!-- order很重要 -->
	<property name="location" value="classpath:/META-INF/views.xml" />
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="order" value="9999" />
	<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
	<property name="prefix" value="/WEB-INF/jsp/"/>
	<property name="suffix" value=".jsp"/>
</bean>


views.xml
<bean name="refueling-record-list" class="ying.car.view.RefuelingRecordExcelView" />


六) 效果图
分享到:
评论

相关推荐

    SpringMVC 使用JSON、XML视图

    本文将详细介绍如何在SpringMVC中集成并使用JSON和XML视图,以及相关的库如json-lib、Jackson、xStream、Jibx和Jaxb2。 首先,让我们理解JSON和XML的作用。JSON(JavaScript Object Notation)是一种轻量级的数据...

    SpringMvc+POI 处理Excel的导入操作

    使用SpringMVC框架结合Apache POI库来处理Excel文件的导入操作不仅能够简化开发流程,还能提高程序的稳定性和效率。本文将详细介绍如何利用SpringMVC与Apache POI进行Excel文件的导入操作。 #### 二、技术栈 - **...

    使用SpringMVC导入导出excel

    在SpringMVC中,我们可以使用`HttpServletResponse`对象来设置响应头,指示浏览器以特定格式(如Excel)下载文件。通常,我们会创建一个控制器方法,该方法负责生成Excel文件并将其写入响应流。例如: ```java @...

    SpringMVC POI Excel 生成导出

    "SpringMVC POI Excel 生成导出" 这个标题指的是使用 SpringMVC 框架和 POI 库生成 Excel 文件,并将其导出。这个标题包含了三个关键词:SpringMVC、POI 和 Excel,它们是我们今天要探讨的主题。 描述解释 在这个...

    SpringMVC杂记(三) 向导型Controller的实现(基于SpringMVC 3.1.1)

    SpringMVC是一个模型-视图-控制器(MVC)框架,它提供了一个灵活的方式来分离应用程序的业务逻辑、数据处理和用户界面。Controller是这个架构的核心部分,负责接收HTTP请求,处理业务逻辑,并将结果转发给View进行...

    SSM笔记-SpringMVC自定义视图及重定向视图、语言国际化

    默认情况下,SpringMVC使用`InternalResourceViewResolver`来解析视图,它将视图名映射到JSP或Freemarker等模板引擎的页面。如果需要使用其他视图技术,如Thymeleaf或Velocity,或者有特定的视图解析规则,可以通过...

    springmvc下Excel下载

    有效的纠正了下载时出现的文件类型未知或没有扩展名的情况,也处理了spring下载的情况下文件名以@RequestMapping的value值为下载文件名称的情况

    SpringMvc+POI 导入Excel

    本项目是关于如何在SpringMvc中利用POI库来实现Excel文件的导入功能,这在数据录入、批量处理或数据分析场景中非常常见。 首先,我们需要理解SpringMvc中的控制器(Controller)如何接收文件上传请求。在描述中提到...

    SpringMvc+POI 导入Excel文件

    首先,要实现Excel文件的导入,我们需要理解SpringMvc中的控制器(Controller)和模型视图解析器(ModelAndView)。控制器负责接收HTTP请求,处理业务逻辑,并返回响应。在处理Excel导入请求时,控制器会接收到文件...

    ireport+springMVC 报表导出pdf excel

    "ireport+springMVC 报表导出pdf excel"这个主题聚焦于如何利用iReport工具和SpringMVC框架来实现报表的PDF和Excel格式导出功能。下面我们将深入探讨这两个技术以及它们在报表生成中的应用。 首先,iReport是一款...

    使用注解SpringMVC从页面导出Excel和word文档的使用的jar包——使用ExportExcel工具类.rar

    在SpringMVC框架中,开发人员经常需要处理数据导出的功能,例如将用户在网页上的数据导出为Excel或Word文档。本教程将详细介绍如何利用注解和ExportExcel工具类来实现这一目标。 首先,我们需要了解SpringMVC中的...

    springMVC 多视图配置(Jsp Freemarket Json)实例

    在 SpringMVC 中,我们可以使用 `InternalResourceViewResolver` 来配置 JSP 视图解析器。以下是一个配置示例: ```xml ``` 这表示视图名前缀为 `/WEB-INF/views/`,后缀为 `.jsp`。 **3. FreeMarker 视图**...

    springMVC+Easyui+Excel导入导出+WebService+Dom4j

    这是一个用mysql数据库做的SpringMVC,前台页面用的是EasyUI,对应两个项目用的是WebService相互调用。 实现功能:增删改查,Excel的导入导出,读取Excel文件,并在控制台打印。利用Dom4j 解析XML文件,并且实现对...

    jxls+springmvc实现excel模板导出

    标题中的“jxls+springmvc实现excel模板导出”指的是使用jxls库和Spring MVC框架来实现在Web应用中导出Excel模板的功能。jxls是一个Java库,它扩展了Apache POI库,允许开发者通过使用简单的Excel公式和指令在模板上...

    SpringMVC:生成Excel和PDF

    总结来说,这篇博文涵盖了使用SpringMVC结合Apache POI和iText库来生成Excel和PDF的关键技术。开发者需要理解这两个库的基本API,学习如何在Java中创建和格式化表格和文档,以及如何在SpringMVC环境中将这些文件作为...

    SpringMVC第8讲:多视图支持

    在本讲中,我们将深入探讨SpringMVC框架如何支持多种视图技术,使得开发者能够灵活地根据项目需求选择不同的展示方式。"多视图支持"是SpringMVC的一个重要特性,它允许我们处理并返回各种类型的响应,如HTML、JSON、...

    非常详细的用 java(springmvc+mybatis)实现excel导入功能并且保存到数据库

    在本实例中,使用了SpringMVC框架来实现Web应用程序。SpringMVC是一种基于Java的Web应用程序框架,提供了一个灵活的方式来构建Web应用程序。它提供了一个Model-View-Controller(MVC)架构,允许开发者将应用程序...

    (代码)SpringMVC第8讲:多视图支持

    在本节SpringMVC教程中,我们将探讨"多视图支持"这一核心概念,这是构建Web应用程序时不可或缺的一部分。SpringMVC作为一个强大的MVC框架,提供了丰富的功能来处理多种类型的视图技术,使得开发者能够灵活地选择最...

    SpringMVC初学者使用的CRUD

    SpringMVC是Spring框架的一部分,专门用于处理Web应用程序的模型-视图-控制器(MVC)架构。这个“SpringMVC初学者使用的CRUD”是一个适合新手上手的示例项目,它涵盖了创建、读取、更新和删除(CRUD)操作的基础知识...

Global site tag (gtag.js) - Google Analytics