EXCEL导出工具类

做法是用注解加暴力反射做的

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author:sean
 * @date:2018/10/18
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ExcelSequence {
    /**
     * 字段名称 excel的列名
     * @return
     */
    String name() default "";
    /**
     * 排序字段 Excel的列的位置
     * @return
     */
    int index();
}
实体类
import com.kuaihuoyun.ttms.web.annotations.ExcelSequence;
import lombok.Data;

import java.io.Serializable;

/**
 * @author: sean
 */
public class OrderTargetAllExportVO implements Serializable {

    /**
     *总订单数
     */
    @ExcelSequence(name = "订单总数", index = 0)
    private Integer totalOrderNumber;

    /**
     *签收数
     */
    @ExcelSequence(name = "订单签收数", index = 1)
    private Integer signOrder;

}

工具类:

import com.kuaihuoyun.ttms.web.annotations.ExcelSequence;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * @author: guoshuyun
 */
public class ExportExcelUtil {

    public static <T> SXSSFWorkbook exportExcel(List<T> list, Class clas,String header) throws IllegalAccessException,InvocationTargetException,NoSuchMethodException {
        SXSSFWorkbook book = new SXSSFWorkbook(); ;

        Field[] fields = clas.getDeclaredFields();
        Map<Integer, String> nameMap = new HashMap<>(fields.length);
        Map<Integer, String> fieldNameMap = new HashMap<>(fields.length);

        for (Field f : fields) {
            ExcelSequence annotation = f.getAnnotation(ExcelSequence.class);
            if (annotation != null){
                String name = "".equals(annotation.name()) ? f.getName() : annotation.name();
                Integer order = annotation.index();
                nameMap.put(order,name);
                fieldNameMap.put(order,f.getName());
            }
        }
        Sheet sheet = book.createSheet();
        Row row0 = sheet.createRow(0);
        sheet.addMergedRegion(new CellRangeAddress(0,0,0,nameMap.size()-1));
        CellStyle cellStyle = book.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        Cell cell1 = row0.createCell(0);
        //header是表头,上面是合并单元格,可以去看一下API
        cell1.setCellValue(header);
        cell1.setCellStyle(cellStyle);
        Row row3 = sheet.createRow(1);
        for (int i = 0; i < nameMap.size(); i++) {
            row3.createCell(i).setCellValue(nameMap.get(i));
        }
        for (int i = 0; i < list.size(); i++) {
            Row row = sheet.createRow(i + 2);
            T t = list.get(i);
            for(Map.Entry<Integer,String> entry : fieldNameMap.entrySet()){
                Integer index = entry.getKey();
                Cell cell = row.createCell(index);
                String fieldName = fieldNameMap.get(index);
                String methodName = "get"+ fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
                Method method = clas.getMethod(methodName,new Class[0]);
                Optional<Object> cellValue = Optional.ofNullable(method.invoke(t,new Object[0]));
                String fieldValue = cellValue.orElse("--").toString();
                cell.setCellValue(fieldValue);
            }
        }
        return book;
    }
}

望各位看官觉得有不对的地方还望指出,这个比较适合固定格式导出的场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Java Excel 导出工具类的示例,可以使用 Apache POI 库来实现: ```java import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelExportUtil { public static void export(List<Object[]> data, String[] headers, String sheetName, String filePath) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet(sheetName); // 设置表头 Row headerRow = sheet.createRow(0); for (int i = 0; i < headers.length; i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); } // 写入数据 for (int i = 0; i < data.size(); i++) { Object[] rowData = data.get(i); Row row = sheet.createRow(i + 1); for (int j = 0; j < rowData.length; j++) { Cell cell = row.createCell(j); cell.setCellValue(rowData[j].toString()); } } // 保存文件 try (FileOutputStream outputStream = new FileOutputStream(filePath)) { workbook.write(outputStream); } } } ``` 使用示例: ```java List<Object[]> data = new ArrayList<>(); data.add(new Object[] { "Tom", 18 }); data.add(new Object[] { "Jerry", 20 }); String[] headers = { "Name", "Age" }; String sheetName = "Sheet1"; String filePath = "D:/data.xlsx"; ExcelExportUtil.export(data, headers, sheetName, filePath); ``` 该工具类可以将数据列表写入 Excel 文件中,并指定表头、工作表名称和文件路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值