业务:
分区管理-添加分区
分区管理-多条件分页查询
分区管理_查询结果导出
技术点:
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"的缩写,表示省-市-区-子区的四级联动选择。这个文件可能包含实现省市联动选择的代码示例,或者是一个类库,提供了方便快捷的方法来创建这种...
- **PDM(Physical Data Model)建表**:创建取派员表bc_staff、区域表bc_region、分区表bc_subarea和定区表bc_decidedzone。 - **实体生成**:使用Hibernate3 Maven Plugin根据数据表自动生成实体类和映射文件。...
- **PDM(Physical Data Model)建表**:设计取派员表(bc_staff)、区域表(bc_region)和分区表(bc_subarea),以及定区表(bc_decidedzone)。 - **实体生成**:使用Hibernate3-maven-plugin插件,根据数据库...
操作系统是计算机系统的核心组成部分,负责管理和控制硬件资源,其中最重要的一项任务就是主存空间的分配与回收。在本文中,我们将深入探讨这个关键的主题,理解其背后的原理、算法以及实际应用。...
5. **错误检测与恢复**:添加CRC校验或其他错误检测机制,以确保数据在传输过程中的完整性。 6. **软件驱动开发**:编写海思3559处理器上的驱动程序,以便正确地接收和处理来自FPGA的数据。 通过以上步骤,可以构建...
DDR3(Double Data Rate Third Generation Synchronous Dynamic Random-Access Memory)是现代计算机系统中常见的内存类型,具有高速、低功耗的特点。在FPGA(Field-Programmable Gate Array)设计中,对DDR3内存的...
" OwnedAcres " : " 5.8799999999999999 " , " Property " : " Colonel Summers Park " , " PropertyID " : " 12 " , " SubArea " : " SE " , " UnownedAcres " : " 0 " , " YearAcquired " : " 1921 " , " ...
- `subarea`:获取地区信息。 - `subtype`:获取模块分类。 - `thumb`:生成图片缩略图。 - `get_sql_catid`:获取指定栏目ID的所有子栏目ID。 - `get_sql_in`:创建SQL查询中的IN子句。 - `pages`:分页显示...
WiSal(WiFi-based Device-free Passive Subarea Localization Without Intensive Site-Survey)是一种新兴的基于WiFi的无设备无源子区域定位技术,具有在无线移动计算快速发展的背景下,为普遍位置服务和安全关键...
我们定义了一个结构体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];
二级分类通常在一级分类的子区域内,因此需要定位到`<div class="subarea">`下的所有`<a>`标签。 - 提取这些二级分类的文本,存储在一个列表中,然后用空格连接起来,写入到`data.txt`文件,每条分类之间用换行符...
int subarea; //分区号 int size; //分区物理块大小 char state[10]; //分区分配状态 不表明大小则提示错误 char getname[10]; //分配的作业名 int getlength; //被分配的作业大小 }area[3];
每个进程用一个结构体`pcb`(进程控制块)表示,包含两个成员:`subarea`表示进程的分区大小,`next`是一个指针,指向下一个进程的`pcb`结构。 3. **内存分配**:`add`函数模拟了内存分配的过程。用户输入要创建的...
本文介绍了一种名为ASTRP(Ad hoc Subarea Tree Routing Protocol)的新颖路由协议。ASTRP是一种分级路由协议,旨在通过构建分区树来优化路由更新成本并提高路由的有效性。具体而言,该协议将整个网络逻辑上划分为多...
激光沉积成形(Laser Deposition Forming,LDF)是一种先进的增材制造技术,它利用高能激光束熔化金属粉末,逐层堆积形成三维工件。在该过程中,控制激光扫描路径对于保证成形件的质量至关重要。...