为什么需要在使用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获取 ,然后完全独立于第三方库处理其内容。 但这将是最具挑战性的方法。