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

时间:2017-08-16 07:58:12

标签: excel selenium-webdriver apache-poi

请在下方找到代码段

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文件也称为工作簿(如下图所示)。 enter image description here

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

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

你能帮我理解POI吗?

1 个答案:

答案 0 :(得分:4)

Workbook wb = WorkbookFactory.create(fis);的作用是:

从使用文件输入流读取的文件内容中实例化Java对象,该对象实现Workbook。之后,Workbook对象随后位于内存中。只有在访问此Workbook对象后,我们才能使用其方法。

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

如果内存占用是一个更大的问题,那么对于XSSF(XML),我们可以获取基础XML数据并使用XSSF and SAX (Event API)对其进行处理。使用此方法,我们不需要实例化OPCPackage对象。相反,我们正在直接从ZipPackage读取和解析*.xlsx,如果是*.xlsx,则ZIPXML,因为*.xlsx只是ZIP {1}}存档包含包含{{1}}个文件和其他文件的目录结构。

由于{{1}}只是{{1}}存档,我们也可以从FileSystem获取FileSystems,然后完全独立于第三方库处理其内容。但这将是最具挑战性的方法。