gpt4 book ai didi

Java Apache POI 防止数据在 Excel 中被覆盖

转载 作者:行者123 更新时间:2023-12-01 12:40:06 36 4
gpt4 key购买 nike

我正在从文件中读取 json 字符串,并对数据进行一些验证。如果验证过程中出现任何错误,我会将数据写入 Excel 工作表。我的问题是我的 Excel 工作表越来越每次都被覆盖。正如您在 writeErrorsToSpreadSheet 方法中看到的,我将该数据放在工作表中的同一行中。每次在 writeErrorsToSpreadSheet 中调用 for 循环时 方法中,count 被设置为 0,并且数据被覆盖。我已经运行了调试器,并尝试了多种方法来解决此问题,但无济于事:( 有人可以吗 指导我如何附加到文件而不覆盖它?

public static void main( String[] args ) throws Exception
{
File[] files = findFilesInDir("/home/input");
if(files!=null && files.length!=0) {
List<String> fileData = new ArrayList<String>();
for(File file:files) {
fileData.add(readFileContents(file.getAbsolutePath()));
validateData(file); //this is where data validation happens. if anything fails here, i write the data to the spread sheet. the excel sheet is getting overwritten here
}

}

public static String readFileContents(String location) throws IOException {
InputStream is = new FileInputStream(location);
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
reader.close();
return sb.toString();
}



Here is the validateData method -

validateData(String file,Person person) {
//do some string validation, and write the error to a spread sheet
writeErrorsToSpreadSheet(person);

}

In the test class, here is the writeToSpreadSheet method
private static void writeErrorsToSpreadSheet(Person person) throws IOException {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Test Sheet");
FileOutputStream fis = new FileOutputStream("input.xls");
Map<String,Object[]> data = new LinkedHashMap<String,Object[]>();
data.put("1", new Object[]{"Name","Address","PhoneNumber"});
int count=0;
for(Map.Entry<String, String> errorMp:errorMap.entrySet()) {
data.put(Integer.toString(count+2), new Object[]{person.getName(),person.getAddress(),person.getPhoneNumber()});
count++;
}

Set<String> keyset = data.keySet();
int rownum = 0;
for (String 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);
}
}
workbook.write(fis);
if(fis!=null)
fis.close();
}

最佳答案

每次调用 writeErrorsToSpreadSheet 时,它都会创建一个新的空白工作簿并创建一个工作表。然后将其写入文件,覆盖那里的旧文件。

如果您希望此方法追加到现有工作簿,则必须通过加载现有工作簿来创建 HSSFWorkbook 对象。

HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream("input.xls"));

然后,您可以使用 SheetgetLastRowNum 方法找到工作表中最后填充的行,您可以使用该方法将数据添加到下一行。

您可能还想考虑在 org.apache.poi.ss.usermodel 包中使用“HSSF”(.xls) 和“XSSF”(.xlsx) 世界之间的通用接口(interface),并且可以使用 WorkbookFactory获取新的 Workbook,它将适用于 .xls (HSSFWorkbook) 和 .xlsx (XSSFWorkbook) 文件。

关于Java Apache POI 防止数据在 Excel 中被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25193045/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com