Hi Abe,
I was copying code that used HSSFWorkbook instead of Workbook.
Workbook is a recent factoring of XSSFWorkbook together with
HSSFWorkbook.
Unless you intend on producing XLSX (XSSF) as an option to XLS (HSSF)
files, I would suggest that you simply use HSSFWorkbook directly.
I just assumed it was there, my mistake. I know that Yegor's initial
criteria in creating the SS level was the intersection of
functionality between HSSF and XSSF.
Your current solution really is equivalent to wrapping getBytes()
around a ByteStream with a write()
I am glad you figured it out, but don't presume my vote, I am on the
PMC :-)
BTW - OOXML files are really zip files with a particular internal set
of XML files.
If you feel strongly about Workbook.getBytes() then please submit a
bugzilla.
Regards,
Dave
On Jul 24, 2009, at 4:04 PM, Abe Mishler wrote:
Hi all,
I solved my problem in another reply marked with [SOLVED]. For
clarity I'm replying to this message additionally.
Thank you David for your reply. As you mentioned, yours is not a
struts2 solution.
I wanted to make use of David's reply, not to his shame, but to
point out to those listening that I think David agrees with me in my
[SOLVED] reply that we need a Workbook getBytes() method. It is very
natural to assume that there is a getBytes() method on the Workbook
interface (org.apache.poi.ss.usermodel). At the time of this
writing, there is none (using http://poi.apache.org/apidocs/
index.html for reference), so the javacode part of David's solution
wouldn't work.
Like I said, I'm not trying to publicly shame anyone here, but
David's example is case in point. I think there are two votes for a
Workbook getBytes().
Thanks,
Abe
David Fisher wrote:
I don't know struts2, but we download XLS all the time from Tomcat
5.5.
The important thing is not to do it through a JSP, or other Text
based method.
Instead use a servlet container:
In WEB-INF/web.xml:
<servlet>
<servlet-name>xlsoutput</servlet-name>
<servlet-class>com.output.generator</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>output</servlet-name>
<url-pattern>/your-url-pattern-for-xls</url-pattern>
</servlet-mapping>
In WEB-INF/classes/com/output/ compile a java class name
generator.java
public class generator extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
byte[] bytes = null;
boolean is_inline = false;
String file = "hello.xls";
Workbook workbook = new HSSFWorkbook();
Sheet s = workbook.createSheet("sheet");
Row r = s.createRow(0);
Cell c = r.createCell(0);
c.setCellValue("hello world");
bytes = workbook.getBytes();
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition",
(is_inline?"inline":"attachment")+";filename=" + file);
response.setContentLength(bytes.length);
response.getOutputStream().write(bytes);
}
}
HTH,
Dave
On Jul 24, 2009, at 1:37 PM, 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]
---------------------------------------------------------------------
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]