java导出excel,excel表头映射到javaBean属性名称

一、pom依赖

        3.10-FINAL
        
            org.apache.poi
            poi
            ${org.apache.poi.version}
        
        
            org.apache.poi
            poi-ooxml
            ${org.apache.poi.version}
        
        
            org.apache.poi
            poi-ooxml-schemas
            ${org.apache.poi.version}
        

 

二、封装的服务

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tf56.hermescontractweb.util.DateUtil;
​
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
​
@Slf4j
@Service
public class ExcelExportService {
​
    @Autowired
    private HermesFileService hermesFileService;
​
    /**
     * 导出excel
     * @param excelDataList:需要导出的数据 List
     * @param clazz 对应excelDataList具体类型的clazz(导出excel表头使用javaBean属性名)
     * @param response
     * @throws Exception
     */
    public void exportExcel2003(List excelDataList, Class clazz, HttpServletResponse response) throws Exception {
        List excelTitles = getExcelTitles(clazz);
        List> rowDataList = new ArrayList<>();
        for (Object obj : excelDataList) {
            rowDataList.add(JSONObject.parseObject(JSON.toJSONString(obj), Map.class));
        }
        exportExcel2003(excelTitles, rowDataList, response);
    }
​
    /**
     * 导出excel
     * @param excelDataList:需要导出的数据 List
     * @param clazz 对应excelDataList具体类型的clazz(导出excel表头使用javaBean属性名)
     * @param response
     * @throws Exception
     */
    public void exportExcel2007(List excelDataList, Class clazz, HttpServletResponse response) throws Exception {
        List excelTitles = getExcelTitles(clazz);
        List> rowDataList = new ArrayList<>();
        for (Object obj : excelDataList) {
            rowDataList.add(JSONObject.parseObject(JSON.toJSONString(obj), Map.class));
        }
        exportExcel2007(excelTitles, rowDataList, response);
    }
​
    /**
     * 导出Excel
     * @param titles eg:[id, name, age]
     * @param rowDataList eg:[{id:1,name:张三}]
     * @param response
     * @throws Exception
     */
    private void exportExcel2003(List titles, List> rowDataList, HttpServletResponse response) throws Exception {
        HSSFWorkbook workbook = new HSSFWorkbook();
        ServletOutputStream outputStream = null;
        try {
            String sheetName = "sheet1";
            HSSFSheet sheet = workbook.createSheet(sheetName);
​
            // 4.1表头
            HSSFRow headRow = sheet.createRow(0);
            for(int i = 0; i < titles.size(); i++){
                headRow.createCell(i).setCellValue(titles.get(i));
            }
            for (Map currRowDataMap : rowDataList) {
                HSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); // 获取当前行
                for(int i = 0; i < titles.size(); i++){
                    String title = titles.get(i);
                    Object obj = currRowDataMap.get(title);
                    if(ObjectUtil.isNotNull(obj)) {
                        String type = obj.getClass().getTypeName();
                        if(ObjectUtil.equal(type, "java.lang.String")) {
                            dataRow.createCell(i).setCellValue(obj + "");
                        }else if(ObjectUtil.equal(type, "java.lang.Integer") ||
                                ObjectUtil.equal(type, "java.lang.Long") ||
                                ObjectUtil.equal(type, "java.math.BigDecimal") ||
                                ObjectUtil.equal(type, "java.lang.Float") ||
                                ObjectUtil.equal(type, "java.lang.Double") ||
                                ObjectUtil.equal(type, "java.lang.Number") ||
                                ObjectUtil.equal(type, "java.lang.Short") ||
                                ObjectUtil.equal(type, "java.lang.Byte")){
                            dataRow.createCell(i).setCellValue(String.valueOf(obj));
                        }else if(ObjectUtil.equal(type, "java.util.Date")) {
                            String formDateStr = DateUtil.getDateTime(new Date((long)obj));
                            dataRow.createCell(i).setCellValue(formDateStr);
                        }else{
                            dataRow.createCell(i).setCellValue(JSON.toJSONString(obj));
                        }
                    }
                }
            }
            // 下载导出设置
            // 设置头信息
            String fileName = UUID.randomUUID().toString().replace("-", "") + ".xls";
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
​
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
            outputStream.flush();
        } finally {
            // 关闭
            if(outputStream != null){
                outputStream.close();
            }
        }
    }
