前端代码:

function f_pfgjdc() {
       var kmdm=$("#kmdm").val();
       if(kmdm==null||kmdm==""){
           alert("请先选择科科目");
           return;
       }
       if(!confirm("你确定要导出科目的判分轨迹吗?")){
           return;
       }
       //$("#loadingImage").css("display","block");
       $("#kmxxForm").attr("target","fileDownloadFrame");
       //使用表单提交
       $("#kmxxForm").attr("action","cjgl.do?method=expKmPfgj&kmdm="+kmdm);
       $("#kmxxForm").submit();
   }

逻辑层代码:

public ActionForward expKmPfgj(ActionMapping mapping, ActionForm form,
								   HttpServletRequest request, HttpServletResponse response) {
		String msg=null;		//提示信息
		String sql="";			//sql细分档
		List<HashMap<String, Object>> dataListXf;//查询的结果存入这个List
		SystemBusiness utils=new SystemBusiness();	 //工具类,在下面会贴代码
		response.setContentType("application/json;charset=gb2312");
		try{
			String kmdm=request.getParameter("kmdm");
			if(kmdm==null){
				msg="缺少科目参数!";
				return utils.actionReturnErrorPage(mapping, request, msg, "actFwdRs");
			}
			//获取科目名称
			HashMap kmMap=(HashMap)IbatisDAO.getObjectByIbatis("getKmxxByKmdm_kmdm", kmdm);
			String kmmc=kmMap==null?"":kmMap.get("KMMC").toString();
			//先从Java里把DBF的信息定义好
			List<String> dbfColList=new ArrayList<String>();	//dbf字段名
			List<String> dbfColMeanList=new ArrayList<String>();	//dbf字段含义
			List<String> dbfColTypeList=new ArrayList<String>();	//dbf字段类型
			List<Integer> dbfColLenList=new ArrayList<Integer>();	//dbf字段长度
			//赋值
			dbfColList.add("bmh");
			dbfColMeanList.add("保密号");
			dbfColTypeList.add("c");
			dbfColLenList.add(40);

			dbfColList.add("kmdm");
			dbfColMeanList.add("科目代码");
			dbfColTypeList.add("c");
			dbfColLenList.add(15);

			dbfColList.add("zt");
			dbfColMeanList.add("状态");
			dbfColTypeList.add("c");
			dbfColLenList.add(5);

			dbfColList.add("yh");
			dbfColMeanList.add("用户");
			dbfColTypeList.add("c");
			dbfColLenList.add(5);

			dbfColList.add("sj");
			dbfColMeanList.add("判分时间");
			dbfColTypeList.add("c");
			dbfColLenList.add(32);

			dbfColList.add("pf");
			dbfColMeanList.add("判分");
			dbfColTypeList.add("c");
			dbfColLenList.add(10);

			dbfColList.add("scsj");
			dbfColMeanList.add("生成时间");
			dbfColTypeList.add("c");
			dbfColLenList.add(30);

			dbfColList.add("ksh");
			dbfColMeanList.add("考生号");
			dbfColTypeList.add("c");
			dbfColLenList.add(20);
			//查询数据的SQL,这里要和上面赋值的保持同步
			sql = "select b.bmhh,a.kmdm,a.zt,a.yh,to_char(a.sj,'yyyy-mm-dd hh24:mi:ss') sj,a.pf,to_char(a.scsj,'yyyy-mm-dd hh24:mi:ss') scsj,b.ksh from T_PFJD a,T_SJJD b where a.kmdm='"+kmdm+"' and a.kmdm=b.kmdm and a.bmh=b.bmh order by a.bmh,a.yh";
			dataListXf=IbatisDAO.getListByIbatis("getHashMap_ibatis", sql);
			//获取文件位置(临时路径)
			String fileLocString=utils.getFileTempDir(request);//调用工具类,代码下面有贴
			//生成轨迹文件(判分)
			String serverFile1=fileLocString+"\\"+kmmc+"判分轨迹.dbf";	//用户的唯一号做标记,服务器保存用
			msg=utils.writeDbf(serverFile1, dbfColList, dbfColMeanList, dbfColTypeList, dbfColLenList, dataListXf);
			if(msg!=null){//生成出错
				return utils.actionReturnErrorPage(mapping, request, msg, "actFwdRs");
			}

			//生成DBF字段说明文件
			String serverFile2=fileLocString+"\\"+kmmc+"判分轨迹字段说明.txt";
			List<String> textList=new ArrayList<String>();//写入内容
			textList.add("dbf字段含义说明");
			textList.add("");
			for(int i=0;i<dbfColList.size();i++){
				String text=dbfColList.get(i)+" : "+dbfColMeanList.get(i);
				textList.add(text);
			}
			//创建txt文件
			boolean lb_ret=utils.writerTxt(serverFile2,textList);
			if(!lb_ret){
				msg="创建字段说明文件时发生异常!";
				return utils.actionReturnErrorPage(mapping, request, msg, "actFwdRs");
			}
			//打包生成zip
			List<String> fileList=new ArrayList<String>();
			fileList.add(serverFile1);
			fileList.add(serverFile2);
			String serverFile=fileLocString+"\\"+kmmc+"判分轨迹.zip";
			utils.createZip(serverFile, fileList);
			File file=new File(serverFile);
			if(!file.isFile() || !file.exists()){
				msg="生成下载文件失败!";
				return utils.actionReturnErrorPage(mapping, request, msg, "actFwdRs");
			}
			//下载文件
			utils.downloadFile(response, serverFile, kmmc+"判分轨迹.zip");
		}catch(Exception e){
			msg="下载时发生异常!\n"+e;
			return utils.actionReturnErrorPage(mapping, request, msg, "actFwdRs");
		}
		return null;
	}

