大概是一个多月前写的东西了,发出来做个备份,以备后续查看。产生的背景是需要对商户交易明细进行下载,但是涉及的地方很多所以就没有写VO类直接返回了JsonObject。然后将JsonObject导出为Excel,并进行下载。具体代码如下:
1、Service:
Service
@Override
public Object getOrderDetail(HttpServletResponse response, @PathVariable(name = "startDate")String startDate, @PathVariable(name = "endDate")String endDate, String qklAddress) {
List<Map<String, String>> merchantOrderList = new ArrayList<>();
//获取所有商户信息
ArrayList<Object> merchantList = obtainMerchantInfo();
//获取所有商户交易明细(如果区块链地址为空取出所有商户否则取出指定商户)
List<JSONObject> merchantDetail = merchantQklAccountDetialMapper.queryMerchantDetail(startDate, endDate, qklAddress);
//关联商户信息和交易明细
merchantList.forEach(ml -> {
List<String> list = ConvertUtil.castList(ml, String.class);
String merchantName = list.get(0);
String address = list.get(2);
//组装商户数据
merchantDetail.forEach(md->{
//如果交易网关中商户区块链地址等于积分商户区块链地址
if (address.equals(md.getStr("address"))){
HashMap<String, String> merchantMap = new LinkedHashMap<>();
String orderId = md.getStr("orderId");
String amount = md.getStr("amount");
String createTime = md.getStr("createTime");
String remark = md.getStr("remark");
merchantMap.put("orderId",orderId);
merchantMap.put("merchantName",merchantName);
merchantMap.put("amount",amount);
merchantMap.put("createTime",createTime);
merchantMap.put("remark",remark);
merchantOrderList.add(merchantMap);
}
});
});
//标题列表
List<String> titleList = new ArrayList<>();
titleList.add("流水号");
titleList.add("商户名称");
titleList.add("积分数量");
titleList.add("发生时间");
titleList.add("订单结果");
//字段列表
List<String> zdList = new ArrayList<>();
zdList.add("orderId");
zdList.add("merchantName");
zdList.add("amount");
zdList.add("createTime");
zdList.add("remark");
//文件存放路径
String annexPath = GlobalConstant.ONLINE_ANNEX;
String fileName = "MarkMerchantDetail - " + DateUtil.date().toString().replaceAll("[^0-9]","") + ".xls";
//表格处理
ExcelUtil.createExcel(annexPath, fileName, titleList, zdList, merchantOrderList);
// //邮件发送
// MailUtil.send(GlobalConstant.MAILBOX, "请您查收积分商户交易明细" + fileMouth + "月数据" , "本邮件是系统自动发送,请勿回复。", false, FileUtil.file(filePath + fileName));
//浏览器下载文件
byte[] bytes = FileUtil.readBytes(annexPath + fileName);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("application", "vnd.ms-excel"));
headers.setContentDispositionFormData("attachment", fileName);
headers.setAcceptCharset(Arrays.asList(StandardCharsets.UTF_8));
return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
}
2、Controller:
Controller
@ApiOperation("获取商户订单明细(下载)")
@GetMapping(value = "getOrderDetail", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public Object getOrderDetail(HttpServletResponse response, @Param("startDate")String startDate, @Param("endDate")String endDate, String qklAddress){
return merchantQklAccountDetialService.getOrderDetail(response, startDate, endDate, qklAddress);
}
3、ExcelUtil:
ExcelUtil
package com.demo.utils;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @Author zf
* @ClassName ExcelUtil.java
* @ProjectName demo
*/
public class ExcelUtil {
/**
* 生成Excel 并放到指定位置
*
* @param filepath 文件路径(要绝对路径)
* @param filename 文件名称 (如: demo.xls 记得加.xls)
* @param titleList 标题名称list
* @param zdList 字段list
* @param datalist 数据list
* @return 是否正常生成
* @throws IOException
* @author: zf
* (titleList和zdList顺序要一致, 保持一一对应。)
*/
public static boolean createExcel(String filepath, String filename, List<String> titleList, List<String> zdList, List<Map<String,String>> datalist) {
boolean success = false;
try {
//创建HSSFWorkbook对象(excel的文档对象)
HSSFWorkbook wb = new HSSFWorkbook();
// 建立新的sheet对象(excel的表单)
HSSFSheet sheet = wb.createSheet("sheet1");
// 在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
HSSFRow row0 = sheet.createRow(0);
// 添加表头
for (int i = 0; i < titleList.size(); i++) {
row0.createCell(i).setCellValue(titleList.get(i));
}
//添加表中内容
for (int row = 0; row < datalist.size(); row++) {//数据行
//创建新行
HSSFRow newRow = sheet.createRow(row + 1);//数据从第二行开始
//获取该行的数据
@SuppressWarnings("unchecked")
Map<String, String> data = datalist.get(row);
for (int col = 0; col < zdList.size(); col++) {//列
//数据从第一列开始
//创建单元格并放入数据
newRow.createCell(col).setCellValue(data != null && data.get(zdList.get(col)) != null ? String.valueOf(data.get(zdList.get(col))) : "");
}
}
//判断是否存在目录. 不存在则创建
isChartPathExist(filepath);
//输出Excel文件1
FileOutputStream output = new FileOutputStream(filepath + filename);
wb.write(output);//写入磁盘
output.close();
success = true;
} catch (Exception e) {
success = false;
e.printStackTrace();
}
return success;
}
/**
* 判断文件夹是否存在,如果不存在则新建
*
* @param dirPath 文件夹路径
*/
private static void isChartPathExist(String dirPath) {
File file = new File(dirPath);
if (!file.exists()) {
file.mkdirs();
}
}
}
4、对象转换工具类:
ConvertUtil
package com.demo.utils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author zf
* @ClassName ConvertUtil.java
* @ProjectName demo
*/
public class ConvertUtil {
/**
* @Description map对象转字符串转map
* @param str 要转换的字符串
* @return java.util.Map
*/
public static Map strToMap(String str){
String[] string = str.split(",");
Map<String, String> map = new HashMap<>();
for(String s:string){
String[] ms = s.split("=");
map.put(ms[0].trim(), ms[1]);
}
return map;
}
/**
* @Description json对象转字符串转map
* @param str 要转换的字符串
* @return java.util.Map
*/
public static Map jsonStrToMap(String str){
String[] string = str.split(",");
Map<String, String> map = new HashMap<>();
for(String s:string){
String[] ms = s.split(":");
map.put(ms[0].trim(), ms[1]);
}
return map;
}
/**
* @Description Object转换为list
* @param obj
* @param clazz
*/
public static <T> List<T> castList(Object obj, Class<T> clazz)
{
List<T> result = new ArrayList<T>();
if(obj instanceof List<?>)
{
for (Object o : (List<?>) obj)
{
result.add(clazz.cast(o));
}
return result;
}
return null;
}
}