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

相关推荐
zmd-zk4 分钟前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
Chef_Chen19 分钟前
从0开始学习机器学习--Day33--机器学习阶段总结
人工智能·学习·机器学习
hopetomorrow1 小时前
学习路之压力测试--jmeter安装教程
学习·jmeter·压力测试
hopetomorrow1 小时前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
腾科张老师1 小时前
如何进行Apache的配置与调试?
apache
DC_BLOG1 小时前
Linux-Apache静态资源
linux·运维·apache
/**书香门第*/1 小时前
Cocos creator 3.8 支持的动画 7
学习·游戏·游戏引擎·游戏程序·cocos2d
美式小田2 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
猫爪笔记2 小时前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html
-一杯为品-3 小时前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程