工具类的代码(可能有点长但都是干货)

package com.oumasoft.art.manage.client.business;

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.CharSet;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

import com.linuxense.javadbf.DBFField;
import com.linuxense.javadbf.DBFReader;
import com.linuxense.javadbf.DBFWriter;
import com.oumasoft.art.manage.client.dao.IbatisDAO;
import com.oumasoft.art.manage.client.form.ErrorMsgDTO;

import java.util.regex.Matcher;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;


public class SystemBusiness{

	/**
	 * 获取用户登录的IP
	 * 
	 * @param HttpServletRequest
	 *            request
	 * @return String ip
	 * @算法:
	 */
	public String getIpAddr(HttpServletRequest request) {
		String ip = null;
		ip = request.getHeader("x-forwarded-for");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		return ip;
	}

	/**
	 * 将字符串中的换行符替换为html的<br>
	 * 
	 * @param String
	 *            srcString 待转换字符串
	 * @param String
	 *            replaceString 替换符
	 * @return String 转换后字符串
	 * @算法:
	 */
	public String convertEnter(String srcString, String replaceString)
			throws Exception {

		String reg = "[\n-\r]";
		Pattern p = Pattern.compile(reg);
		Matcher m;

		m = p.matcher(srcString);

		return m.replaceAll(replaceString);
	}
	
//	//获取当前日期
//	public String getDateNow() throws Exception{
//		String dateString=(String)IbatisDao.getObjectByIbatis("getSysdate_ibatisXML", null);	
//		return 	dateString.substring(0,10);
//	} 
	
	//字符串转日期
	public Date getDateFromStr(String strDate) throws Exception{
		return DateFormat.getDateInstance().parse(strDate);
	}
	
	//将double数据保留floats位小数,转换成字符串返回
	public String convertDouble(double d,int floats){
		if(floats==0){
			return ""+Math.round(d);
		}
		String floatStr=".";
		
		for(int i=0;i<floats;i++){
			floatStr+="#";
		}		
		DecimalFormat df=new DecimalFormat(floatStr);
		String st=df.format(d);
		return st;
	}
	
	/**
	 * ajax返回输出异常
	 * @param PrintWriter out 输出
	 * @param JSONObject retJSONObject 返回json对象
	 * @param String msg	 异常信息内容
	 */
	public void ajaxReturnError(PrintWriter out,JSONObject retJSONObject,String msg){
	
		retJSONObject.put("isMsg", true);
		retJSONObject.put("msg", msg);
		retJSONObject.put("isContinued", false);
		out.print(retJSONObject.toString());
		out.flush();
		out.close();
	}
	
	/**
	 * ajax返回session超时
	 * @param PrintWriter out 输出
	 * @param JSONObject retJSONObject 返回json对象
	 * @param String msg	 异常信息内容
	 */
	public void ajaxReturnSessionTimeout(PrintWriter out,JSONObject retJSONObject){
	
		retJSONObject.put("isMsg", true);
		retJSONObject.put("msg", "会话超时,请重新登录!");
		retJSONObject.put("isContinued", false);
		out.print(retJSONObject.toString());
		out.flush();
		out.close();
	}
	
