导出列表,主要分为两个步骤,(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());
            }
    }