【问题标题】:Why we need to create a Workbook before reading the Excel file using Apache POI?为什么我们需要在使用 Apache POI 读取 Excel 文件之前创建工作簿?
【发布时间】:2017-08-16 07:58:12
【问题描述】:

请在下方找到代码 sn-p

public class DataDriven_GetDataExcel {

public static void main(String[] args) throws  IOException, EncryptedDocumentException, InvalidFormatException {   

//1 Getting Control over File
FileInputStream fis = new FileInputStream("C:\\Users\\bewosaurabh\\Documents\\GetDataFile.xlsx");

//2 Creating a Workbook
Workbook wb = WorkbookFactory.create(fis);

//3 Getting Control over Sheet
Sheet sh = wb.getSheet("Sheet1");
            .
            ......

我不明白为什么我们需要在读取 Excel 文件之前创建一个工作簿? Excel 文件也称为工作簿(如下图所示)。

当我们创建一个 excel 文件时,这意味着我们正在创建一个工作簿。从那里,我们访问表格,然后是行和列。

当我们已经有一个“工作簿”时,我不明白为什么要写WorkbookFactory.create(fis); 我们应该有一些方法来获取我们创建的工作簿,就像我们为 Rows(getRow)、Sheets (getSheet)、Cells (getCell) 所做的那样。

你能帮我理解 POI 吗?

【问题讨论】:

  • WorkbookFactory.create 不会创建工作簿(Excel 文件)。它实例化一个代表工作簿的类。
  • 哦..好的,非常感谢@GSerg

标签: excel selenium-webdriver apache-poi


【解决方案1】:

Workbook wb = WorkbookFactory.create(fis); 所做的是:

从使用文件输入流读取的文件内容中实例化一个实现WorkbookJava 对象。之后,Workbook 对象将位于内存中。只有在访问了这个Workbook 对象之后,我们才能使用它的方法。

如果我们使用Workbook wb = WorkbookFactory.create(file);,即使用File 而不是InputStream,那么WorkbookFactory 将直接从文件中创建Workbook 对象。这样做的好处是不必将整个文件内容读入内存。所以我们的内存占用更少。缺点是打开读取的文件不能同时用于写入。所以我们不能将我们使用Workbook 的方法所做的更改写入我们从Workbook 读取的同一个文件中。

如果内存占用是一个更大的问题,那么对于 XSSF (*.xlsx),我们可以获取底层 XML 数据并使用 XSSF and SAX (Event API) 处理它。使用它我们不需要实例化Workbook 对象。相反,我们直接从OPCPackage 读取和解析XML,如果是XSSF (*.xlsx),ZipPackage 是因为*.xlsx 只是一个ZIP 存档,其中包含一个包含@987654344 的目录结构@ 文件和其他文件。

由于*.xlsx 只是一个ZIP 存档,我们也可以将其打开为FileSystemFileSystems 获取,然后完全独立于第三方库处理其内容。但这将是最具挑战性的方法。

【讨论】:

  • 感谢@Axel Richter 的及时回复和详细解释。我明白了。
猜你喜欢
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2020-06-15
相关资源
最近更新 更多