1,封装参数:
- 如果做查询条件,或者参数之间不是属于一个实体类对象,封装成map
- 如果做写数据,并且参数本来就是属于一个实体类对象,封装成实体类对象.
2,使用jquery获取或者设置指定元素的value属性值:
获取:选择器.val();
设置:选择器.val(属性值);
3,导出市场活动:
- 给"批量导出"按钮添加单击事件,发送导出请求
- 查询所有的市场活动
- 创建一个excel文件,并且把市场活动写到excel文件中
- 把生成的excel文件输出到浏览器(文件下载)
技术准备:
使用java生成excel文件:iText,apache-poi
关于办公文档插件使用的基本思想:把办公文档的所有元素封装成普通的Java类,
程序员通过操作这些类达到操作办公文档目的。
名称 | 属性 |
---|---|
文件 | HSSFWorkbook |
页 | HSSFSheet |
行 | HSSFRow |
列 | HSSFCell |
样式 | HSSFCellStyle |
使用apache-poi生成excel:
- a)添加依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
- b)使用封装类生成excel文件:
public class CreateExcelTestPoi {
@Test
public void testExcel() throws IOException {
//创建HSSFWorkbook对象,对应一个Exceld文件
HSSFWorkbook workbook = new HSSFWorkbook();
//使用workbook创建SSFSheet对象,对应workBook文件中的一页
HSSFSheet sheet = workbook.createSheet("学生列表");
//使用sheet创建HSSFRow对象,对应sheet中的一行
HSSFRow row = sheet.createRow(0);//行号:从0开始,依次增加
//使用row创建HSSFCell对象,对应row中的一列
HSSFCell cell = row.createCell(0);//列的编号:从0开始,依次增加
cell.setCellValue("学号");
cell = row.createCell(1);//第二列
cell.setCellValue("姓名");
cell = row.createCell(2);//第三列
cell.setCellValue("年龄");
//生成样式对象HSSFCellStyle
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setBorderBottom(BorderStyle.MEDIUM);
//使用sheet创建10个HSSFRown对象。对应sheet的10行
for(int i=1;i<=10;i++){
row = sheet.createRow(i);
cell = row.createCell(0);//列的编号:从0开始,依次增加
cell.setCellValue("100"+i);
cell = row.createCell(1);//第二列
cell.setCellValue("NAME"+i);
cell.setCellStyle(cellStyle);
cell = row.createCell(2);//第三列
cell.setCellValue(20+i);
}
// E:\开发工具\动力节点\CRM项目( SSM框架版)\课堂笔记
//创建输出流((目录必须创建好)
FileOutputStream fos = new FileOutputStream("F:\\2017\\student.xls");
//调用工具函数,生成Excel文件
workbook.write(fos);
//释放资源
fos.close();
workbook.close();
System.out.println("ok~~~~~~~~~~~~~~~~~~~~~~~~~");
}
}
2)文件下载:
filedownloadtest.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";
%>
<html>
<head>
<title>演示文件下载</title>
<!-- 官网bootstrap压缩版引用地址: -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<!-- 官网jquery压缩版引用地址: -->
<script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript">
$(function () {
$("#fileDownloadBtn").click(function () {
//发送文件下载请求
window.location.href='workbench/activity/fileDownload.do';//同步请求
});
})
</script>
</head>
<body>
<br><br>
<input class="btn btn-primary" type="button" value="下载" id="fileDownloadBtn">
</body>
</html>
ActivityController
@RequestMapping("/workbench/activity/fileDownload.do")
public void fileDownload(HttpServletResponse response) throws IOException {
System.out.println("文件下载开始时间:"+DateUtils.formateDateTime(new Date()));
//1.设置响应类型
response.setContentType("appplication/octet-stream;charset=UTF-8");
//2.获取输出流
OutputStream out = null;
InputStream is = null;
try {
out = response.getOutputStream();
//浏览器接收到响应请求信息后,默认情况下,直接在显示窗口打开响应信息,即使打不开,也会调用应用程序打开;
// 只有实在打不开,才会激活文件下载窗口
//可以设置响应头信息,使浏览器接收到响应信息后,直接激活文件下载窗口,即使能打开也不打开
response.addHeader("Content-Disposition","attachment;filename=xoxo.jpg");
//读取Excel文件(InputStream),把输出到到浏览器(OutPutStream)
is = new FileInputStream("F:\\360downloads\\backgrouds\\c2a6aecfa838b1a652fa03fb622cb4cb.jpg");
byte[] buff = new byte[256];
int len = 0;
while ((len = is.read(buff))!=-1){
out.write(buff,0,len);
}
}catch (Exception e){
e.printStackTrace();
}
/**
* 关闭资源
* out = response.getOutputStream();out是服务器创建的,不需要手动关闭资源
*/
is.close();
out.flush();
System.out.println("文件下载结束时间:"+DateUtils.formateDateTime(new Date()));
}
|->fileDownload()
*所有文件下载的请求只能发送同步请求。
具体业务演示(批量导出市场活动信息## 标题Excel文件)
ActivityMapper.java:
/**
* 查询所有的市场活动
* @return
*/
List<Activity> selectAllActivitys();
ActivityMapper.xml:
<!--
/**
* 查询所有的市场活动
* @return
*/
List<Activity> selectAllActivitys();-->
<select id="selectAllActivitys" resultMap="BaseResultMap">
select a.id,u1.name as owner,a.name,a.start_date,a.end_date,a.cost,a.description,
a.create_time,u2.name as create_by,a.edit_time
from tbl_activity a
join tbl_user u1 on a.owner = u1.id
join tbl_user u2 on a.create_by = u2.id
left join tbl_user u3 on a.edit_by = u3.id
order by a.create_time desc
</select>
ActivityController.java
/**
* 批量导出市场活动信息
* (改造后:市场活动信息从数据库查询出来在内存上,再从内存放到磁盘上,再从磁盘上放到内存上)
* 修改后:不用再内存-》磁盘-》内存来回跑
* 全部在内存中操作,最后导出保存在本地磁盘上
*
*/
@RequestMapping("/workbench/activity/exportAllActivitys.do")
public void exportAllActivitys(HttpServletResponse response) throws IOException {
/**
* 把查询到的市场活动信息写到Excel文件中并保存到服务器端
*/
//调用service层方法,查询所有市场活动信息
List<Activity> activityList = activityService.queryAllActivitys();
//创建Excel文件,并且把activityList写入到Excel文件中
//创建HSSFWorkbook对象,对应一个Exceld文件
HSSFWorkbook workbook = new HSSFWorkbook();
//使用workbook创建SSFSheet对象,对应workBook文件中的一页
HSSFSheet sheet = workbook.createSheet("市场活动列表");
//使用sheet创建HSSFRow对象,对应sheet中的一行
HSSFRow row = sheet.createRow(0);
//使用row创建HSSFCell对象,对应row中的一列
HSSFCell cell = row.createCell(0);//第1列
cell.setCellValue("ID");
cell = row.createCell(1);//第2列
cell.setCellValue("所有者");
cell = row.createCell(2);//第3列
cell.setCellValue("名称");
cell = row.createCell(3);//第4列
cell.setCellValue("开始日期");
cell = row.createCell(4);//第5列
cell.setCellValue("结束日期");
cell = row.createCell(5);
cell.setCellValue("成本");
cell = row.createCell(6);
cell.setCellValue("描述");
cell = row.createCell(7);
cell.setCellValue("创建时间");
cell = row.createCell(8);
cell.setCellValue("创建者");
cell = row.createCell(9);
cell.setCellValue("修改时间");
cell = row.createCell(10);
cell.setCellValue("修改者");
//如果activity市场活动表有数据不为空则进行导出Excel文件
if(activityList!=null && activityList.size()>0){
Activity activity = null;
//遍历activityList,创建HSSFRown对象,生成所有数据行
for(int i=0;i<activityList.size();i++){
activity = activityList.get(i);
//每次遍历出一个activity对象,创建数据行(生成一行)
//i+1是因为第一行已经创建好了,是表头行
row = sheet.createRow(i + 1);//第二行、第三行、第四行....第activityList.size()行
//每一行创建11列,每一列的数据从activity对象中获取
cell = row.createCell(0);
cell.setCellValue(activity.getId());
cell = row.createCell(1);
cell.setCellValue(activity.getOwner());
cell = row.createCell(2);
cell.setCellValue(activity.getName());
cell = row.createCell(3);
cell.setCellValue(activity.getStartDate());
cell = row.createCell(4);
cell.setCellValue(activity.getEndDate());
cell = row.createCell(5);
cell.setCellValue(activity.getCost());
cell = row.createCell(6);
cell.setCellValue(activity.getDescription());
cell = row.createCell(7);
cell.setCellValue(activity.getCreateTime());
cell = row.createCell(8);
cell.setCellValue(activity.getCreateBy());
cell = row.createCell(9);
cell.setCellValue(activity.getEditTime());
cell = row.createCell(10);
cell.setCellValue(activity.getEditBy());
}
}
//释放资源
workbook.close();
/**
* 把生成的Excel文件从服务器端下载到客户端
*/
//1.设置响应类型
System.out.println("文件下载开始时间:"+DateUtils.formateDateTime(new Date()));
//1.设置响应类型
response.setContentType("appplication/octet-stream;charset=UTF-8");
//2.获取输出流
OutputStream out = response.getOutputStream();
response.addHeader("Content-Disposition","attachment;filename=activityList.xls");
// 释放资源
/*is.close();*/
workbook.write(out);
out.flush();
System.out.println("文件下载完成~~~~~~~");
System.out.println("文件下载结束时间:"+DateUtils.formateDateTime(new Date()));
}
本文含有隐藏内容,请 开通VIP 后查看