esayExcel导出工具类

依赖

<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>easyexcelartifactId>
    <version>3.1.0version>
dependency>

工具类

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 org.apache.poi.ss.usermodel.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;

/**
 * Excel 导出工具类
 */
public class EsayExcelUtil {
   
    /**
     * Excel 导出
     * @param list:导出数据集合
     * @param clazz:导出类型的class对象
     * @param response:响应对象
     * @param fileName:文件名称
     * @param sheetName:sheet页对象
     */
    public static Boolean writeExcel(List list, Class clazz, HttpServletResponse response, String fileName, String sheetName) throws IOException {
        String file = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + file);
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = response.getOutputStream();

        // 获取自定义单元格样式综合策略(表头 + 内容)对象
        HorizontalCellStyleStrategy cellStyleStrategy = createStyle();
        try {
            EasyExcel.write(outputStream, clazz)                // 参数1:输出流对象  参数2:实体类的class对象
                    .registerWriteHandler(cellStyleStrategy)    // 设置单元格样式
                    .sheet(sheetName)                           // sheet页名称
                    .doWrite(list);                             // 导出的数据集合
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            outputStream.flush();
            outputStream.close();
        }
    }

    /**
     * Excel 导出 -- 忽略sheet页名称
     * @param list 导出数据集合
     * @param clazz 类型
     * @param response HttpServletResponse
     * @param fileName 文件名称
     */
    public static Boolean writeExcel(List list, Class clazz, HttpServletResponse response, String fileName) throws Exception {
        String file = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + file);
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = response.getOutputStream();
        try {
            EasyExcel.write(outputStream, clazz).sheet().doWrite(list);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            outputStream.flush();
            outputStream.close();
        }
    }
    

    /**
     * Excel 导出 -- 自动生成文件名称
     * @param list:导出数据集合
     * @param clazz:导出类型的class对象
     * @param response:响应对象
     */
    public static Boolean writeExcel(List list, Class clazz, HttpServletResponse response) throws Exception {
        String fileName = System.currentTimeMillis() + "";
        return writeExcel(list, clazz, response, fileName);
    }

	/**
     * Excel 导出 -- 动态表头
     * @param list:导出数据集合
     * @param head:动态表头集合
     * @param response:响应对象
     * @param fileName:导出的文件名称
     */
    public static Boolean writeExcel(List list, List<List<String>> head, HttpServletResponse response, String fileName) throws IOException {
        String file = URLEncoder.encode(fileName + ".xlsx", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + file);
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = response.getOutputStream();
        try {
            EasyExcel.write(outputStream)
                    .head(head)     // 动态表头
                    .sheet()
                    .doWrite(list);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            outputStream.flush();
            outputStream.close();
        }
    }


    /**
     * 自定义单元格样式
     * @return :单元格样式策略对象
     */
    private static HorizontalCellStyleStrategy createStyle(){
        WriteCellStyle titleStyle = new WriteCellStyle();       // 表头格式对象
        WriteCellStyle dataStyle = new WriteCellStyle();        // 表格格式对象

        // 以下只针对表头格式,表格格式同理
        titleStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);      // 水平居中对齐
        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);          // 垂直居中
        titleStyle.setWrapped(false);                                       // 自动换行
        titleStyle.setFillForegroundColor(IndexedColors.WHITE.index);       // 单元格背景颜色

        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色
        // dataStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); (表头默认了 FillPatternType所以可以不指定。)

        // 字体样式设置
        WriteFont font = new WriteFont();
        font.setFontName("楷体");                     // 字体
        font.setFontHeightInPoints((short) 15);       // 大小
        font.setColor(IndexedColors.RED.index);       // 颜色
        font.setBold(true);                           // 加粗
        font.setItalic(false);                         // 斜体
        font.setStrikeout(false);                      // 过期横线
        titleStyle.setWriteFont(font);

        // 设置单元格边框样式
