I think that I may not have explained my self too well Jeff. When I was
talking about openxml4j, I did not mean that it was in the archive but that
whilst the archives names may change between version of POI, that part of
the name is constant. For example, I have just updated to version 3.5 beta 6
and the name of the archive is now 'openxml4j-1.0-beta.jar' not
'openxml4j-bin-alpha-080407.jar', just the openxml4j part of the name is
common to both. In like manner the name of the POI archive will change to
reflect the version and build date. Now I am using
'poi-3.5-beta6-20090530.jar' whilst in the example I posted to you it was
'poi-3.5-beta1-20080718.jar'.
I must admit to being concerned about the message you are receiving, the
only source of a null pointer there could be if the workbook variable
contained a null variable. Can you add a line of code for me please Jeff?
Please enter the following immediately before the numSheets =
workbook.getNumberOfSheets() line;
if(workbook == null) {
System.out.println("Yes, you got a null workbook.");
}
As far as I am aware the WorkbookFactory.create() method either returns an
HSSXWorkbook, an XSSFWorkbook or it throws an exception, it cannot return a
null value.
Also, I forgot to send you another email earlier. I found out where the
XSSF............ classes are. they are stored in an archive called
'poi-ooxml-3.5-beta6-20090530.jar' which was called
'poi-ooxml-3.5-beta1-20080718.jar' in the code I sent you earlier due to
differing versions again.
Jeff Spence wrote:
>
> Hi,
>
> I ran the example. Wrote to and read from disc. Still studying and
> playing around.
> I can't find the openxml4j in the jar though, still seems to work fine
> with one exception.
> (no pun intended) NullPointerFound on the following line:
>
> numSheets = workbook.getNumberOfSheets();
>
>
> Thanks,
> Jeff.
>
>
>
>
>
> MSB wrote:
>> Hello again Jeff,
>>
>> Firstly, I must admit that I am not too sure about exactly where the
>> XSSF..... classes are. Having said that you do not need to to worry about
>> it
>> if you write code to the interfaces defined in the ss.usermodel package.
>> The
>> other benefit of this is that it also does not matter if, at runtime, the
>> application finds itself having to deal with files in both the binary
>> (HSSF)
>> and OpenXML (XSSF) formats.
>>
>> Yesterday, I wrote a little bit of code that follows this pattern. In
>> order
>> to compile and run it however, you will have to set your classpath
>> appropriately. I compiled the code against 3.5 beta 1 and so added the
>> following archives into my class path;
>>
>> poi-3.5-beta1-20080718.jar
>> poi-ooxml-3.5-beta1-20080718.jar
>> openxml4j-bin-alpha-080407.jar
>> xmlbeans-2.3.0.jar
>> log4j-1.2.13.jar
>> dom4j-1.6.1.jar
>> ooxml-schemas.jar
>>
>> It is highly likely that the exact names of the archives you have
>> downloaded
>> will differ, do not be too concerned, just make sure that most of the
>> name
>> is similar - i.e. the openxml4j part of the name for the
>> openxml4j-bin-alpha-080407.jar archive.
>>
>> This is the code;
>>
>> import java.io.File;
>> import java.io.FileInputStream;
>> import java.util.Iterator;
>>
>> import org.apache.poi.ss.usermodel.WorkbookFactory;
>> import org.apache.poi.ss.usermodel.Workbook;
>> import org.apache.poi.ss.usermodel.Sheet;
>> import org.apache.poi.ss.usermodel.Row;
>> import org.apache.poi.ss.usermodel.Cell;
>>
>> public class Main {
>>
>> /**
>> * @param args the command line arguments
>> */
>> public static void main(String[] args) {
>>
>> File inputFile = null;
>> FileInputStream fileIStream = null;
>> Workbook workbook = null;
>> Sheet sheet = null;
>> Row row = null;
>> Cell cell = null;
>> Iterator<Row> rowIterator = null;
>> Iterator<Cell> cellIterator = null;
>> int numSheets = 0;
>>
>> try {
>> inputFile = new File("C:/temp/sample.xlsx");
>> fileIStream = new FileInputStream(inputFile);
>> // Use the WorkbookFactory create() factory method to get
>> // either an HSSFWorkbook or XSSFWorkbook depending on
>> // the file type wrapped in the FileInputStream
>> workbook = WorkbookFactory.create(fileIStream);
>>
>> // Lets see what we got, an XSSF or HSSFWorkbook
>> if(workbook instanceof
>> org.apache.poi.hssf.usermodel.HSSFWorkbook) {
>> System.out.println("You got an HSSFWorkbook");
>> }
>> else {
>> System.out.println("You got an XSSFWorkbook");
>> }
>> // Get the number of sheets
>> numSheets = workbook.getNumberOfSheets();
>> // Iterate through each sheet
>> for(int i = 0; i < numSheets; i++) {
>> // Get the sheet
>> sheet = workbook.getSheetAt(i);
>> // Get an iterator to work through the rows on the sheet
>> rowIterator = sheet.iterator();
>> // Iterate through the rows
>> while(rowIterator.hasNext()) {
>> row = rowIterator.next();
>> System.out.println("Processing row number: " +
>> row.getRowNum());
>> // Get an iterator to work through the cells on the
>> row
>> cellIterator = row.iterator();
>> // Iterate through the cells
>> while(cellIterator.hasNext()) {
>> cell = cellIterator.next();
>> // Just print out the num,ber of the cell
>> // and the String representatin of the instance.
>> System.out.println("Cell: " +
>> cell.toString());
>> }
>> }
>> }
>> }
>> catch(Exception ex) {
>> System.out.println("Caught an: " + ex.getClass().getName());
>> System.out.println("Message: " + ex.getMessage());
>> System.out.println("Stacktrace follows.........");
>> ex.printStackTrace(System.out);
>> }
>> finally {
>> if(fileIStream != null) {
>> try {
>> fileIStream.close();
>> }
>> catch(Exception ex) {
>> // I G N O R E //
>> }
>> }
>> }
>> }
>> }
>>
>> which does not do anything exciting - iterates through all of the sheets
>> in
>> a workbook, the rows on a sheet and the cells on a row then merely calls
>> the
>> toString() method once it has a cell reference in hand. You should be
>> able
>> to call it with both binary and OpenXML Excel files by simply changing
>> this
>> line to point to your file;
>>
>> inputFile = new File("C:/temp/sample.xlsx");
>> //inputFile = new File("C:/temp/sample.xls");
>>
>> That only deals with reading existing files however. If you want to see
>> how
>> a similar technique can be used to create a file, then take a look here;
>>
>> http://poi.apache.org/spreadsheet/converting.html
>>
>> and in particular, the section titled 'New, generic SS Usermodel Code'.
>>
>> I accept that does not answer your original question, which I think has
>> more
>> to do with dependencies and your classpath settings, but it will get you
>> working whilst I have a dig around to see where the XSSF......... classes
>> are.
>>
>> PS do not be surprised when you run the code to see two warnings from the
>> logging system.
>>
>> log4j:WARN No appenders could be found for logger (org.openxml4j.opc).
>> log4j:WARN Please initialize the log4j system properly.
>>
>> They can safely be ignored for now.
>>
>>
>>
>> Jeff Spence wrote:
>>
>>> I tried the following with success:
>>>
>>> HSSFWorkbook wb = new HSSFWorkbook();
>>> FileOutputStream fileOut = new FileOutputStream("C:\\workbook.xls");
>>> wb.write(fileOut);
>>> fileOut.close();
>>>
>>> But the following without success (narrowed down to this line I think).
>>>
>>> XSSFWorkbook wb = new XSSFWorkbook();
>>>
>>> ...this error message.
>>>
>>> java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException
>>>
>>> ...tried these imports.
>>>
>>> import org.apache.poi.xssf.usermodel.XSSFWorkbook;
>>> import org.apache.poi.xssf.usermodel.*;
>>>
>>> I don't think it's the path because, as stated above, they both
>>> derive from ss.usermodel.
>>>
>>> Anyone have a suggestion?
>>>
>>> Thanks,
>>> Jeff.
>>>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: [email protected]
>>> For additional commands, e-mail: [email protected]
>>>
>>>
>>>
>>>
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>
>
--
View this message in context:
http://www.nabble.com/HSSF---XSSF-tp23788082p23800362.html
Sent from the POI - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]