导出列表,主要分为两个步骤,(1)下载到服务器端;(2)从服务器端将文件 down 到 浏览器端;
步骤(1)已经在 JAVA 之 使用 POI 导出 Excel (一) 中给出
其中需要注意的点有如下几个
1. 在服务器端检索生成代码文件夹 out ;
2. 创建和检测文件夹路径;
3. 在服务器端文件层级关系需用分隔符隔开;
详细代码如下:
/* 导出 */
public void getDialOutTaskListInfo(){
try {
// 导出工具类
ExportExcelUtil exprot = new ExportExcelUtil();
// 查询list
List<DialOutTaskDetail> list = null;
HashMap<String, Object> map = new HashMap<String, Object>();
if(dialOutTaskStartDate == null || dialOutTaskStartDate.equals("")){
map.put("endDate", dialOutTaskStartDate);//结束时间
}else {
map.put("begDate", dialOutTaskStartDate+" 00:00:00");//起始时间
}
if(dialOutTaskEndDate == null || dialOutTaskEndDate.equals("")){
map.put("endDate", dialOutTaskEndDate);//结束时间
}else {
map.put("endDate", dialOutTaskEndDate+" 24:59:59");//结束时间
}
map.put("dialOutTaskClass", dialOutTaskClass);//任务种类
map.put("dialOutTaskType", dialOutTaskType);//任务类型
map.put("dialOutTaskMobileNum", dialOutTaskMobileNum);//联系方式
map.put("dialOutTaskAgent", dialOutTaskAgent);//坐席
map.put("dialOutTaskAnsState", dialOutTaskAnsState);//接听状态
map.put("callBackState", callBackTaskState);//回访状态
map.put("dialOutTaskFollowState", dialOutTaskFollowState);//跟进状态
map.put("dialOutTaskDialTime", dialOutTaskDialTime);//拨打次数
map.put("offset", offset);
map.put("limit", limit);
try {
list = dialOutTaskService .getDialOutTaskDetList(map);
} catch (Exception e) {
e.printStackTrace();
log.error(e.getMessage());
writeData("failure");
return ;
}
// 调用导出方法
//导出表的列名
String[] rowName = {"任务Id","任务种类","任务类型","客户","联系方式","坐席","回访时间(最近)","接听状态","回访状态","跟进状态","拨打次数"} ;
//创建HSSFWorkbook对象(excel的文档对象)
HSSFWorkbook wkb = new HSSFWorkbook();
//建立新的sheet对象(excel的表单)
HSSFSheet sheet=wkb.createSheet("外呼任务列表");
//sheet样式定义【getColumnTopStyle()/getStyle()均为自定义方法 - 在下面 - 可扩展】
HSSFCellStyle columnTopStyle = this.getColumnTopStyle(wkb);//获取列头样式对象
HSSFCellStyle style = this.getStyle(wkb); //单元格样式对象
//在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
int columnNum = rowName.length;
HSSFRow rowRowName = sheet.createRow(0);
// 创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
// 设置单元格的值
for(int n=0;n<columnNum;n++){
HSSFCell cellRowName = rowRowName.createCell(n); //创建列头对应个数的单元格
cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); //设置列头单元格的数据类型
HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
cellRowName.setCellValue(text); //设置列头单元格的值
cellRowName.setCellStyle(columnTopStyle); //设置列头单元格样式
}
List<String[]> dataList = new ArrayList<String[]>();
for (DialOutTaskDetail dialOutTaskDetail:list) {
String[] array = new String[11];
array[0]=dialOutTaskDetail.getDialOutTaskId();
array[1]=dialOutTaskDetail.getTaskClass();
array[2]=dialOutTaskDetail.getTaskType();
array[3]=dialOutTaskDetail.getCustName();
array[4]=dialOutTaskDetail.getCustMobile();
array[5]=dialOutTaskDetail.getAgentName();
array[6]=dialOutTaskDetail.getLastDialDate();
array[7]=dialOutTaskDetail.getAnswerState();
array[8]=dialOutTaskDetail.getCallBackState();
array[9]=dialOutTaskDetail.getFollowState();
array[10]=dialOutTaskDetail.getDialTime();
dataList.add(array);
}
//将查询出的数据设置到sheet对应的单元格中
for(int i=0;i<dataList.size();i++){
Object[] obj = dataList.get(i);//遍历每个对象
HSSFRow row = sheet.createRow(i+1);//创建所需的行数
for(int j=0; j<obj.length; j++){
HSSFCell cell = null; //设置单元格的数据类型
cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);
if(!"".equals(obj[j]) && obj[j] != null){
cell.setCellValue(obj[j].toString()); //设置单元格的值
}
cell.setCellStyle(style); //设置单元格样式
}
}
// 输出Excel文件
// String fileName = "d:\\dialOutHist-Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
String url = DialOutTaskAction.class.getResource("").getPath().replaceAll("%20", " ");
String pathName = url.substring(0, url.indexOf("WEB-INF"))+ File.separator+(UPLOADFILE_FOLDER)+File.separator+EXCEL;
//make the file
File realDir = new File(pathName);
boolean realdirflag = realDir.exists();
if (!realdirflag) {
realDir.mkdirs();
}
String fileName = "dialOutHist-Excel-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
pathName = pathName+File.separator+fileName;
FileOutputStream output=new FileOutputStream(pathName);
wkb.write(output);
/*output.flush();*/ // 仅仅是刷新缓冲区(一般写字符时要用,因为字符是先进入的缓冲区),流对象还可以继续使用
output.close(); // 关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象不可以继续再使用了
writeData(fileName);
} catch (Exception e) {
e.printStackTrace();
log.error("导出外呼任务列表出错"+e.getMessage());
}
return;
}
在前台编辑代码的话这里需要和后台之间做一个配合,当文件被复制到服务器之后,将服务器端的文件再拷贝到被内地。
前台代码块如下:
$.ajax({
async: true,
type: "POST",
url: "/dialOutTask/dialOutTaskAction_getDialOutTaskListInfo.action",
data: params,
success: function(result) {
alert(result);
if(result!=""){
var downUrl="/dialOutTask/dialOutTaskAction_loadDialOutTaskListInfo.action?downFlag="+result;
global_virable.exportJudgeFlag = true;
window.location.href = downUrl;
}
}
});
对应的后台将文件获取到浏览器端代码详细如下:
public void loadDialOutTaskListInfo(){
try {
String fileName =java.net.URLDecoder.decode(downFlag,"UTF-8");
String url = DialOutTaskAction.class.getResource("").getPath().replaceAll("%20", " ");
String tem_path = url.substring(0, url.indexOf("WEB-INF"))+File.separator+UPLOADFILE_FOLDER+File.separator+EXCEL;
String path = tem_path +File.separator+fileName;
//down the file
HttpServletResponse response = getResponse();
//long startIndex = 0l;
//long endIndex = 0l;
//startIndex = System.currentTimeMillis();
File file = new File(path);
StringBuffer sb = new StringBuffer();
// sb.append("attachment; filename=").append(path);
sb.append("attachment; filename=").append(fileName);
response.setHeader("Expires", "0");
response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/x-msdownload;charset=UTF-8");
response.setHeader("Content-Disposition", new String( sb.toString().getBytes("GBK"), "ISO-8859-1"));
FileInputStream inputStream = new FileInputStream(file);
InputStream inBuffer = new BufferedInputStream(inputStream);
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[1024];
int i = -1;
while ((i = inBuffer.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
outputStream.flush();
}
//endIndex = System.currentTimeMillis();
//log.info("导出部分(使用了buffer)用时:"+ (endIndex - startIndex) +"毫秒");
outputStream.flush();
inputStream.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
log.error("************ServiceItemAction******downServiceItemExport******error:***********************"+e.getMessage());
}
}