学习在Java中使用Apache POI在excel表中追加新行。在这个例子中,我们将学习如何准备数据(写入),然后在现有工作表的最后一行之后追加新的行。
1.Maven的依赖性
在应用程序中添加最新版本的org.apache.poi:poi和org.apache.poi:poi-ooxml,如果尚未添加的话。
<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>
2.核心类和方法
POI使用以下类来读取或写入数据。
XSSFWorkbook
:表示一个excel工作簿。Sheet
: 代表工作簿中的一个工作表。Row
代表工作表中的一行。Cell
代表任何一行中的一个单元。
要向工作表写入或追加记录,我们需要使用以下方法。
workbook.getSheetAt(index)
或 通过索引或名称获得工作表。索引从0开始。workbook.getSheet(name)
sheet.getLastRowNum()
返回工作表中的最后一行编号。在追加新行的情况下有帮助。sheet.createRow(num)
在给定的工作表中创建一个新的行。row.createCell(num)
在给定的行中创建一个新的单元格。cell.setCellValue(val)
在给定的单元格中设置一个值。
3.向工作表添加行
使用上面讨论的方法,我们将在下面的Excel表中追加新的行。
这些数据可以是任何形式的。为了保持简单,我们有以下包含数据的模型。
public class BusinessEntity {
private String firstName;
private String lastName;
private String age;
//constructors, getters and setters
}
尽管我们可以根据需要编写逻辑,但在这里我们要创建一个通用的Object[]
,我们将把它传递给一个实用函数。对象数组中的值按照索引顺序被映射到行中的单元格。
private static Map<Integer, Object[]> prepareData(int rowNum,
List<BusinessEntity> recordsToWrite) {
Map<Integer, Object[]> data = new HashMap<>();
for (BusinessEntity entity : recordsToWrite) {
rowNum++;
data.put(rowNum, new Object[]{rowNum, entity.getFirstName(),
entity.getLastName(), entity.getAge()});
}
return data;
}
下面是在excel中写入记录的实用函数。它把文件路径和记录作为方法参数。然后它调用prepareData()来创建对象数组。最后,对象数组被迭代,并根据数组中的索引填充单元格值。
请注意,该函数检查对象数组中数值的数据类型,因此我们可以调用相应的setCellValue()方法。
public static void appendRows(List<BusinessEntity> recordsToWrite, File file)
throws IOException, InvalidFormatException {
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(file));
Sheet sheet = workbook.getSheetAt(0);
int rowNum = sheet.getLastRowNum() + 1;
Map<Integer, Object[]> data = prepareData(rowNum, recordsToWrite);
Set<Integer> keySet = data.keySet();
for (Integer key : keySet) {
Row row = sheet.createRow(rowNum++);
Object[] objArr = data.get(key);
int cellNum = 0;
for (Object obj : objArr) {
Cell cell = row.createCell(cellNum++);
if (obj instanceof String)
cell.setCellValue((String) obj);
else if (obj instanceof Integer)
cell.setCellValue((Integer) obj);
}
}
try {
FileOutputStream out = new FileOutputStream(file);
workbook.write(out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
4.演示
为了运行这个演示,我们将创建一些记录,并将它们与文件路径一起传递给实用程序appendRows()
。
public static void main(String[] args) {
File file = new File("C:\\temp\\data.xlsx");
List<BusinessEntity> recordsToWrite = List.of(
new BusinessEntity("Charles", "Babej", 60),
new BusinessEntity("John", "Doe", 70),
new BusinessEntity("Loreum", "Ipsum", 80)
);
try {
appendRows(recordsToWrite, file);
} catch (IOException | InvalidFormatException e) {
e.printStackTrace();
}
}
验证excel文件中附加的行。注意,格式化单元格值不属于本教程的范围。
5.总结
在这个Apache POI教程中,我们学会了通过创建一些实用函数在现有的excel表中添加新行。我建议你玩玩这些代码,以便更好地理解。
学习愉快!!