	/**
	 * 输出时间提示
	 * @param String 需要输出的内容 
	 * yh.li@08-12-23
	 */
	public String getTime() {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String mDateTime = formatter.format(Calendar.getInstance().getTime());
		return mDateTime;
	}
	
	/**
	 * 输出时间提示
	 * @param String 需要输出的内容 
	 * yh.li@08-12-23
	 */
	public String getTime2() {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
		String mDateTime = formatter.format(Calendar.getInstance().getTime());
		return mDateTime;
	}

	/**
	 * ajax返回输出异常
	 * @param ActionMapping mapping
	 * @param HttpServletRequest request
	 * @param String msg	 异常信息内容
	 * @param int errType 异常信息类型
	 * @param int errModual 异常产生模块
	 */
	public ActionForward actionReturnError(ActionMapping mapping,HttpServletRequest request,String msg,String errModual){
	
		ErrorMsgDTO em = new ErrorMsgDTO(msg,2,errModual);
		request.getSession().setAttribute("errorMsgDTO", em);
		return mapping.findForward("error");
	}
	
	/**
	 * ajax返回输出异常
	 * @param ActionMapping mapping
	 * @param HttpServletRequest request
	 * @param String msg	 异常信息内容
	 * @param int errType 异常信息类型
	 * @param int errModual 异常产生模块
	 */
	public ActionForward actionReturnErrorPage(ActionMapping mapping,HttpServletRequest request,String msg,String forwardPage){
	
		request.setAttribute("isMsg", true);
		request.setAttribute("msg", msg);
		request.setAttribute("isContinued", false);
		
		return mapping.findForward(forwardPage);
	}
	
	/**
	 * session超时
	 * @param ActionMapping mapping
	 */
	public ActionForward actionReturnSessionTimeout(ActionMapping mapping){
	
		return mapping.findForward("error");
	}	
	
	/**
	 * null装换成""
	 * @param obj
	 * @return
	 */
	public Object nullToEmpty(Object obj){		
		return obj==null?"":obj;
	}
	

	private List<String> excelHeadList;
	
	
	/**
	 * 读取Excel文件内容,放入List中,其中第一行为标头,及数据行HashMap的key
	 * @throws Exception
	 */
	public List<HashMap<String,Object>> getExcelContent(String fileString) throws Exception{
		
		this.excelHeadList=new ArrayList<String>();
		
		File file=new File(fileString);
		if(!file.exists()){
			throw new Exception("上传文件名中可能包含无法识别的字符,请参照如下转码后的文件名“"+fileString.substring(1+fileString.lastIndexOf("\\"))+"”,对比源文件名找到特殊字符,进行修改!");
		}
		Workbook workbook=null;
		try {
			//都支持直接用流的方式创建workbook   这个地方是关键
			//workbook=Workbook.getWorkbook(new ByteArrayInputStream(file.getByteData()));
			workbook=Workbook.getWorkbook(file);
		} catch (BiffException e1) {
			throw new Exception("请检查您的excel文件格式是否正确!\n"+e1+"\n如果确认文件内容无误,可以尝试将数据拷贝至新Excel(类型97-2003(*.xls))中重试导入!");
		} catch (IOException e1) {
			throw new Exception("创建或者获取流出错!\n"+e1);
		}
		return this.getExcelContent(workbook);
	}
	
