How to distinguish between XSSF and HSSF automatically in Apache POI? - java

I would like to be able to open Excel file of arbotrary type. Is it possible to select between HSSFWorkbook and XSSFWorkbook automatically?
Currently I write
Workbook workbook = new HSSFWorkbook(excelFile);
Can I write universal?

Yes! All you need to do is use WorkbookFactory
As per this part of the docs, it's better to use a File than an InputStream. So, just do something like:
File file = new File("input.xls");
Workbook wb = WorkbookFactory.create(file);
That will create whichever of HSSFWorkbook or XSSFWorkbook your file needs

Related

Check if Excel file supports Apache POI HSSF or XSSF

I am using Apache POI HSSF/XSSF library to support Excel file reading functionality in my java code.
Now we are struggling with a thing that, we are not sure which version of Excel we will receive. It can be very old one or new one with macros and so on.
Workbook worbook = null;
if(FileUtils.getFileExt(file).equalsIgnoreCase("xls")) {
workbook = new HSSFWorkbook(new FileInputStream(file));
} else if (FileUtils.getFileExt(file).equalsIgnoreCase("xlsx"))
workbook = new XSSFWorkbook(new FileInputStream(file));
}
According to the Excel doc there is more formats like xlsm. xlt which we can receive.
Is there any other option to recognize which implementation should I use (HSSF vs XSSF)? Is there any possibility that xls will be not supported by HSSF?

apache poi copy from very large xls to new workbook sheet

I have very large xls file , which contains two sheets. I want to combine these two sheets into one and copy to new workbook . But I get out of memory exception when I try to access this large xls as below :
FileInputStream fis = new FileInputStream(new File("input.xls"));
HSSFWorkbook workbook = new HSSFWorkbook(fis);
I tried using event api for xls : http://poi.apache.org/spreadsheet/how-to.html#event_api
But using that we can only read the cell values . But here I need to copy to new excel sheet.
Apache POI provides a low-memory footprint SXSSF API to write data to xlsx. It does not load everything in memory at once so it's the solution while working with very large excel files. You may want to consider this.

When trying to open the .xlsx file created by selenium, getting a message stating that the file is corrupted

I created an .xlsx file using selenium through File "fil.createNewFile()", the file got created in the location but when i try to open the file i am getting a message "Excel cannot open the file 'Example.xlsx' because the file format or file extension is not valid....". Why is this happening. Please guide me to over come this problem.
Thanks in advance...
What eltabo mentioned is correct. Below is a code sample from Apache POI which will create a blank excel file.
HSSFWorkbook workbook = new HSSFWorkbook();
FileOutputStream out = new FileOutputStream(new File("C:\\new.xls"));
workbook.write(out);
out.close();
I guess you are trying something like:
File fil = new File("Example.xlsx");
fil.createNewFile();
Well, it this is your case you're creating a file with xlsx extension, but it's not truly a Excel file (it's empty). If you try to create a new file using Excel or File Explorer, you can see that a new fresh xlsx file weight about 10kb. If you need to create a Excel file you need to use Apache POI, or another library.
You need to add a sheet at least:
XSSFWorkbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet();
FileOutputStream fileOut = new FileOutputStream("Example.xlsx");
wb.write(fileOut);
fileOut.close();
PS: I use poi-ooxml, since you use a xlsx file.
Hope it helps.

org.apache.poi.poifs.filesystem.OfficeXmlFileException

i want to read a microsoft word document i.e. .docx format using POI but getting error:
The supplied data appears to be in the Office 2007+ XML. POI only supports OLE2 Office documents
if anyone can help me to get rid of this??
You should have a read through the Converting from HSSF to the Common SS Usermodel page to help you understand what you need to change.
As a general guide though, if your code was previously
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("foo.xls"));
HSSFSheet s = wb.getSheetAt(0);
HSSFRow r = s.getRow(0);
System.out.println("Cell A1 is " + r.getCell(0));
It should instead become
Workbook wb = WorkbookFactory.create(new File("foo.xls")); // Or foo.xlsx
Sheet s = wb.getSheetAt(0);
Row r = s.getRow(0);
System.out.println("Cell A1 is " + r.getCell(0));
Please check http://poi.apache.org/spreadsheet/converting.html about new models XSSF and HSSF.
Not sure which API from POI you are using, but I presume that you are using the HSSF API. Instead you should use the the XSSF API (see http://poi.apache.org/spreadsheet/index.html for details). For example instead of using Workbook wb = new HSSFWorkbook(); use Workbook wb = new XSSFWorkbook();
HSSF workbook will not work for higher version of excel file instead of HSSFWorkbook use XXSFWOrkbook.You can have the complete code in the below link
http://aravind-soa.blogspot.com/2017/02/how-to-import-excel-file-into-oracle.html

Java poi convert xml to xls

I have file in type xls with xml extension, I want to read it like excel file.
I trying
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(inputFile));
HSSFSheet sheet = wb.getSheetAt(0);
but it read only with xls extension.
someone know how??
thank
You have to use the XSSF* Classes.
XSSF is the POI Project's pure Java implementation of the Excel 2007 OOXML (.xlsx) file format.
https://poi.apache.org/spreadsheet/index.html
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(inputFile));
XSSFSheet sheet = wb.getSheetAt(0);

Categories