java

SpringBoot之导出Excel工具类

2020-09-03  本文已影响0人  星钻首席小管家

1,添加poi依赖

<properties>
    <org.apache.poi.ooxml.version>3.13</org.apache.poi.ooxml.version>
</properties>
 
<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>${org.apache.poi.ooxml.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>${org.apache.poi.ooxml.version}</version>
    </dependency>
</dependencies>

2,自定义表格注解

@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelColumn {

    String value() default "";

    int col() default 0;

    int width() default 0;
}

3,ExcelUtils编写

package com.zyjournals.web.sysadmin.config.excel;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;

/**
 * @Description:
 * @Auther: sp
 * @Date: 2020/8/26 14:23
 */
public class ExcelUtil {

    /**
     * 用户信息导出类
     * @param response 响应
     * @param fileName 文件名
     * @param dataList 导出的数据
     */
    public static <T> void uploadExcelAboutUser(HttpServletResponse response,String fileName,List<T> dataList, Class<T> cls){
        //声明输出流
        OutputStream os = null;
        //设置响应头
        setResponseHeader(response,fileName);
        try {
            Field[] fields = cls.getDeclaredFields();
            List<Field> fieldList = Arrays.stream(fields)
                    .filter(field -> {
                        ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
                        if (annotation != null && annotation.col() > 0) {
                            field.setAccessible(true);
                            return true;
                        }
                        return false;
                    }).sorted(Comparator.comparing(field -> {
                        int col = 0;
                        ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
                        if (annotation != null) {
                            col = annotation.col();
                        }
                        return col;
                    })).collect(Collectors.toList());

            //获取输出流
            os = response.getOutputStream();
            //内存中保留1000条数据,以免内存溢出,其余写入硬盘
            //SXSSFWorkbook wb = new SXSSFWorkbook(1000);
            HSSFWorkbook wb = new HSSFWorkbook();
            //获取该工作区的第一个sheet
            Sheet sheet1 = wb.createSheet("sheet1");

            CellStyle cellStyle = wb.createCellStyle();
            //设置水平居中
            cellStyle.setAlignment(HorizontalAlignment.CENTER);
            //设置垂直居中
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

            Font font = wb.createFont();
            cellStyle.setFont(font);

            for (int i = 0; i < dataList.size(); i++) {
                AtomicInteger ai = new AtomicInteger();
                {
                    Row row = sheet1.createRow(ai.getAndIncrement());
                    AtomicInteger aj = new AtomicInteger();
                    //写入头部
                    fieldList.forEach(field -> {
                        ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
                        String columnName = "";
                        if (annotation != null) {
                            columnName = annotation.value();
                        }
                        Cell cell = row.createCell(aj.getAndIncrement());

                        //CellStyle cellStyle = wb.createCellStyle();
                        cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());

                        //Font font = wb.createFont();
                        cellStyle.setFont(font);
                        cell.setCellStyle(cellStyle);
                        cell.setCellValue(columnName);
                    });
                }
                //设置内容行
                if (!CollectionUtils.isEmpty(dataList)) {
                    dataList.forEach(t -> {
                        Row row1 = sheet1.createRow(ai.getAndIncrement());
                        AtomicInteger aj = new AtomicInteger();
                        fieldList.forEach(field -> {
                            //Class<?> type = field.getType();
                            Object value = "";
                            try {
                                //value = field.get(t);
                                value = t.getClass().getMethod("get" + initStr(field.getName())).invoke(t);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                            Cell cell = row1.createCell(aj.getAndIncrement());
                            cell.setCellStyle(cellStyle);
                            if (value != null) {
                                cell.setCellValue(value.toString());
                            }
                        });
                    });
                }
                for (int x = 0; x < fieldList.size(); x++) {
                    sheet1.autoSizeColumn(x);
                    sheet1.setColumnWidth(x,sheet1.getColumnWidth(x)*17/10);
                }
            }
            //将整理好的excel数据写入流中
            wb.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭输出流
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /*
        设置浏览器下载响应头
     */
    private static void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            try {
                fileName = new String(fileName.getBytes(),"ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            response.setContentType("application/octet-stream;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    private static String initStr(String old){  // 将单词的首字母大写
        String str = old.substring(0,1).toUpperCase() + old.substring(1) ;
        return str ;
    }

}

4,定义导出实体类,需要返回特殊格式的,重写getter方法

package com.zyjournals.web.sysadmin.module.account.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.zyjournals.web.sysadmin.config.excel.ExcelColumn;
import lombok.Data;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * t_purchase
 * @author Administrator
 * @date 2020-08-14 16:27:12
 */
@Data
public class ExportPurchaseListVO {

    /**
     * 报刊名称
     */
    @ExcelColumn(value = "报刊名称", col = 1)
    private String journalName;

    /**
     * 文章名称
     */
    @ExcelColumn(value = "文章名称", col = 2)
    private String articleName;

    /**
     * DOI号
     */
    @ExcelColumn(value = "DOI号", col = 3)
    private String doi;

    /**
     * 购买金额
     */
    @ExcelColumn(value = "购买金额(元)", col = 4)
    private BigDecimal amountOfPurchase;

    /**
     * 创建时间
     */
    @JsonFormat(locale ="zh", timezone ="GMT+8", pattern ="yyyy-MM-dd HH:mm:ss")
    @ExcelColumn(value = "购买具体时间", col = 5)
    private Date createdTime;

    public String getCreatedTime() {
        if(createdTime!=null){
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createdTime);
        }
        return "";
    }
}

5,调用

@GetMapping(value = "/purchase/exportPurchaseById")
    public void exportPurchaseById(@RequestParam(value = "id")Long id,
            @RequestParam(value = "pageNo",defaultValue = "1",required = false) Integer pageNo,
            @RequestParam(value = "pageSize",defaultValue = "10",required = false)Integer pageSize, HttpServletResponse response){
        PurchaseDTO purchaseDTO = new PurchaseDTO();
        purchaseDTO.setId(id);
        purchaseDTO.setPageNo(pageNo);
        purchaseDTO.setPageSize(pageSize);
        JsonListResult<Purchase> purchaseJsonListResult = this.queryByList(purchaseDTO);
        List<ExportPurchaseListVO> listVOS = MyBeanUtils.transform(purchaseJsonListResult.getItems(), ExportPurchaseListVO.class);
        ExcelUtil.uploadExcelAboutUser(response,"购买明细.xlsx",listVOS,ExportPurchaseListVO.class);
    }
上一篇 下一篇

猜你喜欢

热点阅读