//        setBorderStyle(titleStyle);

        // 单元格格式策略对象(表头 + 内容)
        return new HorizontalCellStyleStrategy(titleStyle, dataStyle);
    }
    
    /**
     * 设置边框样式
     */
    private static void setBorderStyle(WriteCellStyle style){
        style.setBorderTop(BorderStyle.THIN);               // 上边框样式
        style.setBorderBottom(BorderStyle.THIN);            // 下边框样式
        style.setBorderLeft(BorderStyle.THIN);              // 左边框样式
        style.setBorderRight(BorderStyle.THIN);             // 右边框样式

        style.setTopBorderColor(IndexedColors.BLUE.index);      // 上边框颜色
        style.setBottomBorderColor(IndexedColors.BLUE.index);   // 下边框颜色
        style.setLeftBorderColor(IndexedColors.BLUE.index);     // 左边框颜色
        style.setRightBorderColor(IndexedColors.BLUE.index);    // 右边框颜色
    }
}



测试一下

第一步:创建导出的对象

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 注解 @HeadRowHeight(15):       表头的行高 -- 15
 * 注解 @ContentRowHeight(20):    内容的行高 -- 20
 * 注解 @ColumnWidth(10):         单元格列宽 -- 10 (可以放在属性名上面,会覆盖掉类上的注解)
 * 注解 @ExcelProperty(value = "姓名", index = 0):
 *      value:表头 -- 姓名
 *      index:第几列 -- 0
 * 注解 @ExcelProperty(value = {"主标题","子标题1"})
 * 注解 @ExcelProperty(value = {"主标题","子标题2"})
 *      合并单元格
 */

@Data                       // lombok注解:getter/setter方法
@NoArgsConstructor          // 无参构造
@AllArgsConstructor         // 全参构造
@HeadRowHeight(15)          // 表头的行高
@ContentRowHeight(20)       // 内容的行高
@ColumnWidth(10)            // 列宽 -- (可以放在属性名上面,会覆盖掉类上的注解)
public class Student {

    @ExcelProperty(value = "姓名", index = 0)
    private String name;

    @ExcelProperty(value = "年龄", index = 2)
    private Integer age;

    @ExcelProperty(value = "地址", index = 4)
    private String address;
}

第二步:写测试接口

import org.springframework.stereotype.Controller;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@RequestMapping("/excel")
@Controller
public class ExcelController {

    @GetMapping("/test")
    public void test(HttpServletResponse response) throws Exception {
        List<Student> data = getData();
        EsayExcelUtil.writeExcel(data, Student.class, response);
    }

	/**
     * 测试用的假数据
     */
    private List<Student> getData(){
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 23, "北京"));
        list.add(new Student("李四", 24, "上海"));
        list.add(new Student("王五", 25, "杭州"));
        return list;
    }

第三步:启动项目,访问接口

如图:
esayExcel导出工具类_第1张图片

测试动态表头

import org.springframework.stereotype.Controller;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@RequestMapping("/excel")
@Controller
public class ExcelController {

    @GetMapping("/test")
    public void test(HttpServletResponse response) throws Exception {
        String fileName = "测试Excel导出";
        List<Student> data = getData();
        List<List<String>> head = getHead();
        EsayExcelUtil.writeExcel(data, head, response, fileName);
    }

	/**
     * 动态表头假数据
     */
    public static List<List<String>> getHead(){
        List<List<String>> list = new ArrayList<>();
        List<String> head1 = new ArrayList<>();
        head1.add("我是姓名");
        List<String> head2 = new ArrayList<>();
        head2.add("我是年龄");
        List<String> head3 = new ArrayList<>();
        head3.add("我是地址");

        list.add(head1);
        list.add(head2);
        list.add(head3);
        return list;
    }

	/**
     * 测试用的假数据
     */
    private List<Student> getData(){
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 23, "北京"));
        list.add(new Student("李四", 24, "上海"));
        list.add(new Student("王五", 25, "杭州"));
        return list;
    }

结果如图
esayExcel导出工具类_第2张图片
就这样,再会!

你可能感兴趣的:(java,servlet,java,apache)