Excel导出

package com.tyhb.admin.core.config;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

public  class ExcelUtils {

    /**
     * 导出多个 Sheet 页
     * @param response
     * @param sheetList 页数据
     * @param fileName 文件名
     */
    public static void exportExcel(HttpServletResponse response, List<SheetDTO> sheetList, String fileName) {
        ExcelWriter bigWriter = ExcelUtil.getBigWriter();
        // 重命名第一个Sheet的名称,不然会默认多出一个Sheet1的页
        bigWriter.renameSheet(0, sheetList.get(0).getSheetName());
        for (SheetDTO sheet : sheetList) {
            // 指定要写出的 Sheet 页
            bigWriter.setSheet(sheet.getSheetName());
            Integer[] columnWidth = sheet.getColumnWidth();
            if (columnWidth == null || columnWidth.length != sheet.getFieldAndAlias().size()) {
                // 设置默认宽度
                for (int i = 0; i < sheet.getFieldAndAlias().size(); i++) {
                    bigWriter.setColumnWidth(i, 25);
                }
            } else {
                // 设置自定义宽度
                for (int i = 0; i < columnWidth.length; i++) {
                    bigWriter.setColumnWidth(i, columnWidth[i]);
                }
            }
            // 设置字段和别名
            bigWriter.setHeaderAlias(sheet.getFieldAndAlias());
            // 设置只导出有别名的字段
            bigWriter.setOnlyAlias(true);
            // 设置默认行高
            bigWriter.setDefaultRowHeight(18);
            // 设置冻结行
            bigWriter.setFreezePane(1);
            // 一次性写出内容,使用默认样式,强制输出标题
            bigWriter.write(sheet.getCollection(), true);
            // 设置所有列为自动宽度,不考虑合并单元格
//            bigWriter.autoSizeColumnAll();
        }

        ServletOutputStream out = null;
        try {
            //response为HttpServletResponse对象
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setHeader("Content-Disposition",
                    "attachment;filename=" +
                            URLEncoder.encode(fileName + DateUtil.today() + ".xlsx", "UTF-8"));
            out = response.getOutputStream();
            bigWriter.flush(out, true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭writer,释放内存
            bigWriter.close();
        }
        //此处记得关闭输出Servlet流
        IoUtil.close(out);
    }
}

package com.tyhb.admin.core.config;

import lombok.Data;

import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
@Data
public class SheetDTO implements Serializable {

    private static final long serialVersionUID = 1L;
    
    /** sheet页名称 */
    private String sheetName;
    
    /** 字段和别名,如果使用这个,properties 和 titles可以不用处理 */
    private Map<String, String> fieldAndAlias;
    
    /** 字段 */
    private String[] properties;
    
    /** 标题/别名 */
    private String[] titles;
    
    /** 列宽 */
    private Integer[] columnWidth;
    
    /** 数据集 */
    private Collection<?> collection;

    public Map<String, String> getFieldAndAlias() {
        if (fieldAndAlias == null) {
            this.fieldAndAlias = new LinkedHashMap<String, String>();
            for (int i = 0; i < properties.length; i++) {
                fieldAndAlias.put(properties[i], titles[i]);
            }
        }
        return fieldAndAlias;
    }

    public void setFieldAndAlias(Map<String, String> fieldAndAlias) {
        this.fieldAndAlias = fieldAndAlias;
    }
	// 省略其他set get
}
    @RequestMapping("/export")
    @ResponseBody
    public void export(HttpServletResponse response){
        List<User> list = new ArrayList<>();
        list.add(new User("zhangsan","1231",new Date()));
        list.add(new User("zhangsan1","1232",new Date()));
        list.add(new User("zhangsan2","1233",new Date()));
        list.add(new User("zhangsan3","1234",new Date()));
        list.add(new User("zhangsan4","1235",new Date()));
        list.add(new User("zhangsan5","1236", DateUtil.date(new Date())));
        String [] titles = {"姓名","年龄","日期"};
        String [] columns ={"name","age","birthDay"};
        List<SheetDTO> sheetList = new ArrayList<SheetDTO>();
        SheetDTO sheet1 = new SheetDTO();
        sheet1.setTitles(titles);
        sheet1.setProperties(columns);
        sheet1.setSheetName("第一个sheet页");
        sheet1.setCollection(list);
        sheetList.add(sheet1);
        SheetDTO sheet2 = new SheetDTO();
        sheet2.setTitles(titles);
        sheet2.setProperties(columns);
        sheet2.setSheetName("第2个sheet页");
        sheet2.setCollection(list);
        sheetList.add(sheet2);
        ExcelUtils.exportExcel(response,sheetList,"测试导出sheet");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值