​
    /**
     * 导出Excel
     * @param titles eg:[id, name, age]
     * @param rowDataList eg:[{id:1,name:张三}]
     * @param response
     * @throws Exception
     */
    private void exportExcel2007(List titles, List> rowDataList, HttpServletResponse response) throws Exception {
        XSSFWorkbook workbook = new XSSFWorkbook();
        ServletOutputStream outputStream = null;
        try {
            String sheetName = "sheet1";
            XSSFSheet sheet = workbook.createSheet(sheetName);
​
            // 4.1表头
            XSSFRow headRow = sheet.createRow(0);
            for(int i = 0; i < titles.size(); i++){
                headRow.createCell(i).setCellValue(titles.get(i));
            }
            for (Map currRowDataMap : rowDataList) {
                XSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1); // 获取当前行
                for(int i = 0; i < titles.size(); i++){
                    String title = titles.get(i);
                    Object obj = currRowDataMap.get(title);
                    if(ObjectUtil.isNotNull(obj)) {
                        String type = obj.getClass().getTypeName();
                        if(ObjectUtil.equal(type, "java.lang.String")) {
                            dataRow.createCell(i).setCellValue(obj + "");
                        }else if(ObjectUtil.equal(type, "java.lang.Integer") ||
                                ObjectUtil.equal(type, "java.lang.Long") ||
                                ObjectUtil.equal(type, "java.math.BigDecimal") ||
                                ObjectUtil.equal(type, "java.lang.Float") ||
                                ObjectUtil.equal(type, "java.lang.Double") ||
                                ObjectUtil.equal(type, "java.lang.Number") ||
                                ObjectUtil.equal(type, "java.lang.Short") ||
                                ObjectUtil.equal(type, "java.lang.Byte")){
                            dataRow.createCell(i).setCellValue(String.valueOf(obj));
                        }else if(ObjectUtil.equal(type, "java.util.Date")) {
                            String formDateStr = DateUtil.getDateTime(new Date((long)obj));
                            dataRow.createCell(i).setCellValue(formDateStr);
                        }else{
                            dataRow.createCell(i).setCellValue(JSON.toJSONString(obj));
                        }
                    }
                }
            }
            // 下载导出设置
            // 设置头信息
            String fileName = UUID.randomUUID().toString().replace("-", "") + ".xlsx";
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
​
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
            outputStream.flush();
        } finally {
            // 关闭
            if(outputStream != null){
                outputStream.close();
            }
        }
    }
​
    private List getExcelTitles(Class clazz) {
        Field[] declaredFields = clazz.getDeclaredFields();
        List titles = new ArrayList<>();
        for (Field field : declaredFields) {
            String name = field.getName();
            if(ObjectUtil.notEqual(name, "serialVersionUID")) { // 剔除掉 serialVersionUID 属性
                titles.add(name);
            }
        }
        return titles;
    }
​
​
}
​
​
import java.text.SimpleDateFormat;
import java.util.Date;
​
public class DateUtil {
​
    public static String datetime = "yyyy-MM-dd HH:mm:ss";
    public static String date_format = "yyyy-MM-dd";
​
    /**
     * 获取当前时间
     */
    public static String getCurrentDateTime() {
        SimpleDateFormat sdf = getDateFormat(datetime);
        return sdf.format(new Date());
    }
​
    public static String getDateTime(Date date) {
        if (date == null) {
            return "";
        }
        SimpleDateFormat sdf = getDateFormat(datetime);
        return sdf.format(date);
    }
​
    public static String getDate(Date date) {
        if (date == null) {
            return "";
        }
        SimpleDateFormat sdf = getDateFormat(date_format);
        return sdf.format(date);
    }
​
    private static SimpleDateFormat getDateFormat(String parttern) throws RuntimeException {
        return new SimpleDateFormat(parttern);
    }
}
​

 

三、调用示例

    public void exportExcel(HttpServletRequest request, HttpServletResponse response) {
        // 获取需要导出的数据列表 需是javaBean的一个数据列表
        List exportJavaBeans = xxxx;
        // 导出excel2003
        excelExportService.exportExcel2003(exportJavaBeans, ExportJavaBean.class, response);
        // 导出excel2007
        excelExportService.exportExcel2007(exportJavaBeans, ExportJavaBean.class, response);
    }

四、此种导出excel缺点

若存在Date类型的数据,会按Long类型格式当做数字输出

你可能感兴趣的:(java导出excel,excel表头映射到javaBean属性名称)