準備工作

首先需引入 Apache POI 依賴(Maven 為例):

xml

<!-- 處理 .xlsx 格式 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.4</version> <!-- 最新穩定版 -->
</dependency>
<!-- 處理 .xls 格式(如需兼容舊版本) -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.4</version>
</dependency>

1. 插入文本框(XSSF 為例,.xlsx 格式)

文本框在 Excel 中屬於 “繪圖對象”,通過 XSSFDrawing 和 XSSFShape 操作。

java

運行

import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTTwoCellAnchor;

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

public class ExcelTextBox {
    public static void main(String[] args) throws IOException {
        // 創建新的 .xlsx 工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("文本框示例");

        // 獲取繪圖對象(用於添加形狀)
        XSSFDrawing drawing = sheet.createDrawingPatriarch();

        // 定義文本框位置和大小(以單元格為單位,從 (row1, col1) 到 (row2, col2))
        int row1 = 1, col1 = 1; // 左上角起點
        int row2 = 5, col2 = 5; // 右下角終點
        CTTwoCellAnchor anchor = drawing.getCTDrawing().addNewTwoCellAnchor();
        // 設置起點和終點單元格
        anchor.setFrom(drawing.getCTDrawing().getTwoCellAnchorArray(0).getFrom()
                .setRow(row1).setCol(col1));
        anchor.setTo(drawing.getCTDrawing().getTwoCellAnchorArray(0).getTo()
                .setRow(row2).setCol(col2));

        // 創建文本框
        XSSFTextBox textBox = drawing.createTextBox(anchor);
        // 設置文本框內容
        XSSFRichTextString text = new XSSFRichTextString("這是一個文本框\n第二行內容");
        textBox.setText(text);

        // 設置文本框樣式(可選)
        textBox.setLineStyleColor(0, 0, 255); // 邊框顏色(藍色)
        textBox.setFillColor(255, 255, 200); // 填充色(淺黃)

        // 寫入文件
        try (FileOutputStream out = new FileOutputStream("textbox_example.xlsx")) {
            workbook.write(out);
        }
        workbook.close();
    }
}

2. 提取文本框內容

遍歷 Excel 中的繪圖對象,篩選出文本框並獲取其內容。

java

運行

import org.apache.poi.xssf.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;

public class ExtractTextBox {
    public static void main(String[] args) throws IOException {
        // 讀取現有 .xlsx 文件
        try (XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("textbox_example.xlsx"))) {
            XSSFSheet sheet = workbook.getSheetAt(0); // 獲取第一個工作表
            XSSFDrawing drawing = sheet.getDrawingPatriarch();

            if (drawing != null) {
                // 遍歷所有形狀
                for (XSSFShape shape : drawing.getShapes()) {
                    // 判斷是否為文本框
                    if (shape instanceof XSSFTextBox) {
                        XSSFTextBox textBox = (XSSFTextBox) shape;
                        // 獲取文本內容
                        String text = textBox.getText().getString();
                        System.out.println("文本框內容:" + text);
                    }
                }
            }
        }
    }
}

3. 刪除文本框

通過移除繪圖對象中的文本框實例實現刪除。

java

運行

import org.apache.poi.xssf.usermodel.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;

public class DeleteTextBox {
    public static void main(String[] args) throws IOException {
        try (XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("textbox_example.xlsx"))) {
            XSSFSheet sheet = workbook.getSheetAt(0);
            XSSFDrawing drawing = sheet.getDrawingPatriarch();

            if (drawing != null) {
                // 迭代器遍歷並刪除文本框
                Iterator<XSSFShape> iterator = drawing.getShapes().iterator();
                while (iterator.hasNext()) {
                    XSSFShape shape = iterator.next();
                    if (shape instanceof XSSFTextBox) {
                        iterator.remove(); // 刪除文本框
                        System.out.println("已刪除一個文本框");
                    }
                }
            }

            // 保存修改
            try (FileOutputStream out = new FileOutputStream("textbox_example.xlsx")) {
                workbook.write(out);
            }
        }
    }
}

注意事項

  1. 格式兼容
  • 上述示例針對 .xlsx(XSSF),若需處理 .xls(HSSF),需將類名替換為 HSSFWorkbookHSSFSheet 等,邏輯類似。
  1. 文本框定位
  • 文本框位置通過 TwoCellAnchor 定義,from 和 to 分別對應左上角和右下角的單元格座標。
  1. 複雜樣式
  • 可通過 XSSFRichTextString 設置文本字體、顏色等,通過 XSSFTextBox 的方法設置邊框、填充等樣式。
  1. 性能
  • 大量文本框操作時,建議批量處理並及時關閉流,避免內存泄漏。

通過 Apache POI 可靈活實現 Excel 文本框的增刪改查,滿足大多數辦公自動化場景需求。