【Java用法】使用poi写Java代码导出Excel文档的解决方案

简介: 【Java用法】使用poi写Java代码导出Excel文档的解决方案

【Java用法】使用EasyPoi导入与导出Excel文档的解决方案,这是另外一种方法导入导出文档

第一步:添加Maven依赖

<!--poi的依赖-->
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.10.1</version>
</dependency>
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>3.10.1</version>
</dependency>

第二步:添加注解

下面是需要导出的实体类,需要添加@ExcelField注解;如果没有,请查看第二步中的一个注解类。

@ApiModel(value = "未提交日报实体")
@Data
public class DailyNoSubmitReport implements Serializable {
    @ApiModelProperty(value = "未提交日报id", example = "1")
    @ExcelField("编号")
    private Integer id;
    @ApiModelProperty(value = "手机号")
    @ExcelField("手机号")
    private String userName;
    @ApiModelProperty(value = "姓名")
    @ExcelField("姓名")
    private String trueName;
    @ApiModelProperty(value = "部门id")
    @ExcelField("部门id")
    private String deptId;
    @ApiModelProperty(value = "部门名称")
    @ExcelField("部门名称")
    private String deptName;
    @ExcelField(value = "未提交日期", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "未提交日期")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date noSubmitDate;
    @ExcelField("每周周几")
    @ApiModelProperty(value = "每周周几")
    private String dayOfWeek;
    @ExcelField(value = "创建日期", dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建日期")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
}

以下是注解类:

package com.iot.daily.annotation;
import java.lang.annotation.*;
/**
 * Description:ExcelField
 *
 * @author Jin
 * @create 2017-4-10
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelField {
    String value() default "";
    String dateFormat() default "";
    boolean isOnlyImport() default false;
    String isNullDefaultValue() default "N/A";
}

第三步:编写导出类

@Override
    public JsonResult exportExcel(User user, QueryParamDTO queryParamDTO) {
        if (user == null) {
            log.error("E|DailyStatisticsServiceImpl|exportExcel()|分页导出Excel日报未提交人员列表时,获取当前登录人失败!");
            return JsonResult.fail("获取当前登录人失败!");
        }
        int pageNum = queryParamDTO.getPageNum();
        int pageSize = queryParamDTO.getPageSize();
        try {
            PageInfo<Object> pageInfo = PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(() ->
                    dailyNoSubmitReportMapper.pageList(queryParamDTO));
            ExcelUtil.exports2007("日报未提交人员列表", pageInfo.getList());
            return JsonResult.ok("导出日报未提交人员列表成功!");
        } catch (Exception e) {
            log.error("E|DailyStatisticsServiceImpl|exportExcel()|分页导出Excel日报未提交人员列表失败!原因 = {}", e.getMessage());
        }
        return JsonResult.fail("分页导出Excel日报未提交人员列表时失败!");
    }

说明:上面导出类中的ExcelUtil工具类可以直接使用。即以下代码:

package com.iot.daily.common.util;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.google.common.collect.Lists;
import com.uiotsoft.daily.account.exception.ApplicationException;
import com.uiotsoft.daily.account.exception.ErrorCode;
import com.uiotsoft.daily.annotation.ExcelField;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.beans.PropertyDescriptor;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.List;
/**
 * Description:
 *
 * @author Jin
 * @create 2017-07-27
 */
public class ExcelUtil {
    public static void exports(String sheetName, List<?> list) {
        if (CollUtil.isEmpty(list)) {
            throw new ApplicationException(ErrorCode.E_100106);
        }
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletResponse response = attributes.getResponse();
        try {
            ServletOutputStream out = response.getOutputStream();
            HSSFWorkbook wb = new HSSFWorkbook();
            HSSFSheet sheet = wb.createSheet(sheetName);
            for (int i = 0; i < list.size(); i++) {
                Object obj = list.get(i);
                Class clazz = obj.getClass();
                if (i == 0) {
                    HSSFRow row = sheet.createRow(i);
                    Field[] fields = clazz.getDeclaredFields();
                    int tmp = 0;
                    for (Field field : fields) {
                        HSSFCell cell = row.createCell(tmp);
                        ExcelField excelFiled = field.getAnnotation(ExcelField.class);
                        // 判断是否只支持导入
                        if (excelFiled == null || excelFiled.isOnlyImport()) {
                            continue;
                        }
                        cell.setCellValue(excelFiled.value());
                        tmp++;
                    }
                }
                HSSFRow row = sheet.createRow(i + 1);
                Field[] fields = clazz.getDeclaredFields();
                int tmp = 0;
                for (Field field : fields) {
                    ExcelField excelFiled = field.getAnnotation(ExcelField.class);
                    if (excelFiled == null || excelFiled.isOnlyImport()) {
                        continue;
                    }
                    HSSFCell cell = row.createCell(tmp);
                    PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                    Method getMethod = pd.getReadMethod();
                    Object o = getMethod.invoke(obj);
                    if (!StrUtil.isBlank(excelFiled.dateFormat()) && o instanceof Date) {
                        cell.setCellValue(DateUtil.format((Date) o, excelFiled.dateFormat()));
                    } else {
                        cell.setCellValue(ObjectUtil.isNull(o) ? excelFiled.isNullDefaultValue() : String.valueOf(o));
                    }
                    tmp++;
                }
            }
            response.reset();
            response.setHeader("Content-disposition", "attachment;filename=" + new String(sheetName.getBytes("utf-8"), "ISO8859-1") + ".xls");
            response.setContentType("application/msexcel");
            wb.write(out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new ApplicationException(ErrorCode.E_100106 + "导出excel失败,【" + e.getMessage() + "】");
        }
    }
    public static void exports2007(String sheetName, List<?> list) {
        if (CollUtil.isEmpty(list)) {
            throw new ApplicationException(ErrorCode.E_100106);
        }
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletResponse response = attributes.getResponse();
        try {
            ServletOutputStream out = response.getOutputStream();
            XSSFWorkbook wb = new XSSFWorkbook();
            XSSFSheet sheet = wb.createSheet(sheetName);
            for (int i = 0; i < list.size(); i++) {
                Object obj = list.get(i);
                Class clazz = obj.getClass();
                if (i == 0) {
                    XSSFRow row = sheet.createRow(i);
                    Field[] fields = clazz.getDeclaredFields();
                    int tmp = 0;
                    for (Field field : fields) {
                        XSSFCell cell = row.createCell(tmp);
                        ExcelField excelFiled = field.getAnnotation(ExcelField.class);
                        if (excelFiled == null || excelFiled.isOnlyImport()) {
                            continue;
                        }
                        cell.setCellValue(excelFiled.value());
                        tmp++;
                    }
                }
                XSSFRow row = sheet.createRow(i + 1);
                Field[] fields = clazz.getDeclaredFields();
                int tmp = 0;
                for (Field field : fields) {
                    ExcelField excelFiled = field.getAnnotation(ExcelField.class);
                    if (excelFiled == null || excelFiled.isOnlyImport()) {
                        continue;
                    }
                    XSSFCell cell = row.createCell(tmp);
                    PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
                    Method getMethod = pd.getReadMethod();
                    Object o = getMethod.invoke(obj);
                    if (!StrUtil.isBlank(excelFiled.dateFormat()) && o instanceof Date) {
                        cell.setCellValue(DateUtil.format((Date) o, excelFiled.dateFormat()));
                    } else {
                        cell.setCellValue(ObjectUtil.isNull(o) ? excelFiled.isNullDefaultValue() : String.valueOf(o));
                    }
                    tmp++;
                }
            }
            response.reset();
            response.setHeader("Content-disposition", "attachment;filename=" + new String(sheetName.getBytes("utf-8"), "ISO8859-1") + ".xlsx");
            response.setContentType("application/msexcel");
            wb.write(out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出excel失败,[" + e.getMessage() + "]");
        }
    }
    public static <T> List<T> imports(FileInputStream is, Class<T> clazz) {
        List<T> result = Lists.newArrayList();
        try {
            HSSFWorkbook workbook = new HSSFWorkbook(is);
            Sheet sheet = workbook.getSheetAt(0);
            // 获取第0行标题
            Row row0 = sheet.getRow(0);
            // 遍历每一列
            for (int r = 1; r < sheet.getPhysicalNumberOfRows(); r++) {
                T obj = clazz.newInstance();
                Field[] fields = obj.getClass().getDeclaredFields();
                Row row = sheet.getRow(r);
                for (int c = 0; c < row.getPhysicalNumberOfCells(); c++) {
                    for (Field field : fields) {
                        ExcelField excelFiled = field.getAnnotation(ExcelField.class);
                        String title = getCellValue(row0.getCell(c).getCellType(), row0.getCell(c));
                        if (excelFiled == null && !title.equals(excelFiled.value())) {
                            continue;
                        }
                        String cellValue = getCellValue(row.getCell(c).getCellType(), row.getCell(c));
                        PropertyDescriptor pd = new PropertyDescriptor(field.getName(), obj.getClass());
                        if ("错误".equals(cellValue) || field.getType() == String.class) {
                            pd.getWriteMethod().invoke(obj, cellValue);
                            continue;
                        }
                        if (field.getType() == Integer.class) {
                            pd.getWriteMethod().invoke(obj, Integer.parseInt(cellValue));
                            continue;
                        }
                        if (field.getType() == Long.class) {
                            pd.getWriteMethod().invoke(obj, Long.parseLong(cellValue));
                            continue;
                        }
                        if (field.getType() == Float.class) {
                            pd.getWriteMethod().invoke(obj, Float.parseFloat(cellValue));
                            continue;
                        }
                        if (field.getType() == Double.class) {
                            pd.getWriteMethod().invoke(obj, Double.parseDouble(cellValue));
                            continue;
                        }
                        if (field.getType() == Date.class) {
                            pd.getWriteMethod().invoke(obj, DateUtil.parseDate(cellValue));
                        }
                    }
                }
                result.add(obj);
            }
        } catch (Exception e) {
            throw new RuntimeException("导如excel失败,[" + e.getMessage() + "]");
        }
        return result;
    }
    public static <T> List<T> imports2007(FileInputStream is, Class<T> clazz) {
        List<T> result = Lists.newArrayList();
        try {
            XSSFWorkbook workbook = new XSSFWorkbook(is);
            Sheet sheet = workbook.getSheetAt(0);
            // 获取第0行标题
            Row row0 = sheet.getRow(0);
            // 遍历每一列
            for (int r = 1; r < sheet.getPhysicalNumberOfRows(); r++) {
                T obj = clazz.newInstance();
                Field[] fields = obj.getClass().getDeclaredFields();
                Row row = sheet.getRow(r);
                for (int c = 0; c < row.getPhysicalNumberOfCells(); c++) {
                    for (Field field : fields) {
                        ExcelField excelFiled = field.getAnnotation(ExcelField.class);
                        String title = getCellValue(row0.getCell(c).getCellType(), row0.getCell(c));
                        if (excelFiled == null || !title.equals(excelFiled.value())) {
                            continue;
                        }
                        String cellValue = getCellValue(row.getCell(c).getCellType(), row.getCell(c));
                        PropertyDescriptor pd = new PropertyDescriptor(field.getName(), obj.getClass());
                        if ("错误".equals(cellValue) || field.getType() == String.class) {
                            pd.getWriteMethod().invoke(obj, cellValue);
                            continue;
                        }
                        if (field.getType() == Integer.class) {
                            pd.getWriteMethod().invoke(obj, Integer.parseInt(cellValue));
                            continue;
                        }
                        if (field.getType() == Long.class) {
                            pd.getWriteMethod().invoke(obj, Long.parseLong(cellValue));
                            continue;
                        }
                        if (field.getType() == Float.class) {
                            pd.getWriteMethod().invoke(obj, Float.parseFloat(cellValue));
                            continue;
                        }
                        if (field.getType() == Double.class) {
                            pd.getWriteMethod().invoke(obj, Double.parseDouble(cellValue));
                            continue;
                        }
                        if (field.getType() == Date.class) {
                            pd.getWriteMethod().invoke(obj, DateUtil.parseDate(cellValue));
                        }
                    }
                }
                result.add(obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导如excel失败,[" + e.getMessage() + "]");
        }
        return result;
    }
    public static String getCellValue(int cellType, Cell cell) {
        switch (cellType) {
            // 文本
            case Cell.CELL_TYPE_STRING:
                return cell.getStringCellValue();
            // 数字、日期
            case Cell.CELL_TYPE_NUMERIC:
                if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
                    // 日期型
                    return DateUtil.formatDate(cell.getDateCellValue());
                } else {
                    // 数字
                    return String.valueOf(cell.getNumericCellValue());
                }
                // 布尔型
            case Cell.CELL_TYPE_BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            // 空白
            case Cell.CELL_TYPE_BLANK:
                return cell.getStringCellValue();
            // 错误
            case Cell.CELL_TYPE_ERROR:
                return "错误";
            // 公式
            case Cell.CELL_TYPE_FORMULA:
                return "错误";
            default:
                return "错误";
        }
    }
    /*public static void main(String[] args) {
        File file = new File("E:\\123.xlsx");
        try {
            FileInputStream inputStream = new FileInputStream(file);
            List<TCmsContent> list = imports2007(inputStream, TCmsContent.class);
            System.out.println(list.get(0).getTitle());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }*/
}

完结!


相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
131 5
|
2月前
|
缓存 easyexcel Java
Java EasyExcel 导出报内存溢出如何解决
大家好,我是V哥。使用EasyExcel进行大数据量导出时容易导致内存溢出,特别是在导出百万级别的数据时。以下是V哥整理的解决该问题的一些常见方法,包括分批写入、设置合适的JVM内存、减少数据对象的复杂性、关闭自动列宽设置、使用Stream导出以及选择合适的数据导出工具。此外,还介绍了使用Apache POI的SXSSFWorkbook实现百万级别数据量的导出案例,帮助大家更好地应对大数据导出的挑战。欢迎一起讨论!
232 1
|
23天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
|
1月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
69 6
|
1月前
|
安全 Java 开发者
Java多线程编程中的常见问题与解决方案
本文深入探讨了Java多线程编程中常见的问题,包括线程安全问题、死锁、竞态条件等,并提供了相应的解决策略。文章首先介绍了多线程的基础知识,随后详细分析了每个问题的产生原因和典型场景,最后提出了实用的解决方案,旨在帮助开发者提高多线程程序的稳定性和性能。
|
1月前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
40 3
|
1月前
|
Java API Apache
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
51 4
|
2月前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
|
Java
Java计算机IT编程文档常见单词翻译(四)
Java计算机IT编程文档常见单词翻译(四)
120 0
Java计算机IT编程文档常见单词翻译(四)