ApachePOI的文档(版本3.17)说
无效关闭()
抛出java。伊奥。IOException
关闭从中读取工作簿的基础输入资源(文件或流)。
我的代码从模板文件创建工作簿,并对其进行处理,然后将其写入新文件。模板文件应该保持不变。但是当我调用close()方法时,文件的更改方式与输出文件相同。
有人能解释一下吗?close()方法中是否有类似于内置write()调用的功能?这是一个bug还是一个特性?
到目前为止,我的解决方案是不使用close()调用,但不知何故它感觉不完整。
String inPath = "/home/elmicha/test/template.xlsx";
String outPath = "/home/elmicha/test/out.xlsx";
try {
Workbook xlsxFile = WorkbookFactory.create(new File(inPath));
xlsxFile.getSheetAt(0).createRow(0).createCell(0).setCellValue("test");
try (FileOutputStream pOuts = new FileOutputStream(outPath)) {
xlsxFile.write(pOuts);
xlsxFile.close();
}
} catch (IOException | InvalidFormatException | EncryptedDocumentException ex) {
//...
}
只有在忽略FileNotFoundException时,使模板文件只读的“解决方案”才能起作用。。。(权限被拒绝)
由文档引起。然后关闭
。我们应该设置文件在处理后可写,以便进一步使用。
因此,以下方法将起作用:
import org.apache.poi.ss.usermodel.*;
import java.io.File;
import java.io.FileOutputStream;
class ReadAndWriteExcelWorkbook {
public static void main(String[] args) throws Exception {
File templatefile = new File("file.xlsx");
templatefile.setWritable(true);
try (Workbook workbook = WorkbookFactory.create(templatefile)) { //at this point the file must be writable
//try (Workbook workbook = WorkbookFactory.create(templatefile, null, true)) { //this will not work
Sheet sheet = workbook.getSheetAt(0);
for (int r = 0; r < 10; r++) {
Row row = sheet.getRow(r);
if (row == null) row = sheet.createRow(r);
Cell cell = row.getCell(r);
if (cell == null) cell = row.createCell(r);
cell.setCellValue("changed");
}
FileOutputStream out = new FileOutputStream("fileNew.xlsx");
workbook.write(out);
out.close();
templatefile.setWritable(false);
} catch (java.io.FileNotFoundException ioex) {
ioex.printStackTrace(); //we simply do ignoring this FileNotFoundException
}
templatefile.setWritable(true);
}
}
注意事项:
而WorkbookFactory。创建(模板文件)
模板文件必须是可写的,因为它默认为WorkbookFactory。创建时将布尔只读设置为
假
。因此,如果此时将模板文件
设置为只读,则WorkbookFactory。创建(模板文件)
将失败。
我们不能使用WorkbookFactory.create(templatefile, null, true)
-将boolean只读
设置为true
-因为这将在workbook.write
失败,而POIXMLDocument.write
将更改提交给底层OPCPackage
。
这很不寻常。我不明白为什么要写入模板文件。这当然不是我的经历。你可以试试:
FileInputStream
而不是File
来使其无法写入模板文件。工作簿
。这里有一个例子:
String inPath = "/home/elmicha/test/template.xlsx";
String outPath = "/home/elmicha/test/out.xlsx";
try (Workbook xlsxFile = WorkbookFactory.create(new FileInputStream(inPath))) {
xlsxFile.getSheetAt(0).createRow(0).createCell(0).setCellValue("test");
try (FileOutputStream pOuts = new FileOutputStream(outPath)) {
xlsxFile.write(pOuts);
}
} catch (IOException | InvalidFormatException | EncryptedDocumentException ex) {
//...
}
或者也许:
String inPath = "/home/elmicha/test/template.xlsx";
String outPath = "/home/elmicha/test/out.xlsx";
try (Workbook xlsxFile = WorkbookFactory.create(new FileInputStream(inPath));
FileOutputStream pOuts = new FileOutputStream(outPath)) {
xlsxFile.getSheetAt(0).createRow(0).createCell(0).setCellValue("test");
xlsxFile.write(pOuts);
} catch (IOException | InvalidFormatException | EncryptedDocumentException ex) {
//...
}
然后另一个问题是工作簿的名称都不同,所有300个。是否有一个宏可以复制我打开的工作簿,而不是每次都输入实际的名称?
这是我读写现有excel文件的课程。我一直在主类中通过传递filePath和fileName来调用这些函数。 当我在main中使用readExcel获取一个工作簿并调用这个函数时: 我得到了正确的行,并且能够调用此行上的所有函数。但是对于写Excel()中完全相同的工作表中的完全相同的行,我得到了一个空指针异常(上面代码中***前面的行)。getRow()在这里给我null。我在这里做错了什么?
我有一段代码,目前正在写入一个
我正在处理一个项目,该项目需要读取Excel工作簿,调用必要的Web服务,然后从Web服务获取响应,并将该信息输入到已读取的同一Excel工作簿中。 以下是我在尝试写入Excel工作簿时看到的错误: 以下是我打开文件/读取的代码: 在此之后,我读取每一行并提取每个单元格值。 完成后,我将在成功和结果消息的标题下创建单元格,然后执行以下操作: 有人遇到过类似的问题吗?
问题内容: 我正在一个项目中,该项目需要读取Excel工作簿,调用必要的Web服务,然后从Web服务获取响应,并将该信息输入到已读取的同一Excel工作簿中。 这是我尝试写入Excel工作簿时遇到的错误: 这是我打开文件/读取的代码: 之后,我读取每一行并提取每个单元格值。 完成此操作后,我将在“成功和结果消息”标题下创建单元格,然后执行以下操作: 有没有人遇到过类似的问题? 问题答案: 列出的当
本文向大家介绍C#实现写入文本文件内容的方法,包括了C#实现写入文本文件内容的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现写入文本文件内容的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。