欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

导出EasyExcel设置样式的util

程序员文章站 2024-03-21 13:40:28
...
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.fastjson.JSON;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Excel工具类(采用easy excel)
 *
 * @author Fbin
 * @date 2020年9月28日
 * @annotation 高山仰止, 景行行止.虽不能至, 心向往之
 */
public class DataExcelUtils {

    /**
     * 导出简单列表excel
     *
     * @param response response
     * @param data     导出的数据list
     * @param clazz    实体类的字节码
     */
    public static void export(HttpServletResponse response, String fileName, List data, Class clazz) throws IOException {
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName+".xls", "UTF-8"));
            response.setHeader("Access-Control-Expose-Headers", "Content-disposition");
            //头的策略  样式调整
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
            // 头背景设置为天空蓝(颜色不好看,我又改成白色了)
            headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
            //浅绿 headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex());
            WriteFont headWriteFont = new WriteFont();
            headWriteFont.setFontHeightInPoints((short)11);
            // 字体样式
            headWriteFont.setFontName("宋体");
            headWriteCellStyle.setWriteFont(headWriteFont);
            //自动换行
            headWriteCellStyle.setWrapped(true);
            //设置细边框
            headWriteCellStyle.setBorderBottom(BorderStyle.THIN);
            headWriteCellStyle.setBorderLeft(BorderStyle.THIN);
            headWriteCellStyle.setBorderRight(BorderStyle.THIN);
            headWriteCellStyle.setBorderTop(BorderStyle.THIN);
            //设置边框颜色 25灰度
            headWriteCellStyle.setBottomBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
            headWriteCellStyle.setTopBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
            headWriteCellStyle.setLeftBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
            headWriteCellStyle.setRightBorderColor(IndexedColors.GREY_25_PERCENT.getIndex());
            // 水平对齐方式
            headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
            // 垂直对齐方式
            headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            // 内容的策略 宋体
            WriteCellStyle contentStyle = new WriteCellStyle();
            WriteFont contentWriteFont = new WriteFont();
            contentWriteFont.setFontHeightInPoints((short)10);
            // 字体样式
            contentWriteFont.setFontName("宋体");
            contentStyle.setWriteFont(contentWriteFont);
            // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
            HorizontalCellStyleStrategy strategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentStyle);
            // 每隔2行会合并 把eachColumn 设置成 3 也就是我们数据的长度,所以就第一列会合并。当然其他合并策略也可以自己写
            //LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 0);
            EasyExcel.write(response.getOutputStream(), clazz).registerWriteHandler(strategy)
                    .sheet("sheet1").doWrite(data);
        } catch (Exception e) {
            e.printStackTrace();
            //重置response,出错响应给浏览器页面
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = new HashMap<>(2);
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }
    }
}