Apache POI操作excel

第1部分:引言

1.1 Apache POI简介

Apache POI是一个开源的Java库,用于处理Microsoft Office文档。自2001年首次发布以来,它已经成为Java社区中处理Office文档事实上的标准。Apache POI支持HSSF(用于旧版本的Excel格式,即.xls)和XSSF(用于Excel 2007及以后版本,即.xlsx)两种Excel格式,以及其他Office文档格式。

1.2 为什么选择Apache POI进行Excel操作
  • 跨平台性:作为Java库,Apache POI可以在任何支持Java的平台上运行,无需依赖特定的操作系统。
  • 开源和免费:Apache POI是一个开源项目,允许开发者免费使用和修改。
  • 功能丰富:支持创建、编辑、格式化、图表绘制等多种Excel操作。
  • 社区支持:拥有活跃的开发者社区,提供持续的更新和技术支持。
  • 与Java集成度高:无缝集成到Java应用程序中,易于学习和使用。

第2部分:Apache POI概览

2.1 Apache POI的历史和发展

Apache POI最初由Andrew C. Oliver于2001年开发,目的是提供一个能够读写Microsoft Office文件格式的Java库。随着时间的推移,Apache POI不断发展壮大,现在已经成为Apache软件基金会的一个顶级项目。它支持包括Excel、Word、PowerPoint在内的多种Office文档格式。

2.2 支持的文件格式

Apache POI支持多种Excel文件格式,主要包括:

  • HSSF (Horrible SpreadSheet Format):用于读写旧版的Excel格式(.xls)。
  • XSSF (Excel Spreadsheet XML Format):用于读写较新的Excel格式(.xlsx),基于Office Open XML标准。
  • SXSSF:用于读写大型Excel文件,支持在内存使用较低的情况下进行操作。
2.3 与其他库的比较

与其他Excel操作库相比,Apache POI具有以下优势:

  • 全面性:支持几乎所有Excel功能,包括宏、图表、数据透视表等。
  • 成熟度:经过多年的发展,Apache POI已经非常稳定和成熟。
  • 社区活跃:拥有一个活跃的开发者社区,不断有新的功能和改进被加入。
2.4 核心组件

Apache POI由以下几个核心组件构成:

  • POI-OLE:用于处理OLE2文件格式,如早期的Excel文件。
  • POI-HSSF:专门用于处理HSSF格式的Excel文件。
  • POI-SXSSF:用于处理SXSSF格式的Excel文件。
  • POI-XSSF:用于处理XSSF格式的Excel文件。
  • POI-HWPF:用于处理Word文档。
  • POI-HSLF:用于处理PowerPoint演示文稿。
2.5 示例:创建一个简单的Excel文件

下面是一个使用Apache POI创建一个简单Excel文件的示例:

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class SimpleExcelExample {
    public static void main(String[] args) throws IOException {
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Simple Sheet");
            Row row = sheet.createRow(0);
            Cell cell = row.createCell(0);
            cell.setCellValue("Hello, Apache POI!");

            CellStyle style = workbook.createCellStyle();
            style.setFillForegroundColor(IndexedColors.YELLOW.index);
            style.setFillPattern(CellStyle.SOLID_FOREGROUND);
            cell.setCellStyle(style);

            try (FileOutputStream outputStream = new FileOutputStream("simple.xlsx")) {
                workbook.write(outputStream);
            }
        }
    }
}
2.6 示例:读取Excel文件

以下示例展示了如何使用Apache POI读取Excel文件中的数据:

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;

public class ReadExcelExample {
    public static void main(String[] args) throws IOException {
        try (Workbook workbook = new XSSFWorkbook(new FileInputStream("simple.xlsx"))) {
            Sheet sheet = workbook.getSheetAt(0);
            for (Row row : sheet) {
                for (Cell cell : row) {
                    switch (cell.getCellType()) {
                        case STRING:
                            System.out.println(cell.getStringCellValue());
                            break;
                        case NUMERIC:
                            System.out.println(cell.getNumericCellValue());
                            break;
                        // 可以根据需要添加其他类型的处理
                    }
                }
            }
        }
    }
}

第3部分:环境搭建

3.1 安装Java开发环境

在使用Apache POI之前,确保你的计算机上安装了Java开发环境(JDK)。可以从Oracle官网下载最新版本的JDK。安装完成后,配置环境变量,使得javajavac命令可以在命令行中直接使用。

3.2 添加Apache POI依赖到项目

Apache POI可以通过多种方式添加到你的项目中。以下是几种常见的方法:

3.2.1 使用Maven

如果你的项目使用Maven进行依赖管理,可以在pom.xml文件中添加以下依赖:

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.2</version>
</dependency>
3.2.2 使用Gradle

对于使用Gradle的项目,在build.gradle文件中添加以下依赖:

