首页 文章

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

提问于
浏览
3

请在下面找到代码段

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); 时我们已经有'Workbook'我们应该有一些方法来获取我们创建的工作簿,就像我们有Rows(getRow),Sheets(getSheet),Cells(getCell) .

你能帮我理解POI吗?

1 回答

  • 4

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

    从使用文件输入流读取的文件内容实例化 Java 对象,该对象实现Workbook . 之后, 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 存档,包含包含 XML 文件和其他文件的目录结构 .

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

相关问题