	/**
	 * @throws Exception
	 * 抛出异常  这些异常留给调用的位子处理   zk读取excel
	 */
	public List<HashMap<String,Object>> getExcelContent(Workbook workbook) throws Exception{
		
		List<HashMap<String,Object>> dataList =new ArrayList<HashMap<String,Object>>();

		Sheet[] sheets=workbook.getSheets();
		if(sheets.length<=0){
			workbook.close();
			throw new Exception("读取excel的出错,页数小于等于0");
		}
		
		Sheet sheet=workbook.getSheet(0);//读取到第一页
		if(sheet==null){
			workbook.close();
			throw new Exception("读取excel的出错,sheet 为空");
		}
		int rownum=sheet.getRows();//查看excel的行数  如果行数小于=0表示没有数据   如果页数小于1表实只有表头 都不读
		if(rownum<=0){
			workbook.close();
			throw new Exception("导入的文件为空值");
		}else if(rownum==1){
			workbook.close();
			throw new Exception("导入的文件只有表头");
		}
		
		 int colnum=sheet.getColumns();//列数

		 Cell[] cbiaot=sheet.getRow(0);//表头
		 
		 for(int i=0;i<cbiaot.length;i++){//循环把表头存入列表中
			 if(cbiaot[i]==null){	//读到空值就返回了
				 break;
			 }
			 String value=cbiaot[i].getContents();
			 value=(value==null?"":value.trim());
			 if("".equals(value)){	//读到空值就返回了
				 break;				 
			 }else{
				 this.excelHeadList.add(value);
			 }
		 }		 
		 if(cbiaot.length!=colnum){
			 workbook.close();
			 throw new Exception("导入的文件表头的列数和文件列数不匹配请检查");
		 }
		 
		 for(int i=1;i<rownum;i++){//循环行数
			 HashMap<String,Object> rowMap=new HashMap<String,Object>();
			 
			 Cell[] dd = new Cell[colnum];
			 Cell[] ddTmp = sheet.getRow(i);
			 if(ddTmp==null||ddTmp.length==0||"".equals(ddTmp[0].getContents())){
				 break;	//遇到空行读取数据结束
			 }
			 if(dd.length==ddTmp.length){
				 dd=ddTmp;
			 }else{
				 if(ddTmp.length<dd.length){	//数据行数少,则以空值填充
					 for(int j=0;j<ddTmp.length;j++){
						 dd[j]=ddTmp[j];
					 }
					 for(int j=ddTmp.length;j<dd.length-ddTmp.length;j++){
						 dd[j]=null;
					 }
				 }else{
					 for(int j=0;j<dd.length;j++){
						 dd[j]=ddTmp[j];
					 }					 
				 }
			 }
			 for(int j=0;j<dd.length;j++){//循环列数 取出每个单元格的值  这些值拿起用就行了 放入hashmap
				 if(dd[j]==null){
					 rowMap.put(cbiaot[j].getContents(), "");
				 }else{
					 rowMap.put(cbiaot[j].getContents(), dd[j].getContents()==null?"":dd[j].getContents().trim()); 
				 }				 
			 }
			 dataList.add(rowMap);
		}
		if(dataList.size()==0){
			workbook.close();
			throw new Exception("导入文件中数据行为空,请检查!");
		}
		workbook.close();
		return dataList;
	}
	
	/** 获取表头的list<String>
	 * @return
	 * @throws Exception
	 */
	public List<String> getExcelHeadList() throws Exception{
		if(this.excelHeadList==null||this.excelHeadList.size()<=0){
			throw new Exception("读取Excel失败!无法获取表头信息!");
		}
		return excelHeadList;
	}
	
	/**
	 * 判断是否存在中文字符
	 * @param str
	 * @return 
	 */
	public boolean isChs(String str) {
		boolean mark = false;
		Pattern pattern = Pattern.compile("[\u4E00-\u9FA5]");
		Matcher matc = pattern.matcher(str);
		StringBuffer stb = new StringBuffer();
		while (matc.find()) {
			mark = true;
			stb.append(matc.group());
		}
		return mark;
	}
	
	/**
	 * 删除某路径下包含某序列名的多个文件
	 * @param dir 
	 * @param fileName
	 * @throws Exception
	 */
	public void deleteMutiFileInDir(String dir,String fileNameFilter) throws Exception {
		File fileDir=new File(dir);
		if(fileDir.isDirectory()){
			File[] fileList=fileDir.listFiles();
			for(int i=0;i<fileList.length;i++){
				File fl=fileList[i];
				if (fl.isFile()) {
					if(fl.getName().indexOf(fileNameFilter)>=0){
						try{
							fl.delete();							
						}catch(Exception e){
							throw new Exception("删除原先生成的旧数据时发生异常!\n"+e);
						}
						i --;						
					}
				}
			}
		}
	}
	
	/**
	 * 新建项目对象单元格
	 * @param id  int id
	 * @param idFrom  int id来源 0项目代码表 1上级项目代码表
	 * @param xmmc  String 项目名称
	 * @param sxh int 顺序号(如果是上级,则为下级项目的最小顺序号)
	 * @param maxSxh int 下级项目的最大顺序号
	 * @param sjxmdm int 上级项目代码(没有上级则为0)
	 * @param hjbz int 合计标志
	 * @param colSpan int 列合并
	 * @param colSpan int 列合并
	 * @return JSONObject 单元格数据对象
	 * yh.li@2015-04-15
	 */
	private JSONObject newXmObjCell(int id,int idFrom,String xmmc,int sxh,int maxSxh,int sjxmdm,int hjbz,int colSpan,int rowSpan){
		JSONObject obj=new JSONObject();
		obj.put("id", id);
		obj.put("idFrom", idFrom);
		obj.put("xmmc", xmmc);
		obj.put("sxh", sxh);
		obj.put("maxSxh", maxSxh);
		obj.put("sjxmdm", sjxmdm);
		obj.put("hjbz", hjbz);
		obj.put("colSpan", colSpan);
		obj.put("rowSpan", rowSpan);
		return obj;
	}
	
