準備工作
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 格式)
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. 提取文本框內容
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);
}
}
}
}
注意事項
- 上述示例針對
.xlsx(XSSF),若需處理.xls(HSSF),需將類名替換為HSSFWorkbook、HSSFSheet等,邏輯類似。
- 文本框位置通過
TwoCellAnchor定義,from和to分別對應左上角和右下角的單元格座標。
- 可通過
XSSFRichTextString設置文本字體、顏色等,通過XSSFTextBox的方法設置邊框、填充等樣式。
- 大量文本框操作時,建議批量處理並及時關閉流,避免內存泄漏。