1.导出文件的工具类
package com.sszt.demo.util;
import java.io.BufferedOutputStream;
import java.text.MessageFormat;
import java.util.Calendar;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 导出文件文件的工具类
*/
public class ExportTextUtil {
/**
* 声明日志记录器
*/
private static final Logger LOGGER = LoggerFactory.getLogger(ExportTextUtil.class);
/**
* 导出文本文件
* @param response
* @param jsonString
* @param fileName
*/
public static void writeToTxt(HttpServletResponse response,String jsonString,String fileName) {//设置响应的字符集
response.setCharacterEncoding("utf-8");
//设置响应内容的类型
response.setContentType("text/plain");
//设置文件的名称和格式
response.addHeader(
"Content-Disposition",
"attachment; filename="
+ FileUtil.genAttachmentFileName(fileName+ "_", "JSON_FOR_UCC_")
+ MessageFormat.format("{0,date,yyyy-MM-dd HH:mm:ss}", new Object[]{Calendar.getInstance().getTime()})
+ ".txt");//通过后缀可以下载不同的文件格式
BufferedOutputStream buff = null;
ServletOutputStream outStr = null;
try {
outStr = response.getOutputStream();
buff = new BufferedOutputStream(outStr);
buff.write(delNull(jsonString).getBytes("UTF-8"));
buff.flush();
buff.close();
} catch (Exception e) {
LOGGER.error("导出文件文件出错,e:{}",e);
} finally {try {
buff.close();
outStr.close();
} catch (Exception e) {
LOGGER.error("关闭流对象出错 e:{}",e);
}
}
}
/**
* 如果字符串对象为 null,则返回空字符串,否则返回去掉字符串前后空格的字符串
* @param str
* @return
*/
public static String delNull(String str) {
String returnStr="";
if (StringUtils.isNotBlank(str)) {
returnStr=str.trim();
}
return returnStr;
}
}
package com.sszt.demo.util;
public abstract class FileUtil {
/**
* 生成导出附件中文名。应对导出文件中文乱码
* <p>
* response.addHeader("Content-Disposition", "attachment; filename=" + cnName);
*
* @param cnName
* @param defaultName
* @return
*/
public static String genAttachmentFileName(String cnName, String defaultName) {
try {
// fileName = URLEncoder.encode(fileName, "UTF-8");
cnName = new String(cnName.getBytes("gb2312"), "ISO8859-1");
/*
if (fileName.length() > 150) {
fileName = new String( fileName.getBytes("gb2312"), "ISO8859-1" );
}
*/
} catch (Exception e) {
cnName = defaultName;
}
return cnName;
}
}
2.在jsp页面添加一个按钮,点击触发以下事件
function exportTicket(id){
window.open('back/sale/exportTicket/'+id, '_blank');
};
3.Controller层接收请求,调用service层获取数据,拼接文本内容,然后使用上面的工具响应页面以获得下载的文本文件
@RequestMapping("/exportTicket/{orderId}")
public void exportText(@PathVariable Integer orderId, HttpServletResponse resp) {
// 通过orderId查出对应的销售明细
String text = saleService.list(orderId);
// 将集合转换成字符串
ExportTextUtil.writeToTxt(resp, text, "saleDetail");
}
public String list(Integer orderId) {
String hql="FROM Sale WHERE o_id=?";
List<Object> args=new ArrayList<>();
args.add(orderId);
// 通过orderId查出对应的销售明细
List<Sale> list = saleDao.list(hql, args);
//查询order信息
SaleOrder order = orderDao.dtl(orderId);
//拼接字符串,构成小票内容
StringBuffer ticket = new StringBuffer();
ticket.append("\t\t果农家园水果超市\r\n");
ticket.append("店铺号:"+ order.getBaseOrgName()+"\t收银员:" + order.getSaler()+"\r\n");
ticket.append("订单号:" + order.getId()+"\r\n");
ticket.append("===================================\r\n");
ticket.append("名称\t");
ticket.append("单价\t");
ticket.append("数量\t");
ticket.append("总额\r\n");
for (Sale sale : list) {
ticket.append(sale.getFruitName() + "-" + sale.getFruitQuality()+"\t");
ticket.append(sale.getPrice() + "\t\t");
ticket.append(sale.getQuantity() + "\t\t");
ticket.append(sale.getTotal() +"\r\n");
}
ticket.append("售出商品数:" + list.size() + "件\t");
ticket.append("合计:" + order.getAmount() + "元\r\n");
ticket.append("实收:" + order.getPay() + "元\t");
ticket.append("找零:" + order.getChange() + "元\r\n");
ticket.append("时间:" + Calendar.getInstance().getTime().toLocaleString()+"\r\n");
ticket.append("===================================\r\n");
ticket.append("\t\t天天平价,日日新鲜\r\n");
ticket.append("钱票请当面点清,离开柜台恕不负责");
return ticket.toString();
}