为什么我的.xslm文件在下载过程中损坏了?

时间:2015-11-27 10:40:02

标签: java jquery excel apache-poi

情况就是这样:

我在服务器上有一个.xslm文件(一个启用宏的excel工作表)。在服务器上打开此文件没有问题(使用ms-excel 2013) 然后我使用Apache POI 3.13编辑该文件。在服务器上保存此文件的副本,并将另一个文件提供给用户下载 (这样做只是为了检查编辑时是否有任何写入问题。最初的目的只是为了下载) 保存在服务器上的此文件的副本将打开,没有任何问题。但是,从excel 2013打开它时,以下载方式发送的错误会导致this错误。

我在客户端使用Jquery.fileDownload()对服务器进行ajax调用,我的Spring Controller为文件提供服务。

以下是我编写文件的代码:

    Workbook workbook = null;
    ServletOutputStream out = null;
    InputStream inputStream = null;
    FileOutputStream fos = null;

    try {

        OPCPackage inputFilePackage = OPCPackage.open(<original file saved on server>);
        workbook = WorkbookFactory.create(inputFilePackage);

        //Do Some stuff to edit workbook here

        fos = new FileOutputStream("temp.xlsm");
        workbook.write(fos);
        fos.close();

        inputStream = new FileInputStream("temp.xlsm"); // The file that is created just now

        servletResponse.setContentType("application/vnd.ms-excel.sheet.macroEnabled.12");
        servletResponse.setHeader("content-disposition", "attachment; filename=NewFile.xlsm");
        servletResponse.setHeader("Set-Cookie", "fileDownload=true; path=/");
        out = servletResponse.getOutputStream();
        // workbook.write(out); // Was previously using this method to directly write to ServletOutputStream 

        int i;
        while ((i = inputStream.read()) != -1) {
            out.write(i);
        }
        out.flush();
        // new File("temp.xlsm").delete();
    }
    catch (Exception e) {
        LOGGER.error(e.getMessage(), e);
    }
    finally {
        if (out != null) {
            try {
                out.close();
            }
            catch (Exception ex) {
                LOGGER.error(ex.getMessage());
            }
        }
        if (inputStream != null) {
            try {
                inputStream.close();
            }
            catch (Exception ex) {
                LOGGER.error(ex.getMessage());
            }
        }
    }
    return "success";

另外,我可以清楚地看到两个文件的大小之间的差异。 打开没有问题的文件是(436,129字节),而抛出错误的文件是(436,136字节)。我不确定这些额外字节的来源。

非常感谢任何帮助。

0 个答案:

没有答案