dependencies {
    implementation 'org.apache.poi:poi:5.2.2'
    implementation 'org.apache.poi:poi-ooxml:5.2.2'
}
3.2.3 手动下载和配置

如果不想使用依赖管理工具,可以从Apache POI官网下载所需的JAR文件,并将其添加到项目的类路径中。

3.3 配置开发工具(IDE)以支持Apache POI

大多数现代IDE(如IntelliJ IDEA、Eclipse等)都支持Maven和Gradle,可以自动识别并下载依赖。确保你的IDE配置正确,可以识别并索引Apache POI库。

3.4 示例:使用Maven创建一个简单的项目

以下是一个使用Maven创建的简单项目的目录结构和pom.xml配置示例:

simple-poi-project
|-- pom.xml
`-- src
    `-- main
        |-- java
        `-- com.example
            `-- SimpleExcelExample.java

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>simple-poi-project</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- Apache POI dependencies -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.2</version>
        </dependency>
    </dependencies>
</project>
3.5 示例:创建和配置Eclipse项目

如果你使用Eclipse作为开发工具,可以按照以下步骤创建和配置项目:

  1. 打开Eclipse,选择File > New > Java Project
  2. 输入项目名称,例如SimplePoiProject,然后点击Finish
  3. 右键点击项目,选择Configure > Convert to Maven Project
  4. 在弹出的窗口中,添加Apache POI依赖,然后点击Finish
3.6 示例:使用IntelliJ IDEA创建项目

如果你使用IntelliJ IDEA,可以按照以下步骤创建和配置项目:

  1. 打开IntelliJ IDEA,选择File > New > Project
  2. 选择Maven,然后点击Next
  3. 输入项目名称和位置,点击Next
  4. Artifact Coordinates页面,添加Apache POI依赖,然后点击Finish

第4部分:基础操作

4.1 创建一个新的Excel文件

使用Apache POI创建一个新的Excel文件涉及到几个关键步骤:初始化工作簿(Workbook),创建工作表(Sheet),以及添加行(Row)和单元格(Cell)。以下是一个创建新Excel文件并写入一些基础数据的示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class CreateNewExcel {
    public static void main(String[] args) throws IOException {
        Workbook workbook = new XSSFWorkbook(); // 创建新的工作簿
        Sheet sheet = workbook.createSheet("First Sheet"); // 创建新的工作表

        // 在第一行第一列创建单元格并写入数据
        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);
        cell.setCellValue("Apache POI");

        // 设置单元格样式
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        cell.setCellStyle(style);

        try (FileOutputStream outputStream = new FileOutputStream("newExcel.xlsx")) {
            workbook.write(outputStream); // 写入文件
        }

        workbook.close(); // 关闭工作簿
    }
}
4.2 读取现有的Excel文件

读取Excel文件需要使用Apache POI的读取功能。以下示例展示了如何打开一个现有的Excel文件并读取其内容:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;

public class ReadExistingExcel {
    public static void main(String[] args) throws IOException {
        try (Workbook workbook = new XSSFWorkbook(new FileInputStream("existingExcel.xlsx"))) {
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表

            for (Row row : sheet) {
                for (Cell cell : row) {
                    switch (cell.getCellType()) {
                        case STRING:
                            System.out.println(cell.getStringCellValue());
                            break;
                        case NUMERIC:
                            System.out.println(cell.getNumericCellValue());
                            break;
                        // 可以添加更多case来处理不同类型的单元格
                    }
                }
            }
        }
    }
}
4.3 工作簿(Workbook)和工作表(Sheet)的概念
  • 工作簿(Workbook):代表整个Excel文件,可以包含多个工作表。
  • 工作表(Sheet):是工作簿中的一个单独的表格,可以包含行和列。
4.4 添加多个工作表

以下示例展示了如何在同一个工作簿中添加多个工作表:

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;

