使用电子表格管理
使用电子表格管理
本指南展示了如何使用 Aspose.Cells FOSS for Java 创建、加载、修改和保存 Excel 工作簿。您将学习如何使用 Workbook、WorksheetCollection、Worksheet、Cells 和 Cell 类进行端到端的电子表格管理。
创建新工作簿
使用无参构造函数创建空工作簿。将自动添加一个名为 Sheet1 的空白工作表。
import com.aspose.cells.foss.Workbook;
import com.aspose.cells.foss.WorksheetCollection;
import com.aspose.cells.foss.Worksheet;
Workbook workbook = new Workbook();
WorksheetCollection sheets = workbook.getWorksheets();
Worksheet sheet = sheets.get(0);
System.out.println("Sheet name: " + sheet.getName()); // Sheet1从文件加载工作簿
将文件路径传递给 Workbook(fileName) 构造函数,以打开现有的 .xlsx 或 .ods 文件。当需要控制格式检测或密码处理时,使用 Workbook(fileName, options) 提供 LoadOptions。
import com.aspose.cells.foss.Workbook;
import com.aspose.cells.foss.LoadOptions;
// Simple load
Workbook workbook = new Workbook("data/report.xlsx");
// Load with explicit options
LoadOptions opts = new LoadOptions();
Workbook workbookWithOpts = new Workbook("data/report.xlsx", opts);从流加载工作簿
Workbook(stream) 和 Workbook(stream, options) 接受任何 java.io.InputStream。当文件来自网络资源、数据库 BLOB 或内存字节数组时,这非常有用。
import com.aspose.cells.foss.Workbook;
import java.io.FileInputStream;
import java.io.InputStream;
try (InputStream is = new FileInputStream("data/template.xlsx")) {
Workbook workbook = new Workbook(is);
System.out.println("Worksheets: " + workbook.getWorksheets().getCount());
}访问和管理工作表
Workbook.getWorksheets() 返回一个 WorksheetCollection。可通过索引或名称检索工作表,遍历所有工作表,并根据需要添加或删除工作表。
import com.aspose.cells.foss.Workbook;
import com.aspose.cells.foss.WorksheetCollection;
import com.aspose.cells.foss.Worksheet;
Workbook workbook = new Workbook();
WorksheetCollection sheets = workbook.getWorksheets();
// Access by index
Worksheet first = sheets.get(0);
System.out.println(first.getName()); // Sheet1
// Add a named sheet
int idx = sheets.add("Summary");
Worksheet summary = sheets.get(idx);
summary.setName("Summary");
// Iterate all sheets
for (Worksheet ws : sheets) {
System.out.println("Sheet: " + ws.getName());
}
// Remove a sheet by name
sheets.removeAt("Sheet1");
System.out.println("Remaining sheets: " + sheets.getCount());读取和写入单元格值
使用 Worksheet.getCells() 导航到单元格,它返回一个 Cells 集合。可通过名称(例如 "A1")或零基行/列索引检索 Cell。使用 putValue() 写入原始值,使用 getValue() / getStringValue() 读取它们。
import com.aspose.cells.foss.Workbook;
import com.aspose.cells.foss.Worksheet;
import com.aspose.cells.foss.Cells;
import com.aspose.cells.foss.Cell;
Workbook workbook = new Workbook();
WorksheetCollection sheets = workbook.getWorksheets();
Worksheet sheet = sheets.get(0);
Cells cells = sheet.getCells();
// Write values
cells.get("A1").putValue("Product");
cells.get("B1").putValue("Units Sold");
// Write by row/column index (0-based)
Cell a2 = cells.get(1, 0);
a2.putValue("Widget A");
Cell b2 = cells.get(1, 1);
b2.putValue(1200);
// Read back
System.out.println(a2.getStringValue()); // Widget A
System.out.println(b2.getValue()); // 1200设置单元格公式
通过 setFormula() 将公式字符串分配给单元格。Aspose.Cells 在工作簿保存时或显式触发计算时评估公式。
import com.aspose.cells.foss.Workbook;
import com.aspose.cells.foss.Cells;
import com.aspose.cells.foss.Cell;
Workbook workbook = new Workbook();
WorksheetCollection sheets = workbook.getWorksheets();
Cells cells = sheets.get(0).getCells();
cells.get("A1").putValue(100);
cells.get("A2").putValue(200);
Cell a3 = cells.get("A3");
a3.setFormula("=SUM(A1:A2)");
System.out.println("Formula: " + a3.getFormula()); // =SUM(A1:A2)保存工作簿
使用 Workbook.save(fileName) 将工作簿写入磁盘。输出格式由文件扩展名决定;对于 Excel 工作簿,请使用 .xlsx。
import com.aspose.cells.foss.Workbook;
Workbook workbook = new Workbook();
workbook.getWorksheets().get(0).getCells().get("A1").putValue("Hello");
// Save to file -- format inferred from .xlsx extension
workbook.save("output/result.xlsx");释放资源
Workbook 实现了 AutoCloseable。使用 try-with-resources 代码块,以确保工作簿的内部资源在使用后能够及时释放。
import com.aspose.cells.foss.Workbook;
try (Workbook workbook = new Workbook("data/large.xlsx")) {
workbook.save("output/large_modified.xlsx");
}
// workbook.close() called automatically提示与最佳实践
- 对于大文件,请始终使用 try-with-resources(
try (Workbook wb = new Workbook(...)))以避免文件句柄保持打开状态。 - 在热点循环中,优先使用
cells.get(row, column)而不是cells.get(cellName);整数重载可避免重复的单元格名称解析。 - 在按索引访问工作表之前调用
workbook.getWorksheets().getCount(),以避免IndexOutOfBoundsException。 - 在
add()之后使用setName()明确命名工作表,以便下游代码能够通过名称而非脆弱的索引来查找它们。 - 不要在
setFormula()之后立即依赖公式结果;如果在同一会话中需要计算值,请先保存或重新加载。
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
WorkbookLoadException 在 new Workbook(fileName) 上 | 文件路径不正确或文件被锁定 | 验证路径是否存在且可读;关闭占用该文件的其他应用程序 |
get(index) 抛出 IndexOutOfBoundsException | 工作表索引超出 getCount() - 1 | 在访问之前检查 sheets.getCount();使用 add() 创建新工作表 |
公式单元格返回空的 getValue() | 公式未在内存中自动计算 | 保存工作簿并重新加载以获取公式结果 |
输出文件在 save() 之后损坏 | 错误的文件扩展名 | 确保文件名以 .xlsx 结尾;格式根据扩展名推断 |
FAQ
如何重命名工作表?
通过索引从 WorksheetCollection 检索 Worksheet 对象,并使用新的显示名称调用 setName(name):
workbook.getWorksheets().get(0).setName("Sales Data");如何检查工作簿中有多少工作表?
对 Workbook.getWorksheets() 返回的 WorksheetCollection 调用 getCount(),以获取工作表的总数:
int count = workbook.getWorksheets().getCount();我可以一次调用添加多个工作表吗?
No. 每张工作表调用一次 worksheets.add(sheetName)。每次调用返回新创建工作表的索引。
我该如何检查单元格值的类型?
通过名称检索 Cell 并调用 getType(),它返回一个 CellValueType 枚举值:
Cell cell = cells.get("A1");
System.out.println(cell.getType()); // CellValueType enum valueAPI Reference 摘要
| 类 / 方法 | 描述 |
|---|---|
Workbook() | 创建一个包含一个空白工作表的空工作簿 |
Workbook(fileName) | 从文件路径加载工作簿 |
Workbook(stream) | 从InputStream加载工作簿 |
Workbook(fileName, options) | 使用LoadOptions加载工作簿 |
Workbook.getWorksheets() | 返回 WorksheetCollection |
Workbook.save(fileName) | 保存到文件(根据扩展名推断格式) |
Workbook.save(stream, format) | 保存到流,使用显式的 SaveFormat |
WorksheetCollection.get(index) | 返回零基索引的工作表 |
WorksheetCollection.get(name) | 按名称返回工作表 |
WorksheetCollection.add(sheetName) | 添加具名工作表;返回其索引 |
WorksheetCollection.getCount() | 工作簿中的工作表数量 |
WorksheetCollection.removeAt(sheetName) | 按名称删除工作表 |
Worksheet.getCells() | 返回此工作表的 Cells 集合 |
Worksheet.getName() / setName() | 获取或设置工作表标签名称 |
Cells.get(cellName) | 通过名称返回一个 Cell(例如 “A1”) |
Cells.get(row, column) | 通过基于零的行/列返回一个 Cell |
Cell.putValue(value) | 向单元格写入值 |
Cell.getValue() | 将单元格值读取为 Object |
Cell.getStringValue() | 将单元格值读取为一个 String |
Cell.setFormula(formula) | 设置一个公式字符串(例如 "=SUM(A1:A2)") |
LoadOptions | 工作簿加载的配置 |
SaveFormat | 格式常量的枚举(格式从文件扩展名推断;未传递给 save()) |