	/**
	 * 从服务器某地址下载文件
	 * @param response  HttpServletResponse 
	 * @param fileLoc  String 文件所在位置 绝对路径+文件名+后缀
	 * @param fileName  String 保存文件显示的文件名+后缀
	 * yh.li@2015-04-22
	 * @算法:来自网上,进行参数传递的改造
	 */
	public void downloadFile(HttpServletResponse response,String fileLoc,String fileName) throws Exception{
		response.reset();//可以加也可以不加
		response.setContentType("application/x-download");		
		String filedisplay =  URLEncoder.encode(fileName,"UTF-8");	//"给用户提供的下载文件名";
		response.addHeader("Content-Disposition","attachment;filename=" + filedisplay);
		
		java.io.OutputStream outp = null;
		java.io.FileInputStream in = null;
		try
		{
		outp = response.getOutputStream();
		in = new FileInputStream(fileLoc);	
		
		byte[] b = new byte[1024];
		int i = 0;
		
		while((i = in.read(b)) > 0)
		{
		outp.write(b, 0, i);
		}
		//  
		outp.flush();
		//要加以下两句话,否则会报错
		//java.lang.IllegalStateException: getOutputStream() has already been called for //this response  
//		out.clear();
//		out = pageContext.pushBody();
		}
		catch(Exception e)
		{
			throw e;
		}
		finally
		{
		if(in != null)
		{
		in.close();
		in = null;
		}
		//这里不能关闭  
		//if(outp != null)
		//{
		//outp.close();
		//outp = null;
		//}
	  }		
		
	}
	
	/**
	 * @描述:导出DBF文件
		@param	List<String> dbfColList=new ArrayList<String>();	//dbf字段名
		@param	List<String> dbfColMeanList=new ArrayList<String>();	//dbf字段含义
		@param	List<String> dbfColTypeList=new ArrayList<String>();	//dbf字段类型
		@param	List<Integer> dbfColLenList=new ArrayList<Integer>();	//dbf字段长度
	 * @param sql 检索数据的sql语句
	 * @return String 返回的信息
	 * @作者: 
	 * @创建日期: 
	 */
	public String writeDbf(String dbfFilePath,List<String> dbfColList,List<String> dbfColMeanList,List<String> dbfColTypeList,List<Integer> dbfColLenList, List<HashMap<String, Object>> dataList) {
		String retMsg = null;

		// 参数判空
		if ("".equals(dbfFilePath) || dbfFilePath == null) {
			return "导出文件路径错误!";
		}
		if (dbfColList.size()==0) {
			return "导出dbf字段列表为空!";
		}
		if (dbfColList.size() != dbfColMeanList.size()
				||dbfColList.size() != dbfColTypeList.size()
				||dbfColList.size() != dbfColLenList.size()) {
			
			return "导出dbf各属性列表长度不一致!";
		}

		DBFWriter writer = new DBFWriter();
		FileOutputStream fos = null;
		try {
			// 获得数据库内字段个数
			int columncount = dbfColList.size();
			DBFField fields[]=new DBFField[columncount];		
			
			for (int i = 0; i < columncount; i++) {
				fields[i] = new DBFField();
				fields[i].setName(dbfColList.get(i));
				if("c".equals(dbfColTypeList.get(i).toLowerCase())){
					fields[i].setDataType(DBFField.FIELD_TYPE_C);
					fields[i].setFieldLength(dbfColLenList.get(i));
				}else if("d".equals(dbfColTypeList.get(i).toLowerCase())){
					fields[i].setDataType(DBFField.FIELD_TYPE_N);
					fields[i].setFieldLength(12);
					fields[i].setDecimalCount(dbfColLenList.get(i));
				}else{
					return "不支持的列类型定义"+dbfColTypeList.get(i)+"!";
				}
				
			}
			// 把字段信息写入DBFWriter实例,即定义表结构
			writer.setFields(fields);
			writer.setCharactersetName("gbk");

			// 获取数据库表中的记录条数
			int num = dataList.size();// 获取数据量

			// 定义一个对象数组,用于存放从数据库取出的每一条记录
			for (int i = 0; i < num; i++) {
				Object[] rowData = new Object[columncount];
				HashMap map = dataList.get(i);
				for (int j = 0; j < columncount; j++) {
					// 转型
					String input = null;
					// 如果获取的字段不为空 则把数据内容写入rowData
					Object data=map.get(dbfColList.get(j).toUpperCase());
					if(data==null){
						data=map.get(dbfColList.get(j).toLowerCase());
					}
					if (data != null) {
						// input = (String) map.get(dbfColList.get(j).toUpperCase());
						if(dbfColTypeList.get(j).toLowerCase().equals("c")){
							input = data.toString();
							byte[] bs = input.getBytes();
							data = new String(bs, "gbk");
						}else{
							double dataD = Double.parseDouble(data.toString());
//							if(Math.ceil(dataD)==dataD){
//								data=(int)dataD;
//							}else{
//								data=dataD;
//							}
							data=dataD;
						}						
						rowData[j] = data;
					} else {
						rowData[j] = null;
					}
				}
				// 把数据写入dbfWriter
				writer.addRecord(rowData);
			}

			// 定义输出流,并关联的一个文件
			fos = new FileOutputStream(dbfFilePath);

			// 写入数据
			writer.write(fos);

		} catch (Exception e) {
			retMsg = "从数据库中导出" + dbfFilePath + "时出现异常:" + e.getMessage();
			e.printStackTrace();
			return retMsg;
		} finally {
			try {
				fos.close();
			} catch (Exception e) {
				// retMsg += "关闭输出连接时出现异常:" + e.getMessage();
				return retMsg;
			}
		}
		return retMsg;
	}
	
