请在下方找到代码段
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);
我们应该有一些方法来获取我们为Rows(getRow),Sheets(getSheet),Cells(getCell)创建的工作簿。
你能帮我理解POI吗?
答案 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
,则ZIP
是XML
,因为*.xlsx
只是ZIP
{1}}存档包含包含{{1}}个文件和其他文件的目录结构。
由于{{1}}只是{{1}}存档,我们也可以从FileSystem获取FileSystems,然后完全独立于第三方库处理其内容。但这将是最具挑战性的方法。