Hi all,

I have solved the issue. Since I have aired my problems to the community, I will provide "the solution" in case someone in the future comes across this in the archives. And "Thank you" to David Fisher for spending valuable time on my problem.

So digging deeper into the docs I discovered that HSSFWorkbook.getBytes() does the following:

"get the bytes of just the HSSF portions of the XLS file".

I wanted the bytes for the WHOLE file, which I mused, is why the written output was incorrect as previously posted.

I altered my execute() method as follows and it works like a champ.

public String execute() throws Exception {
        Workbook workbook = new HSSFWorkbook();
                
        Sheet s = workbook.createSheet("sheet");
        Row r = s.createRow(0);
        Cell c = r.createCell(0);
        c.setCellValue("hello world");
                
        ByteArrayOutputStream baos =
                new ByteArrayOutputStream();
        workbook.write(baos);
        baos.close();
                
        ByteArrayInputStream bais =
                new ByteArrayInputStream(baos.toByteArray());
        inputStream = bais;
        return SUCCESS;
}

Now my inputStream has ALL the bytes of the workbook, and not SOME of the bytes.

SUGGESTION: As I am not a contributing developer to POI I am unaware of the ramifications or possibility of this suggestion. Please take it with a grain of salt. If I had my "druthers" I would be able to call a method on the Workbook class that would return bytes[] for the whole file.

E.g.

InputStream inputStream = null;
Workbook wb = new HSSFWorkbook();

/**
 * hydrate wb with data
 */

// now I have all the bytes I need for whole file
ByteArrayInputStream bais = new ByteArrayInputStream(wb.getBytes());

// and can easily put them into an InputStream for reading elsewhere
inputStream = bais;


But then again, maybe I sound like Bill Murray in "What About Bob?":

[I'm baby stepping. I'm doing the work. I'm not a slacker! Give me! Give me! I need! I need! Give me! Give me!]

Because this is already a fabulous library.

Thanks again,
Abe

Abe Mishler wrote:
Hi all,

I need some pointers/help with creating an .xls file for download from a servlet container.

Specifically, I have a struts2 project running inside Tomcat 5.5. And I'm using POI 3.5-beta6.

I am able to use POI to create a workbook and fill it with data. The problem is after I download the file, the binary header doesn't match the expected: D0 CF 11 E0 A1 B1 1A E1 signature.

Instead, I get: 09 08 10 00 00 06 05 00 D3 10 CC 07 41 ...

I'm definitely getting a binary file. When I open the file using MS Excel 2003 SP2, it goes into file recovery mode telling me the file is damaged beyond repair, etc. After I click "Don't Send" a couple times on the error dialogs, my data is there, although without the formatting (Date values look like numbers).

I have one immediate concern: All of the examples use wb.write(fileOut), however, AFAIK, that's not the way for writing data out of a servlet container for download. I'm familiar with creating an InputStream for a file download.

I've included a basic execute() method from my action which demonstrates how I export the data to the user for download. Is this causing the malformed file? How do I get the workbook bytes[] into an InputStream properly?

Thanks in advance,
Abe

==

I have an action class with an execute() method as follows:

public String execute() throws Exception {
    Workbook workbook = new HSSFWorkbook();
    Sheet s = workbook.createSheet("sheet");
    Row r = s.createRow(0);
    Cell c = r.createCell(0);
    c.setCellValue("hello world");
    ByteArrayInputStream bais =
        new ByteArrayInputStream(
        ((HSSFWorkbook) workbook).getBytes());
    inputStream = bais;
    return SUCCESS;
}

and the necessary getter for inputStream.

---------------------------------------------------------------------
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]

Reply via email to