package com.kym.service.admin.impl;

import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.kym.service.admin.ExportService;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;

/**
 * @author skyline
 * @description
 * @date 2023-09-25 17:43
 */
@Service
public class ExportServiceImpl implements ExportService {
    @SneakyThrows
    @Override
    public void exportExcel(String fileName, ExcelWriter writer, List<HashMap<String, Object>> rows, HttpServletResponse response) {
        var filename = new String(fileName.concat(".xls").getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
        // 默认的，未添加alias的属性也会写出，如果想只写出加了别名的字段，可以调用此方法排除之
        writer.setOnlyAlias(true);
        // 合并单元格后的标题行，使用默认标题样式 从0开始计算
        writer.merge(writer.getHeaderAlias().size() - 1, fileName);
        // 一次性写出内容，使用默认样式，强制输出标题
        writer.write(rows, true);
        // 自适应列宽 必须在列数据写出后调用
        writer.autoSizeColumnAll();
        //out为OutputStream，需要写出到的目标流
        //response为HttpServletResponse对象
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8));
        ServletOutputStream out = response.getOutputStream();

        writer.flush(out, true);
        // 关闭writer，释放内存
        writer.close();
        //此处记得关闭输出Servlet流
        IoUtil.close(out);
    }
}
