<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <title>Problem generating an excel file download in a Portlet</title>
  <link rel="self" href="https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=118119454" />
  <subtitle>Problem generating an excel file download in a Portlet</subtitle>
  <id>https://liferay.dev/c/message_boards/find_thread?p_l_id=119785294&amp;threadId=118119454</id>
  <updated>2026-04-04T14:58:20Z</updated>
  <dc:date>2026-04-04T14:58:20Z</dc:date>
  <entry>
    <title>RE: Problem generating an excel file download in a Portlet</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118134339" />
    <author>
      <name>Carlos Barreiro</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118134339</id>
    <updated>2019-12-20T10:27:03Z</updated>
    <published>2019-12-20T10:27:03Z</published>
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;Thank you so much Fernando and Olaf, I knew i was taking a wrong approach ^^U&lt;br&gt;&lt;br&gt;As you said, using the serveResource is the correct approach and, in fact, it returns a correct file.&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;code&gt;public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException {
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;//Create the workbook
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;XSSFWorkbook workbook = new XSSFWorkbook();
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;XSSFSheet sheet = workbook.createSheet("Example");
&amp;amp;nbsp;&amp;amp;nbsp; &amp;amp;nbsp;Object[][] datalist = {
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; {"First Header", "Second Header"},
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; {"test1", "test2"},
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; {"test3", "test4"}
&amp;amp;nbsp; &amp;amp;nbsp; };

​​​​​​​&amp;amp;nbsp; &amp;amp;nbsp; int rowNum = 0;
&amp;amp;nbsp; &amp;amp;nbsp; for (Object[] data : datalist) {
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; Row row = sheet.createRow(rowNum++);
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; int colNum = 0;
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; for (Object field : data) {
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; Cell cell = row.createCell(colNum++);
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; if (field instanceof String) {
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; cell.setCellValue((String) field);
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; } else if (field instanceof Integer) {
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; cell.setCellValue((Integer) field);
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; }
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; }
&amp;amp;nbsp; &amp;amp;nbsp; }
&amp;amp;nbsp; &amp;amp;nbsp;&amp;amp;nbsp;
&amp;amp;nbsp; &amp;amp;nbsp; resourceResponse.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
&amp;amp;nbsp; &amp;amp;nbsp; workbook.write(resourceResponse.getPortletOutputStream());

&amp;amp;nbsp; &amp;amp;nbsp; workbook.close();
}&lt;/code&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;</summary>
    <dc:creator>Carlos Barreiro</dc:creator>
    <dc:date>2019-12-20T10:27:03Z</dc:date>
  </entry>
  <entry>
    <title>RE: Problem generating an excel file download in a Portlet</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118122780" />
    <author>
      <name>Olaf Kock</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118122780</id>
    <updated>2019-12-19T12:37:03Z</updated>
    <published>2019-12-19T12:37:03Z</published>
    <summary type="html">Just as Fernando says: This &lt;strong&gt;must&lt;/strong&gt; happen in a serveResource method. Accessing the HttpServletResponse from a render method probably embeds your file within the portal&amp;#39;s HTML page, which explains the additional 2K and the invalid content. You&amp;#39;re working around the provided API and shouldn&amp;#39;t do that. There&amp;#39;s also no need to go through a temporary file, but that&amp;#39;s a different topic.&lt;br /&gt;A render method must always return fragments of HTML for the portal page. You&amp;#39;re willingly ignoring this - and you can observe the result</summary>
    <dc:creator>Olaf Kock</dc:creator>
    <dc:date>2019-12-19T12:37:03Z</dc:date>
  </entry>
  <entry>
    <title>RE: Problem generating an excel file download in a Portlet</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118122081" />
    <author>
      <name>Fernando Fernandez</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118122081</id>
    <updated>2019-12-19T11:19:09Z</updated>
    <published>2019-12-19T11:19:09Z</published>
    <summary type="html">Hi Carlos,&lt;br /&gt;I&amp;#39;m assuming if you try and open /tmp/excelTest.xlsx it&amp;#39;s working fine. &lt;br /&gt;Normally I would solve this problem with a link to a serveResource and I never used this method. But it strikes me as odd that you close the file only after sending it.  &lt;br /&gt;&lt;br /&gt;I would also investigate the mimetype that the file is being sent with.&lt;br /&gt;HTH&lt;br /&gt;Fernando</summary>
    <dc:creator>Fernando Fernandez</dc:creator>
    <dc:date>2019-12-19T11:19:09Z</dc:date>
  </entry>
  <entry>
    <title>Problem generating an excel file download in a Portlet</title>
    <link rel="alternate" href="https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118119453" />
    <author>
      <name>Carlos Barreiro</name>
    </author>
    <id>https://liferay.dev/c/message_boards/find_message?p_l_id=119785294&amp;messageId=118119453</id>
    <updated>2019-12-18T16:51:29Z</updated>
    <published>2019-12-18T16:51:29Z</published>
    <summary type="html">&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;Hello, i'm generating an excel with POI library, and if I save the workbook as a file it is being successfully saved, and I can open it without problems. &lt;br&gt;But if I want to send the file as a download in a Portlet with the ServletResponseUtil.sendFile function, the file that I get seems to be corrupted because Excel can't open it. And in fact the file is 2KB bigger than the good file.&lt;br&gt;Do you know what could I be doing wrong? I've been struggling with this for a good amount of time and I can't see where the problem is.&lt;pre&gt;&lt;code&gt;//Create the workbook
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Example");
Object[][] datalist = {
&amp;amp;nbsp; &amp;amp;nbsp; {"First Header", "Second Header"},
&amp;amp;nbsp; &amp;amp;nbsp; {"test1", "test2"},
&amp;amp;nbsp; &amp;amp;nbsp; {"test3", "test4"}
};

​​​​​​​int rowNum = 0;
for (Object[] data : datalist) {
&amp;amp;nbsp; &amp;amp;nbsp; Row row = sheet.createRow(rowNum++);
&amp;amp;nbsp; &amp;amp;nbsp; int colNum = 0;
&amp;amp;nbsp; &amp;amp;nbsp; for (Object field : data) {
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; Cell cell = row.createCell(colNum++);
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; if (field instanceof String) {
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; cell.setCellValue((String) field);
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; } else if (field instanceof Integer) {
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; cell.setCellValue((Integer) field);
&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; }
&amp;amp;nbsp; &amp;amp;nbsp; }
}

// Saving the workbook in an excel file. It works OK
FileOutputStream outputStream = new FileOutputStream("/tmp/excelTest.xlsx");
workbook.write(outputStream);

// Returning the file via servlet response. It returns a corrupted file.
HttpServletRequest servletRequest = PortalUtil.getHttpServletRequest(renderRequest);
HttpServletResponse servletResponse = PortalUtil.getHttpServletResponse(renderResponse);
FileInputStream excelFile = new FileInputStream("/tmp/excelTest.xlsx");
ServletResponseUtil.sendFile(servletRequest, servletResponse, "excelTest.xlsx", excelFile);

​​​​​​​workbook.close();&lt;/code&gt;&lt;/pre&gt;&lt;/body&gt;&lt;/html&gt;</summary>
    <dc:creator>Carlos Barreiro</dc:creator>
    <dc:date>2019-12-18T16:51:29Z</dc:date>
  </entry>
</feed>
