Apache POI 学习

Apache POI 学习

        • [1. 引言](#1. 引言)
        • [2. 环境搭建](#2. 环境搭建)
        • [3. 基础概念](#3. 基础概念)
        • [4. 基本操作](#4. 基本操作)
          • [4.1 创建 Excel 文件](#4.1 创建 Excel 文件)
          • [4.2 读取 Excel 文件](#4.2 读取 Excel 文件)
        • [5. 进阶操作](#5. 进阶操作)
          • [5.1 设置单元格样式](#5.1 设置单元格样式)
          • [5.2 数据验证](#5.2 数据验证)
          • [5.3 图表创建](#5.3 图表创建)
          • [5.4 合并单元格](#5.4 合并单元格)
          • [5.5 居中对齐](#5.5 居中对齐)
          • [5.6 设置边框和字体颜色](#5.6 设置边框和字体颜色)
        • [6. 性能优化](#6. 性能优化)
        • [7. 总结](#7. 总结)
1. 引言

Apache POI 是一个用于读写 Microsoft Office 格式文件的 Java API。它支持多种 Office 文件格式,包括 .xls, .xlsx, .ppt, .pptx, .doc, .docx 等。

2. 环境搭建

首先,需要安装 Apache POI 库。可以通过 Maven 或者 Gradle 添加依赖来引入 Apache POI。

Maven
xml 复制代码
<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>
Gradle
groovy 复制代码
implementation 'org.apache.poi:poi:5.2.2'
implementation 'org.apache.poi:poi-ooxml:5.2.2'
3. 基础概念

基本的概念:

  • Workbook:代表一个 Excel 文件。
  • Sheet:代表一个 Excel 表单。
  • Row:代表一个 Excel 行。
  • Cell:代表一个 Excel 单元格。
4. 基本操作
4.1 创建 Excel 文件
java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

public class CreateExcelExample {
    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook()) {
            // 创建一个新的工作表
            Sheet sheet = workbook.createSheet("Sheet1");

            // 创建一个新的行
            Row row = sheet.createRow(0);

            // 创建一个新的单元格
            Cell cell = row.createCell(0);
            cell.setCellValue("Hello, Apache POI!");

            // 将工作簿写入文件
            try (FileOutputStream fos = new FileOutputStream("example.xlsx")) {
                workbook.write(fos);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4.2 读取 Excel 文件
java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

public class ReadExcelExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("example.xlsx")) {
            Workbook workbook = new XSSFWorkbook(fis);
            Sheet sheet = workbook.getSheetAt(0);
            Row row = sheet.getRow(0);
            Cell cell = row.getCell(0);
            System.out.println(cell.getStringCellValue());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5. 进阶操作
5.1 设置单元格样式
java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

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

            // 创建单元格样式
            CellStyle style = workbook.createCellStyle();
            Font font = workbook.createFont();
            font.setBold(true);
            style.setFont(font);

            // 应用样式
            cell.setCellStyle(style);

            try (FileOutputStream fos = new FileOutputStream("styled_example.xlsx")) {
                workbook.write(fos);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5.2 数据验证
java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFDataValidationHelper;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;

public class DataValidationExample {
    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook()) {
            XSSFSheet sheet = (XSSFSheet) workbook.createSheet("Sheet1");
            Row row = sheet.createRow(0);
            Cell cell = row.createCell(0);
            cell.setCellValue("Select an option:");

            // 设置数据验证
            XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);
            DVConstraint constraint = DVConstraint.createExplicitListConstraint(Arrays.asList("Option A", "Option B", "Option C"));
            CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 1, 1);
            DataValidation validation = dvHelper.createValidation(constraint, cellRangeAddress);
            sheet.addValidationData(validation);

            try (FileOutputStream fos = new FileOutputStream("validated_example.xlsx")) {
                workbook.write(fos);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5.3 图表创建
java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.charts.AxisPosition;
import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.DataSources;
import org.apache.poi.ss.usermodel.charts.ScatterChartData;
import org.apache.poi.ss.usermodel.charts.ScatterChartSeries;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDrawing;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

public class ChartCreationExample {
    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook()) {
            XSSFSheet sheet = (XSSFSheet) workbook.createSheet("Sheet1");

            // 创建数据行
            Row row = sheet.createRow(0);
            row.createCell(0).setCellValue("X Axis");
            row.createCell(1).setCellValue("Y Axis");

            for (int i = 1; i <= 10; i++) {
                row = sheet.createRow(i);
                row.createCell(0).setCellValue(i);
                row.createCell(1).setCellValue(i * i);
            }

            // 创建图表
            XSSFDrawing drawing = sheet.createDrawingPatriarch();
            XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 1, 1, 20, 20);
            ScatterChartData chartData = sheet.getChartGrid().createScatterChartData();
            ScatterChartSeries series = chartData.addSeries(
                    DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 10, 0, 0)),
                    DataSources.fromNumericCellRange(sheet, new CellRangeAddress(1, 10, 1, 1))
            );
            series.setTitle("Sample Series");

            // 设置图表轴
            ChartAxis xAxis = chartData.createNumericAxis(AxisPosition.BOTTOM);
            xAxis.setTitle("X Axis");
            ChartAxis yAxis = chartData.createNumericAxis(AxisPosition.LEFT);
            yAxis.setTitle("Y Axis");

            // 创建图表并添加到工作表
            drawing.createScatterChart(anchor, chartData);

            try (FileOutputStream fos = new FileOutputStream("chart_example.xlsx")) {
                workbook.write(fos);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在使用 Apache POI 处理 Excel 文件时,合并单元格、居中对齐以及其他常见的格式化操作是非常常见的需求。下面我将详细介绍如何使用 Apache POI 来实现这些功能。

5.4 合并单元格
java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

public class MergeCellsExample {
    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Sheet1");
            
            // 创建一个新行
            Row row = sheet.createRow(0);
            
            // 创建一个新单元格
            Cell cell = row.createCell(0);
            cell.setCellValue("这是标题行");
            
            // 合并单元格
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3)); // 合并第0行第0列到第0行第3列
            
            // 创建第二个新行
            row = sheet.createRow(1);
            
            // 填充数据
            row.createCell(0).setCellValue("列1");
            row.createCell(1).setCellValue("列2");
            row.createCell(2).setCellValue("列3");
            row.createCell(3).setCellValue("列4");
            
            // 将工作簿写入文件
            try (FileOutputStream fos = new FileOutputStream("merged_cells_example.xlsx")) {
                workbook.write(fos);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5.5 居中对齐
java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

public class CenterAlignExample {
    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Sheet1");
            
            // 创建一个新行
            Row row = sheet.createRow(0);
            
            // 创建一个新单元格
            Cell cell = row.createCell(0);
            cell.setCellValue("这是标题行");
            
            // 设置单元格样式
            CellStyle style = workbook.createCellStyle();
            style.setAlignment(HorizontalAlignment.CENTER); // 水平居中
            style.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
            
            // 应用样式
            cell.setCellStyle(style);
            
            // 将工作簿写入文件
            try (FileOutputStream fos = new FileOutputStream("center_aligned_example.xlsx")) {
                workbook.write(fos);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5.6 设置边框和字体颜色
java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

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

public class BorderAndFontColorExample {
    public static void main(String[] args) {
        try (Workbook workbook = new XSSFWorkbook()) {
            Sheet sheet = workbook.createSheet("Sheet1");
            
            // 创建一个新行
            Row row = sheet.createRow(0);
            
            // 创建一个新单元格
            Cell cell = row.createCell(0);
            cell.setCellValue("这是标题行");
            
            // 设置单元格样式
            CellStyle style = workbook.createCellStyle();
            style.setAlignment(HorizontalAlignment.CENTER); // 水平居中
            style.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
            
            // 设置边框
            style.setBorderBottom(BorderStyle.THIN);
            style.setBorderLeft(BorderStyle.THIN);
            style.setBorderRight(BorderStyle.THIN);
            style.setBorderTop(BorderStyle.THIN);
            
            // 设置字体颜色
            Font font = workbook.createFont();
            font.setColor(IndexedColors.BLUE.getIndex());
            style.setFont(font);
            
            // 应用样式
            cell.setCellStyle(style);
            
            // 将工作簿写入文件
            try (FileOutputStream fos = new FileOutputStream("border_and_font_color_example.xlsx")) {
                workbook.write(fos);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
6. 性能优化

在处理大量数据时,性能是一个关键因素。以下是一些优化建议:

  • 使用流式处理 :对于非常大的文件,可以使用 SXSSFWorkbook 来减少内存占用。
  • 批量写入:一次性写入大量数据时,尽量减少磁盘 I/O 操作次数。
  • 关闭流:确保在不再使用流之后关闭它们。
7. 总结

Apache POI 是一个功能强大的 Java 库,用于处理 Microsoft Office 文件。
Apache POI 官方文档

相关推荐
武昌库里写JAVA13 分钟前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
杜子不疼.32 分钟前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习
小幽余生不加糖1 小时前
电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
人工智能·笔记·学习·音视频
..过云雨2 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习
myzzb2 小时前
基于uiautomation的自动化流程RPA开源开发演示
运维·python·学习·算法·自动化·rpa
非凡ghost5 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求
云间月13147 小时前
飞算JavaAI智慧教育场景实践:从个性化学习到教学管理的全链路技术革新
学习·飞算javaai挑战赛
weixin_456904278 小时前
一文讲清楚Pytorch 张量、链式求导、正向传播、反向求导、计算图等基础知识
人工智能·pytorch·学习
Python私教9 小时前
从“Hello World”到“高并发中间件”:Go 语言 2025 系统学习路线图
学习·中间件·golang