使用邮政编码生成带有POI的xlsx文件

时间:2014-08-13 16:59:38

标签: java excel struts2

我使用POI Api将数据导出到xlsx文件中,并将它们添加到Zip文件中。当我打开zip时,我没有任何xlsx文件,但有三个目录(docProps,xl和_rels)和1个文件[Content_Types] xml。我认为它是xlsx文件的描述,但我不明白为什么。

代码:

public InputStream exportXlsx(List<MyObject> listeOfObject) throws IOException {

        ByteArrayOutputStream excelOutputStreamZip = new ByteArrayOutputStream();
        ZipOutputStream zip = new ZipOutputStream(excelOutputStreamZip);

        for (MyObject myObject : listeOfObject) {

            XSSFWorkbook wb = new XSSFWorkbook();
            XSSFSheet wsheet = wb.createSheet("mySheet");
            XSSFRow row = wsheet.createRow(0);
            XSSFCell cell = row.createCell(1);
            cell.setCellValue(myObject.getValue1());

            // Create all sheet and cell....

            // Write WB conntent in outputStream
            wb.write(excelOutputStreamZip);

            addEntry(zip, myObject.getFileName(), excelOutputStreamZip);
        }

        InputStream inputStreamZipByte = new ByteArrayInputStream(
                ((ByteArrayOutputStream) excelOutputStreamZip).toByteArray());
        zip.close();

        return inputStreamZipByte;

    }

    public void addEntry(OutputStream zip, String filename, ByteArrayOutputStream os) {

        byte[] bytes = os.toByteArray();

        ZipEntry entry = new ZipEntry(filename);
        Date d = new Date();
        entry.setTime(d.getTime());
        try {
            ((ZipOutputStream) zip).putNextEntry(entry);
            ((ZipOutputStream) zip).write(bytes);
            ((ZipOutputStream) zip).closeEntry();
        } catch (IOException e) {
            log.error("Can't read the file !", e);
        } catch (ClassCastException cce) {
            log.error("Bad format !", cce);
        }

    }

此代码是在Struts2操作中注入的服务中编写的。

struts.xml:

<action name="*MyAction" class="com.omb.view.action.myAction" method="{1}">
    <result name="export" type="stream">
        <param name="contentType">application/zip</param>
        <param name="inputName">inputStreamZipByte</param>
        <param name="contentDisposition">attachment;filename="myZip.zip"</param> 
        <param name="bufferSize">1024</param>
    </result>
</action>

3 个答案:

答案 0 :(得分:2)

我找到了解决方案的一部分,但现在又遇到了另一个问题:

初始岗位的问题在于处理溪流。因为我对Zip和Workbook使用了相同的outputStream。解决方案为每个工作簿创建了一个新的ByteArrayOutpuStream。

// Write WB conntent in outputStream    
ByteArrayOutputStream wbOutputStream = new ByteArrayOutputStream();  
wb.write(wbOutputStream);    
addEntry(zip, myObject.getFileName(), wbOutputStream);    
wbOutputStream.close();

但是......现在生成的Zip文件已损坏......

答案 1 :(得分:0)

xlsx文件是一个zip文件。您应该检查适合结果的contentType参数的MIME类型。见What is a correct mime type for docx, pptx etc?

答案 2 :(得分:-1)

只需将工作簿写入BytearrayInputStream,然后转换为字节数组 在ZipOutPutStream中使用该字节数组

这个适用于我..........................

  

response.setContentType(&#34;应用程序/压缩&#34);

     

response.setHeader(&#34;内容处置&#34;&#34;附件;文件名= \&#34;&#34 +文件名+&#34;的.zip \&#34;& #34);

     

workBook = getWorkbook(displayList,cfgType);

     

ByteArrayOutputStream baos = new ByteArrayOutputStream();

     

ZipOutputStream zos = new ZipOutputStream(baos);

     

ByteArrayOutputStream fileBaos = new&gt; ByteArrayOutputStream();

     

zos.putNextEntry(new ZipEntry(&#34; Test.xlsx&#34;));

     

workBook.write(fileBaos);

     

zos.write(fileBaos.toByteArray());

     

zos.putNextEntry(new ZipEntry(&#34; Test1.xlsx&#34;));

     

zos.write(fileBaos.toByteArray());

     

fileBaos.close();   zos.close();

     

response.getOutputStream()写(baos.toByteArray())。   response.flushBuffer();