为什么需要在使用Apache POI读取Excel文件之前创build工作簿?

请在下面find一个代码片段

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文件之前创build一个工作簿? Excel文件也被称为工作簿(如下图所示)。 在这里输入图像说明

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

我不明白为什么我们写了WorkbookFactory.create(fis); 当我们已经有一个“工作簿”时,我们应该有一些方法来获得我们为Rows(getRow),Sheets(getSheet),Cells(getCell)所创build的工作簿。

你能帮我理解POI吗?

什么Workbook wb = WorkbookFactory.create(fis); 确实是:

从使用文件inputstream读取的文件的内容实例化实现Workbook的Java对象。 之后, Workbook对象被放置在内存中。 只有在访问这个Workbook对象之后,我们才能使用它的方法。

如果我们使用Workbook wb = WorkbookFactory.create(file); ,即使用File而不是InputStream ,则WorkbookFactory将直接从该文件创buildWorkbook对象。 这样做的好处是不必将整个文件内容读入内存。 所以我们有一个较低的内存占用。 缺点是打开的文件不能用于同时写入。 所以我们不能把我们使用Workbook的方法所做的改变写入到我们已经阅读了Workbook文件中。

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

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