	/**
	 * 获取临时文件存储所在的目录
	 * @param HttpServletRequest request
	 * @return String 路径
	 * @算法:
	 */
	public String getFileTempDir(HttpServletRequest request) throws Exception{
		
		String dir=request.getSession().getServletContext().getRealPath("临时文件");
		
		new File(dir).mkdirs();
		
		return dir;
		
	}
	
	/**
	 * 新建txt,写入内容
	 * @param txtFile txt文件绝对路径+文件名
	 * @param textList 写入内容,逐行写入
	 */
	public boolean writerTxt(String txtFile,List<String> textList)  {
		BufferedWriter fw = null;
		try {
			File file = new File(txtFile);
			boolean lb_ret=true;
			if(file.exists()){
				lb_ret=file.delete();
			}
			if(lb_ret){
				fw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, true), "UTF-8")); // 指定编码格式,以免读取时中文字符异常
				for(int i=0;i<textList.size();i++){
					fw.append(textList.get(i));
					fw.newLine();
				}
				fw.flush(); // 全部写入缓存中的内容
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			if (fw != null) {
				try {
					fw.close();
				} catch (IOException e) {
					e.printStackTrace();
					return false;
				}
			}
		}
		return true;
	}
	
	/**
     * 创建ZIP文件
     * @param sourcePath 文件或文件夹路径
     * @param zipPath 生成的zip文件存在路径(包括文件名)
	 * @throws SQLException 
     */
    public void createZip(String zipPath,List<String> fileList) throws Exception {
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        try {
            fos = new FileOutputStream(zipPath);
            zos = new ZipOutputStream(fos);       
            zos.setEncoding("gbk");
            this.writeZip(zos,fileList);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if (zos != null) {
                    zos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    private void writeZip(ZipOutputStream zos,List<String> fileList) throws SQLException {
    	for(int i = 0; i < fileList.size(); i++){
    		String filePath=fileList.get(i);
    		File file = new File(fileList.get(i));
    		
    		 if(file.exists()){
            	FileInputStream fis=null;
                DataInputStream dis=null;
                try {
                    fis=new FileInputStream(file);
                    dis=new DataInputStream(new BufferedInputStream(fis));
                    ZipEntry ze = new ZipEntry(file.getName());
                    zos.putNextEntry(ze);
                    byte [] content=new byte[8192];
                    int len;
                    while((len=fis.read(content))!=-1){
                        zos.write(content,0,len);
                        zos.flush();
                    }
                } catch (FileNotFoundException e) {
                    
                } catch (IOException e) {
                }finally{
                    try {
                        if(dis!=null){
                            dis.close();
                        }
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                }
 	        }
    	}
    }
}