Java读取Excel_超详细例子

时间:2024-10-16 11:25:51

整体思路

我们这次选择EasyExcel来做Java读取Excel的样例,他更快,内存消耗更低, 是阿里巴巴出品的一款比较优秀的开源产品。

EasyExcel是一个基于Java的高效、简洁的Excel处理工具,专为解决大文件内存溢出问题而设计。相较于传统的Excel处理库如Apache POI和jxl,它在处理大型数据集时显著降低了内存消耗。例如,一个3M大小的Excel文件使用POI SAX解析仍需约100M内存,而用EasyExcel仅需几兆,并且支持更大的文件而不引发内存溢出。此外,EasyExcel简化了API接口,使开发者能够更便捷地进行Excel的读写操作。

使用easyexcel 读取 excel的案例

Java读取Excel_超详细例子_数据模型

使用easyexcel 生成一个Excel文件的过程

根据提供的我了解的信息,我们可以看到EasyExcel是一款基于Java的、快速且简洁的Excel处理工具,特别适合处理大数据量而不必担心内存溢出的问题。在使用EasyExcel生成Excel文件时,我们需要按照一定的步骤进行操作。下面将详细介绍这些步骤。

准备数据

首先,您需要准备好想要写入Excel的数据。这些数据通常会被存储在一个List或Map中。例如,您可以创建一个包含姓名和数字的简单映射来代表要填充的数据:

Map<String, Object> map = new HashMap<>();
map.put("name", "张三");
map.put("number", 5.2);
map.put("name1", "张三1");
map.put("number2", 5.21);

创建工作簿和工作表

接下来,通过EasyExcel的API创建一个Workbook实例,并获取一个WriteSheet实例。这一步骤是为后续数据填充准备环境。如果您的应用涉及大量数据或者公式计算,请考虑开启内存模式以优化性能:

String filePath = "D:/test.xlsx";
String templateFilePath = "D:/template.xlsx";
ExcelWriter excelWriter = EasyExcel.write(filePath).withTemplate(templateFilePath)
        .inMemory(true)  // 开启内存模式
        .build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();

填充数据并执行公式计算

使用fill方法将之前准备好的数据填充到指定的工作表中。此外,如果您的Excel模板中包含任何需要计算的公式,则必须显式地调用evaluateAll()方法来触发这些公式的计算。这是由于默认情况下EasyExcel不会自动评估所有公式:

excelWriter.fill(map, writeSheet);

// 获取Workbook对象以便于对公式进行求值
Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook();

// 如果希望打开文件时立即计算公式
workbook.setForceFormulaRecalculation(true);

// 对所有单元格中的公式执行一次计算
workbook.getCreationHelper().createFormulaEvaluator().evaluateAll();

完成与关闭

最后,记得完成所有的写操作并通过调用finish()方法关闭ExcelWriter,从而释放相关资源:

excelWriter.finish();

以上步骤详细展示了如何利用EasyExcel生成带有公式计算功能的Excel文件。整个过程中最关键的部分在于正确设置内存模式以及确保所有包含公式的单元格得到适当处理。此流程适用于大多数基本需求,但对于更复杂的应用场景可能还需要进一步调整配置选项以满足特定要求。

使用easyexcel 生成excel的案例

使用easyexcel 生成excel的案例

基于提供的知识,使用EasyExcel生成一个Excel文件的过程包括定义数据模型、准备数据以及实际写入数据三个主要步骤。下面将详细阐述每个步骤。

1. 定义数据模型

首先需要创建与Excel表格相对应的数据模型(Java Bean)。在这个例子中,我们将使用DemoData类作为我们的数据模型,它包含几个字段用来存储不同类型的数据。为了确保这些字段能够正确映射到Excel中的相应列上,我们还需要为它们添加@ExcelProperty注解来指定对应的表头名称。对于不想导出的字段,可以使用@ExcelIgnore注解标记。

@Getter
@Setter
@EqualsAndHashCode
public class DemoData {
    @ExcelProperty("字符串标题")
    private String string;
    
    @ExcelProperty("日期标题")
    private Date date;
    
    @ExcelProperty("数字标题")
    private Double doubleData;

    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}

2. 准备数据

接下来,我们需要准备一些示例数据用于填充Excel文件。这里定义了一个方法data()来生成包含多个DemoData对象的列表。

private List<DemoData> data() {
    List<DemoData> list = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        DemoData data = new DemoData();
        data.setString("字符串" + i);
        data.setDate(new Date());
        data.setDoubleData(0.56);
        list.add(data);
    }
    return list;
}

3. 写入数据

最后一步是将数据写入到Excel文件中。EasyExcel提供了多种方式来进行数据写入操作,以下是几种典型的实现方法:

  • 简单直接写入
String fileName = "simpleWrite" + System.currentTimeMillis() + ".xlsx";
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());

此方法适用于数据量较小的情况。如果数据量较大,则推荐使用分批写入的方式以避免内存溢出问题。

  • 排除或仅包含特定列:当只需要导出某些特定列时,可以通过设置excludeColumnFiledNamesincludeColumnFiledNames参数来控制输出的内容。
Set<String> includeColumnFiledNames = new HashSet<>();
includeColumnFiledNames.add("date");
EasyExcel.write("excludeOrIncludeWrite.xlsx", DemoData.class)
       .includeColumnFiledNames(includeColumnFiledNames)
       .sheet("模板")
       .doWrite(data());
  • 自定义列顺序:若需改变默认的列顺序,可以在@ExcelProperty注解中通过index属性来指定列的位置。
// 数据模型部分省略...
EasyExcel.write("indexWrite.xlsx", IndexData.class).sheet("模板").doWrite(data());
  • 复杂头部结构:支持多级标题,通过在@ExcelProperty内传入数组形式的标题列表即可。
// 数据模型部分省略...
EasyExcel.write("complexHeadWrite.xlsx", ComplexHeadData.class).sheet("模板").doWrite(data());

以上步骤展示了如何利用EasyExcel库来快速地从零开始构建并导出一个基本的Excel文件。根据具体需求的不同,还可以进一步探索更多高级功能如样式设定、图片插入等。