目录:
(1)crm分析导出市场活动的应用场景
(2)crm apache-poi插件
(3)crm演示使用apache-poi生成excel文件
(4)crm演示文件的下载
(5)crm设计导出市场活动
(6)crm实现导出市场活动Mapper层和Service层
(7)crm实现导出市场活动Controller层
(8)crm实现导出市场活动前台页面
(9)crm优化导出市场活动
(1)crm分析导出市场活动的应用场景
用户访问数据只有通过登录系统,在网络通的情况下,才能访问数据,用户想要不通过登录系统,来访问数据,想做灵活的统计分析,用户提出这种需求,用户脱离系统,来访问数据,把数据导出来,以办公文档导出来
需求:
用户在市场活动主页面,选择要导出的市场活动,点击"选择导出"按钮,把所有选择的数据生成一个excel文件,弹出文件下载的对话框;
用户选择要保存的目录,完成选择导出市场活动的功能.
*每次至少选择导出一条记录
*导出成功之后,页面不刷新
(2)crm apache-poi插件
pom.xml中的依赖:
(3)crm演示使用apache-poi生成excel文件
先写一个测试类,生成Excel文件:
package com.bjpowernode.crm.poi;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import java.io.FileOutputStream;
import java.io.OutputStream;
/**
* 使用apache-poi生成excel文件
*/
public class CreateExcelTest {
public static void main(String[] args) throws Exception{
//创建HSSFWorkbook对象,对应一个excel文件
HSSFWorkbook wb=new HSSFWorkbook();
//使用wb创建HSSFSheet对象,对应wb文件中的一页
HSSFSheet sheet=wb.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 style=wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);//修饰对齐方式
//使用sheet创建10个HSSFRow对象,对应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=row.createCell(2);
cell.setCellStyle(style);//让最后一列字体居中
cell.setCellValue(20+i);
}
//调用工具函数生成excel文件 文件输出流
OutputStream os=new FileOutputStream("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\studentList.xls");//目录必须手动创建,文件如果不存在,poi会自动创建
wb.write(os);
//关闭资源
os.close();
wb.close();
System.out.println("===========create ok==========");
}
}
运行:
文件夹生成了excel文件:打开
(4)crm演示文件的下载
测试文件的下载,在webapp下面创建一个filedownloadtest.jsp
向服务器发送同步请求三种方式:
1.地址栏
2.form表单
3.超链接
不新写一个controller了,让他发送到市场活动的controller中去就行了
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<html>
<head>
<base href="<%=basePath%>">
<script type="text/javascript" src="jquery/jquery-1.11.1-min.js"></script>
<title>演示文件下载</title>
<script type="text/javascript">
//入口函数$(function () :当页面架子啊完之后自动执行这个函数
$(function () {
//给"下载"按钮添加单击事件
$("#fileDownloadBtn").click(function () {
//发送文件下载的请求
window.location.href="workbench/activity/fileDownload.do";
});
});
</script>
</head>
<body>
<input type="button" value="下载" id="fileDownloadBtn">
</body>
</html>
在ActivityController中添加:
springmvc:我们访问网页,跳转页面,返回字符串。我们访问json,对应Object
@ResponseBody转为json字符串
//测试文件下载
@RequestMapping("/workbench/activity/fileDownload.do")
public void fileDownload(HttpServletResponse response) throws Exception{
//1.设置响应类型
response.setContentType("application/octet-stream;charset=UTF-8");
//2.获取输出流
OutputStream out=response.getOutputStream();
//浏览器接收到响应信息之后,默认情况下,直接在显示窗口中打开响应信息;即使打不开,也会调用应用程序打开;只有实在打不开,才会激活文件下载窗口。
//可以设置响应头信息,使浏览器接收到响应信息之后,直接激活文件下载窗口,即使能打开也不打开
response.addHeader("Content-Disposition","attachment;filename=mystudentList.xls");
//读取excel文件(InputStream),把输出到浏览器(OutoutStream)
InputStream is=new FileInputStream("D:\\course\\18-CRM\\阶段资料\\serverDir\\studentList.xls");
byte[] buff=new byte[256];
int len=0;
while((len=is.read(buff))!=-1){
out.write(buff,0,len);
}
//关闭资源
is.close();
out.flush();
}
运行项目先登录来一下,因为用到了ActivityController:
然后访问:
点击下载:
打开下载的文件:
(5)crm设计导出市场活动
(6)crm实现导出市场活动Mapper层和Service层
在ActivityMapper接口加方法:
ActivityMapper.xml:写sql语句
<!--查询所有的市场活动进行导出-->
<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,u3.name as edit_by
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>
在ActivityService接口里加一个方法:
实现类:
(7)crm实现导出市场活动Controller层
//查询所有的市场活动进行导出
@RequestMapping("/workbench/activity/exportAllActivitys.do")
public void exportAllActivitys(HttpServletResponse response) throws Exception{
//调用service层方法,查询所有的市场活动
List<Activity> activityList=activityService.queryAllActivitys();
//创建exel文件,并且把activityList写入到excel文件中
HSSFWorkbook wb=new HSSFWorkbook();
HSSFSheet sheet=wb.createSheet("市场活动列表");
HSSFRow row=sheet.createRow(0);
HSSFCell cell=row.createCell(0);
cell.setCellValue("ID");
cell=row.createCell(1);
cell.setCellValue("所有者");
cell=row.createCell(2);
cell.setCellValue("名称");
cell=row.createCell(3);
cell.setCellValue("开始日期");
cell=row.createCell(4);
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("修改者");
//遍历activityList,创建HSSFRow对象,生成所有的数据行
if(activityList!=null && activityList.size()>0){
Activity activity=null;
for(int i=0;i<activityList.size();i++){
activity=activityList.get(i);
//每遍历出一个activity,生成一行
row=sheet.createRow(i+1);
//每一行创建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());
}
}
//根据wb对象生成excel文件
OutputStream os=new FileOutputStream("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\activityList.xls");
wb.write(os);
//关闭资源
os.close();
wb.close();
//把生成的excel文件下载到客户端
response.setContentType("application/octet-stream;charset=UTF-8");
response.addHeader("Content-Disposition","attachment;filename=activityList.xls");
OutputStream out=response.getOutputStream();
InputStream is=new FileInputStream("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\activityList.xls");
byte[] buff=new byte[256];
int len=0;
while((len=is.read(buff))!=-1){
out.write(buff,0,len);
}
is.close();
//wb.write(out);
//wb.close();
out.flush();
}
(8)crm实现导出市场活动前台页面
//给"批量导出"按钮添加单击事件
$("#exportActivityAllBtn").click(function () {
//发送同步请求
window.location.href="workbench/activity/exportAllActivitys.do";
});
(9)crm优化导出市场活动
上面controller中的代码:首先把数据从内存到磁盘,然后再从磁盘读取到内存,非常影响效率,下面进行优化,直接从内存到内存,不把文件先保存到磁盘,在从磁盘中读取这一过程了
//查询所有的市场活动进行导出
@RequestMapping("/workbench/activity/exportAllActivitys.do")
public void exportAllActivitys(HttpServletResponse response) throws Exception{
//调用service层方法,查询所有的市场活动
List<Activity> activityList=activityService.queryAllActivitys();
//创建exel文件,并且把activityList写入到excel文件中
HSSFWorkbook wb=new HSSFWorkbook();
HSSFSheet sheet=wb.createSheet("市场活动列表");
HSSFRow row=sheet.createRow(0);
HSSFCell cell=row.createCell(0);
cell.setCellValue("ID");
cell=row.createCell(1);
cell.setCellValue("所有者");
cell=row.createCell(2);
cell.setCellValue("名称");
cell=row.createCell(3);
cell.setCellValue("开始日期");
cell=row.createCell(4);
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("修改者");
//遍历activityList,创建HSSFRow对象,生成所有的数据行
if(activityList!=null && activityList.size()>0){
Activity activity=null;
for(int i=0;i<activityList.size();i++){
activity=activityList.get(i);
//每遍历出一个activity,生成一行
row=sheet.createRow(i+1);
//每一行创建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());
}
}
/* //根据wb对象生成excel文件
OutputStream os=new FileOutputStream("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\activityList.xls");
wb.write(os);*/
//关闭资源
/*os.close();
wb.close();*/
//把生成的excel文件下载到客户端
response.setContentType("application/octet-stream;charset=UTF-8");
response.addHeader("Content-Disposition","attachment;filename=activityList.xls");
OutputStream out=response.getOutputStream();
/*InputStream is=new FileInputStream("D:\\AnZhuang\\Java项目\\CRM\\serverDir\\activityList.xls");
byte[] buff=new byte[256];
int len=0;
while((len=is.read(buff))!=-1){
out.write(buff,0,len);
}
is.close();*/
wb.write(out);
wb.close();
out.flush();
}
效果跟上面的导出数据是一样的
这个功能未做!