public class AddMultipleSheets {
    public static void main(String[] args) {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet1 = workbook.createSheet("Sheet 1");
        Sheet sheet2 = workbook.createSheet("Sheet 2");

        // 在每个工作表中添加一些数据
        sheet1.createRow(0).createCell(0).setCellValue("Data in Sheet 1");
        sheet2.createRow(0).createCell(0).setCellValue("Data in Sheet 2");

        // 保存工作簿到文件
        try {
            workbook.write(new FileOutputStream("multipleSheets.xlsx"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        workbook.close();
    }
}
4.5 设置单元格样式

Apache POI允许你设置单元格的样式,包括字体、颜色、边框等。以下示例展示了如何设置单元格的背景颜色和字体样式:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.main.CTScheme;

import java.io.FileOutputStream;
import java.io.IOException;

public class CellStyles {
    public static void main(String[] args) throws IOException {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Styled Sheet");
        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);

        // 设置单元格样式
        CellStyle style = workbook.createCellStyle();
        XSSFFont font = ((XSSFWorkbook) workbook).createFont();
        font.setFontName("Arial");
        font.setFontHeightInPoints((short) 14);
        font.setBold(true);
        font.setColor(IndexedColors.RED.getIndex());
        style.setFont(font);

        cell.setCellValue("Styled Cell");
        cell.setCellStyle(style);

        try (FileOutputStream outputStream = new FileOutputStream("styledExcel.xlsx")) {
            workbook.write(outputStream);
        }

        workbook.close();
    }
}

第5部分:数据读写

5.1 写入数据到单元格

在Excel中写入数据到单元格是基本操作之一。Apache POI提供了多种方法来设置单元格的值,包括字符串、数字、布尔值等。以下是一些写入数据的基本示例:

5.1.1 写入字符串和数字
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class WriteDataToCells {
    public static void main(String[] args) throws IOException {
        try (Workbook workbook = new XSSFWorkbook();
             FileOutputStream outputStream = new FileOutputStream("writeData.xlsx")) {
            Sheet sheet = workbook.createSheet("Data Sheet");
            Row row = sheet.createRow(0);

            // 第一列写入字符串
            Cell cell1 = row.createCell(0);
            cell1.setCellValue("Hello, Apache POI!");

            // 第二列写入数字
            Cell cell2 = row.createCell(1);
            cell2.setCellValue(1234.56);
            
            workbook.write(outputStream);
        }
    }
}
5.1.2 写入布尔值和公式
import org.apache.poi.ss.usermodel.*;

public class WriteBooleanAndFormula {
    public static void main(String[] args) {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Boolean and Formula");
        Row row = sheet.createRow(1);

        // 写入布尔值
        Cell cell1 = row.createCell(0);
        cell1.setCellValue(true);

        // 写入公式
        Cell cell2 = row.createCell(1);
        cell2.setCellFormula("SUM(1, 2, 3, 4)");

        // 此处省略文件写入和关闭工作簿的代码
    }
}
5.2 读取单元格数据

读取单元格数据同样重要,Apache POI提供了多种方法来获取不同类型的单元格数据。以下是读取数据的示例:

5.2.1 读取不同类型的单元格数据
import org.apache.poi.ss.usermodel.*;

import java.io.FileInputStream;
import java.io.IOException;

public class ReadDifferentCellTypes {
    public static void main(String[] args) throws IOException {
        try (Workbook workbook = new XSSFWorkbook(new FileInputStream("readData.xlsx"))) {
            Sheet sheet = workbook.getSheetAt(0);
            Row row = sheet.getRow(0);

            Cell cell1 = row.getCell(0);
            System.out.println("String Cell: " + cell1.getStringCellValue());

            Cell cell2 = row.getCell(1);
            System.out.println("Numeric Cell: " + cell2.getNumericCellValue());

            // 此处省略其他单元格类型的读取代码
        }
    }
}
5.3 单元格样式和格式化

单元格样式和格式化是提高Excel文件可读性和专业性的重要手段。以下是设置单元格样式和格式化的示例:

5.3.1 设置数字格式和字体样式
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class CellStyleAndFormatting {
    public static void main(String[] args) {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Formatted Data");
        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);

        // 设置数字格式
        cell.setCellValue(12345.67);
        cell.setCellStyle(createNumberFormat(workbook, "#,##0.00"));

        // 设置字体样式
        CellStyle style = createFontStyle(workbook, "Bold", IndexedColors.BLACK.getIndex());
        cell.setCellStyle(style);

        // 此处省略文件写入和关闭工作簿的代码
    }

    private static CellStyle createNumberFormat(Workbook workbook, String format) {
        CellStyle style = workbook.createCellStyle();
        style.setDataFormat(workbook.createDataFormat().getFormat(format));
        return style;
    }

    private static CellStyle createFontStyle(Workbook workbook, String fontName, short color) {
        CellStyle style = workbook.createCellStyle();
        XSSFFont font = ((XSSFWorkbook) workbook).createFont();
        font.setFontName(fontName);
        font.setBold(true);
        font.setColor(color);
        style.setFont(font);
        return style;
    }
}
5.4 合并单元格

合并单元格是Excel中常用的功能,用于在多个单元格中显示一个值。以下是合并单元格的示例:

import org.apache.poi.ss.usermodel.*;

public class MergeCells {
    public static void main(String[] args) {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Merged Cells");
        Row row = sheet.createRow(0);

        // 创建单元格并合并
        Cell cell1 = row.createCell(0);
        cell1.setCellValue("Merged Cell");
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); // 合并第0行第0到2列

        // 此处省略文件写入和关闭工作簿的代码
    }
}

欢迎关注vx公众号
在这里插入图片描述

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行动π技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值