请在下面找到代码段
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);
时我们已经有'Workbook'我们应该有一些方法来获取我们创建的工作簿,就像我们有Rows(getRow),Sheets(getSheet),Cells(getCell) .
你能帮我理解POI吗?
1 回答
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然后处理其内容完全独立于第三方库 . 但这将是最具挑战性的方法 .