大概是一个多月前写的东西了,发出来做个备份,以备后续查看。产生的背景是需要对商户交易明细进行下载,但是涉及的地方很多所以就没有写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;
    }

}

最后修改:2022 年 10 月 11 日
给我一点小钱钱也很高兴啦!o(* ̄▽ ̄*)ブ