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 官方文档

相关推荐
Yvonne爱编码11 分钟前
零基础学习数据采集与监视控制系统SCADA
学习·信息可视化·信息与通信·数据可视化
肥肠可耐的西西公主37 分钟前
后端(JDBC)学习笔记(CLASS 1):基础篇(一)
笔记·学习
励志不掉头发的内向程序员1 小时前
从零开始的python学习——文件
开发语言·python·学习
悠哉悠哉愿意2 小时前
【数学建模学习笔记】无监督聚类模型:分层聚类
笔记·python·学习·数学建模
北冥电磁电子智能3 小时前
江协科技STM32学习笔记补充之004
笔记·科技·学习
一个响当当的名号3 小时前
c++primer 个人学习总结-模板和泛型编程
开发语言·c++·学习
落羽的落羽3 小时前
【C++】C++11的可变参数模板、emplace接口、类的新功能
开发语言·c++·学习
滴滴滴嘟嘟嘟.3 小时前
Qt对话框与文件操作学习
开发语言·qt·学习
乱飞的秋天3 小时前
IO学习
学习
snowfoootball5 小时前
近期算法学习记录
学习·算法