`
javandroid
  • 浏览: 25594 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

logistics-5-subarea management

 
阅读更多
业务:
分区管理-添加分区
分区管理-多条件分页查询
分区管理_查询结果导出

技术点:
1.Mybatis关联多表配置
2.使用springMVC的视图解析器完成导出

07:【分区管理_查询结构导出】-传统导出方式








页面导出按钮响应函数:
function doExport(){
	location.href=
  "${pageContext.request.contextPath}/subarea_export.do";
}

public void export(HttpSession httpSession, HttpServletResponse response) throws IOException {
	Map<String, Object> condition = (Map<String, Object>) httpSession.getAttribute("condition");
	// 重新查询一次 (不分页)
	List<Subarea> subareas = subareaService.findSubareasByCondition(condition);

	// 构造工作薄
	HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
	// 创建sheet
	HSSFSheet sheet = hssfWorkbook.createSheet("分区数据信息");

	// 表头
	HSSFRow headRow = sheet.createRow(0);
	headRow.createCell(0).setCellValue("分区编号");
	headRow.createCell(1).setCellValue("省");
	headRow.createCell(2).setCellValue("市");
	headRow.createCell(3).setCellValue("区");
	headRow.createCell(4).setCellValue("关键字");
	headRow.createCell(5).setCellValue("位置");

	// 表数据
	for (Subarea subarea : subareas) {
		// 每一个Subarea 就是一行数据
		HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
		dataRow.createCell(0).setCellValue(subarea.getId());
		dataRow.createCell(1).setCellValue(subarea.getRegion().getProvince());
		dataRow.createCell(2).setCellValue(subarea.getRegion().getCity());
		dataRow.createCell(3).setCellValue(subarea.getRegion().getDistrict());
		dataRow.createCell(4).setCellValue(subarea.getAddresskey());
		dataRow.createCell(5).setCellValue(subarea.getPosition());
	}

	// 提供下载
	response.setContentType("application/vnd.ms-excel");
	response.setHeader("Content-Disposition", "attachment;filename=subarea.xls");
	hssfWorkbook.write(response.getOutputStream());
}
注意以上最后的3句代码。

08:【分区管理_使用springMVC的视图解析器完成导出】-springMVC导出方式

使用springMVC的视图解析器进行导出。
1.只需要扩展Spring的AbstractExcelView或者AbstractJExcelView即可。AbstractExcelView基于POI API,而AbstractJExcelView基于JExcelAPI。
2.实现buildExcelDocument()方法,在方法中使用模型数据构造出Excel文档就可以了。

这里通过前者来实现Excel视图类。
整个流程如下。
1.
/**
 * 条件查询 导出
 * 
 * @throws IOException
 */
@RequestMapping("/subarea_export.do")
public String export(HttpSession httpSession, HttpServletResponse response, ModelMap map) throws IOException {
	Map<String, Object> condition = (Map<String, Object>) httpSession.getAttribute("condition");
	// 重新查询一次 (不分页)
	List<Subarea> subareas = subareaService.findSubareasByCondition(condition);
	map.put("subareas", subareas);
	return "subareaExcel";
}
2.配置解析器
<!-- 配置Excel返回解析器 -->
<!-- 将 Controller 业务方法,返回值与一个bean id 匹配,执行Bean 的 视图显示方法 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" ></bean>
<bean id="subareaExcel" class="cn.itcast.bos.web.view.SubareaExcelView"></bean>
3.实现解析器
public class SubareaExcelView extends AbstractExcelView {

	@Override
	protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 指定下载文件名称
		response.setHeader("Content-Disposition", "attachment;filename=" + FileUtils.encodeDownloadFilename("分区数据.xls", request.getHeader("user-agent")));

		// 获取数据
		List<Subarea> subareas = (List<Subarea>) model.get("subareas");
		// 创建sheet
		HSSFSheet sheet = workbook.createSheet("分区数据信息");
		// 表头
		HSSFRow headRow = sheet.createRow(0);
		headRow.createCell(0).setCellValue("分区编号");
		headRow.createCell(1).setCellValue("省");
		headRow.createCell(2).setCellValue("市");
		headRow.createCell(3).setCellValue("区");
		headRow.createCell(4).setCellValue("关键字");
		headRow.createCell(5).setCellValue("位置");
		// 表数据
		for (Subarea subarea : subareas) {
			// 每一个Subarea 就是一行数据
			HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
			dataRow.createCell(0).setCellValue(subarea.getId());
			dataRow.createCell(1).setCellValue(subarea.getRegion().getProvince());
			dataRow.createCell(2).setCellValue(subarea.getRegion().getCity());
			dataRow.createCell(3).setCellValue(subarea.getRegion().getDistrict());
			dataRow.createCell(4).setCellValue(subarea.getAddresskey());
			dataRow.createCell(5).setCellValue(subarea.getPosition());
		}
	}
}

注意
:由于配置了多个解析器,所以就有了优先级的概念。




页面默认的解析器InternalResourceViewResolver ,而这里配置的解析器为BeanNameViewResolver。
而优先级越小越优先。两者的优先级默认都为Integer.MAX_VALUE,相同时优先级按照顺序的优先级决定。

所以可以设置order来改变优先级顺序。可以将前者order设为10,后者设为8,则后者优先级高于前者。




关于下载文件的文件名为中文的问题?
由于IE URL编码、 火狐 Base64编码,所以可以自定义一个编码的工具类,用来进行附件名的编码。
public class FileUtils {
	/**
	 * 下载文件时,针对不同浏览器,进行附件名的编码
	 * 
	 * @param filename
	 *            下载文件名
	 * @param agent
	 *            客户端浏览器
	 * @return 编码后的下载附件名
	 * @throws IOException
	 */
	public static String encodeDownloadFilename(String filename, String agent)
			throws IOException {
		if (agent.contains("Firefox")) { // 火狐浏览器
			filename = "=?UTF-8?B?"
					+ new BASE64Encoder().encode(filename.getBytes("utf-8"))
					+ "?=";
			filename = filename.replaceAll("\r\n", "");
		} else { // IE及其他浏览器
			filename = URLEncoder.encode(filename, "utf-8");
			filename = filename.replace("+", " ");
		}
		return filename;
	}
}
则在使用时
response.setHeader("Content-Disposition", "attachment;filename=" + FileUtils.encodeDownloadFilename("分区数据.xls", request.getHeader("user-agent")));

分享到:
评论

相关推荐

    省市联动选择

    在"PCASClass"这个文件名中,"PCAS"可能是"Province-City-Area-Subarea"的缩写,表示省-市-区-子区的四级联动选择。这个文件可能包含实现省市联动选择的代码示例,或者是一个类库,提供了方便快捷的方法来创建这种...

    java-WEB模块物流项目三.docx

    - **PDM(Physical Data Model)建表**:创建取派员表bc_staff、区域表bc_region、分区表bc_subarea和定区表bc_decidedzone。 - **实体生成**:使用Hibernate3 Maven Plugin根据数据表自动生成实体类和映射文件。...

    专题资料(2021-2022年)javaWEB模块物流项目三.doc

    - **PDM(Physical Data Model)建表**:设计取派员表(bc_staff)、区域表(bc_region)和分区表(bc_subarea),以及定区表(bc_decidedzone)。 - **实体生成**:使用Hibernate3-maven-plugin插件,根据数据库...

    主存空间分配与回收+设计文档

    操作系统是计算机系统的核心组成部分,负责管理和控制硬件资源,其中最重要的一项任务就是主存空间的分配与回收。在本文中,我们将深入探讨这个关键的主题,理解其背后的原理、算法以及实际应用。...

    test_ddr3_xilinxddr3_

    5. **错误检测与恢复**:添加CRC校验或其他错误检测机制,以确保数据在传输过程中的完整性。 6. **软件驱动开发**:编写海思3559处理器上的驱动程序,以便正确地接收和处理来自FPGA的数据。 通过以上步骤,可以构建...

    ddr3_test_ddr3_FPGAverilog_

    DDR3(Double Data Rate Third Generation Synchronous Dynamic Random-Access Memory)是现代计算机系统中常见的内存类型,具有高速、低功耗的特点。在FPGA(Field-Programmable Gate Array)设计中,对DDR3内存的...

    Portland-park-data:PDX 的 JSON 中的停放数据

    " OwnedAcres " : " 5.8799999999999999 " , " Property " : " Colonel Summers Park " , " PropertyID " : " 12 " , " SubArea " : " SE " , " UnownedAcres " : " 0 " , " YearAcquired " : " 1921 " , " ...

    PHPCMS 2008 SP3 常用函数

    - `subarea`:获取地区信息。 - `subtype`:获取模块分类。 - `thumb`:生成图片缩略图。 - `get_sql_catid`:获取指定栏目ID的所有子栏目ID。 - `get_sql_in`:创建SQL查询中的IN子句。 - `pages`:分页显示...

    WiSal:无密集站点调查的基于WiFi的无设备无源子区域本地化

    WiSal(WiFi-based Device-free Passive Subarea Localization Without Intensive Site-Survey)是一种新兴的基于WiFi的无设备无源子区域定位技术,具有在无线移动计算快速发展的背景下,为普遍位置服务和安全关键...

    C语言固定分区存储管理实验.doc

    我们定义了一个结构体subarea,其中包含了起始地址、长度和占用标志三个成员变量。我们还定义了两个函数distribute1和distribute2,分别用于申请和释放存储空间。 函数distribute1将遍历所有的分区,查找一个合适的...

    存储管理实验报告程序

    #include #include #define NULL 0 #define getjcb(type) (type*)malloc(sizeof(type)) #define getsub(type) (type*)malloc(sizeof(type)) int num,num2;...struct subarea{ //分区块 char name[10];

    Python使用bs4获取58同城城市分类的方法

    二级分类通常在一级分类的子区域内,因此需要定位到`&lt;div class="subarea"&gt;`下的所有`&lt;a&gt;`标签。 - 提取这些二级分类的文本,存储在一个列表中,然后用空格连接起来,写入到`data.txt`文件,每条分类之间用换行符...

    操作系统之存储器管理

    int subarea; //分区号 int size; //分区物理块大小 char state[10]; //分区分配状态 不表明大小则提示错误 char getname[10]; //分配的作业名 int getlength; //被分配的作业大小 }area[3];

    内存分配程序(代码)

    每个进程用一个结构体`pcb`(进程控制块)表示,包含两个成员:`subarea`表示进程的分区大小,`next`是一个指针,指向下一个进程的`pcb`结构。 3. **内存分配**:`add`函数模拟了内存分配的过程。用户输入要创建的...

    多跳无线Ad hoc网络分区树路由协议ASTRP芈

    本文介绍了一种名为ASTRP(Ad hoc Subarea Tree Routing Protocol)的新颖路由协议。ASTRP是一种分级路由协议,旨在通过构建分区树来优化路由更新成本并提高路由的有效性。具体而言,该协议将整个网络逻辑上划分为多...

    激光沉积成形分区环形扫描路径生成算法

    激光沉积成形(Laser Deposition Forming,LDF)是一种先进的增材制造技术,它利用高能激光束熔化金属粉末,逐层堆积形成三维工件。在该过程中,控制激光扫描路径对于保证成形件的质量至关重要。...

Global site tag (gtag.js) - Google Analytics