为什么在使用ApachePOIAPI的JavaSeam应用程序中生成excel文件时会出现损坏的excel文件

为什么在使用ApachePOIAPI的JavaSeam应用程序中生成excel文件时会出现损坏的excel文件,java,seam,apache-poi,Java,Seam,Apache Poi,我正在尝试在seam java应用程序中创建一个excel spreadsheat。这是我的设置: web.xml: <servlet> <servlet-name>Document Store Servlet</servlet-name> <servlet-class>org.jboss.seam.document.DocumentStoreServlet</servlet-class>

我正在尝试在seam java应用程序中创建一个excel spreadsheat。这是我的设置:

web.xml:

    <servlet>
        <servlet-name>Document Store Servlet</servlet-name>
        <servlet-class>org.jboss.seam.document.DocumentStoreServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Document Store Servlet</servlet-name>
        <url-pattern>/seam/docstore/*</url-pattern>
    </servlet-mapping>
<s:resource xmlns="http://www.w3.org/1999/xhtml"
            xmlns:s="http://jboss.com/products/seam/taglib"
            data="#{showSoldArticlesBean.excelData()}"
            contentType="application/vnd.ms-excel"
            fileName="#{showSoldArticlesBean.excelFileName()}"/>
<s:download src="/export/export.xhtml">
                    <h:outputText value="Download excel"/>
                </s:download>
<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.8-beta4</version>
        </dependency>
public File excelData() {

        File excel = new File("Somecrap.xls");

        OutputStream fos = null;

        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();

        HSSFCellStyle style = workbook.createCellStyle();
        style.setBorderTop((short) 6); // double lines border
        style.setBorderBottom((short) 1); // single line border
        style.setFillBackgroundColor(HSSFColor.GREY_25_PERCENT.index);

        HSSFFont font = workbook.createFont();
        font.setFontName(HSSFFont.FONT_ARIAL);
        font.setFontHeightInPoints((short) 20);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setColor(HSSFColor.BLUE.index);
        //style.setFont(font);

        HSSFRow row = sheet.createRow(1);
        HSSFCell cell = row.createCell(1);
        cell.setCellValue(new HSSFRichTextString("Doing some excel crazy stuff!"));
        //cell.setCellStyle(style);
        sheet.autoSizeColumn((short) 1);

        fos = null;
        try {
            fos = new FileOutputStream(excel);
            workbook.write(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return test;
    }

    public String excelFileName() {
        return "Somecrap.xls";
    }

文档存储Servlet
org.jboss.seam.document.DocumentStoreServlet
文档存储Servlet
/seam/docstore/*
export.xhtml:

    <servlet>
        <servlet-name>Document Store Servlet</servlet-name>
        <servlet-class>org.jboss.seam.document.DocumentStoreServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Document Store Servlet</servlet-name>
        <url-pattern>/seam/docstore/*</url-pattern>
    </servlet-mapping>
<s:resource xmlns="http://www.w3.org/1999/xhtml"
            xmlns:s="http://jboss.com/products/seam/taglib"
            data="#{showSoldArticlesBean.excelData()}"
            contentType="application/vnd.ms-excel"
            fileName="#{showSoldArticlesBean.excelFileName()}"/>
<s:download src="/export/export.xhtml">
                    <h:outputText value="Download excel"/>
                </s:download>
<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.8-beta4</version>
        </dependency>
public File excelData() {

        File excel = new File("Somecrap.xls");

        OutputStream fos = null;

        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();

        HSSFCellStyle style = workbook.createCellStyle();
        style.setBorderTop((short) 6); // double lines border
        style.setBorderBottom((short) 1); // single line border
        style.setFillBackgroundColor(HSSFColor.GREY_25_PERCENT.index);

        HSSFFont font = workbook.createFont();
        font.setFontName(HSSFFont.FONT_ARIAL);
        font.setFontHeightInPoints((short) 20);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setColor(HSSFColor.BLUE.index);
        //style.setFont(font);

        HSSFRow row = sheet.createRow(1);
        HSSFCell cell = row.createCell(1);
        cell.setCellValue(new HSSFRichTextString("Doing some excel crazy stuff!"));
        //cell.setCellStyle(style);
        sheet.autoSizeColumn((short) 1);

        fos = null;
        try {
            fos = new FileOutputStream(excel);
            workbook.write(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return test;
    }

    public String excelFileName() {
        return "Somecrap.xls";
    }

someother.xhtml:

    <servlet>
        <servlet-name>Document Store Servlet</servlet-name>
        <servlet-class>org.jboss.seam.document.DocumentStoreServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Document Store Servlet</servlet-name>
        <url-pattern>/seam/docstore/*</url-pattern>
    </servlet-mapping>
<s:resource xmlns="http://www.w3.org/1999/xhtml"
            xmlns:s="http://jboss.com/products/seam/taglib"
            data="#{showSoldArticlesBean.excelData()}"
            contentType="application/vnd.ms-excel"
            fileName="#{showSoldArticlesBean.excelFileName()}"/>
<s:download src="/export/export.xhtml">
                    <h:outputText value="Download excel"/>
                </s:download>
<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.8-beta4</version>
        </dependency>
public File excelData() {

        File excel = new File("Somecrap.xls");

        OutputStream fos = null;

        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();

        HSSFCellStyle style = workbook.createCellStyle();
        style.setBorderTop((short) 6); // double lines border
        style.setBorderBottom((short) 1); // single line border
        style.setFillBackgroundColor(HSSFColor.GREY_25_PERCENT.index);

        HSSFFont font = workbook.createFont();
        font.setFontName(HSSFFont.FONT_ARIAL);
        font.setFontHeightInPoints((short) 20);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setColor(HSSFColor.BLUE.index);
        //style.setFont(font);

        HSSFRow row = sheet.createRow(1);
        HSSFCell cell = row.createCell(1);
        cell.setCellValue(new HSSFRichTextString("Doing some excel crazy stuff!"));
        //cell.setCellStyle(style);
        sheet.autoSizeColumn((short) 1);

        fos = null;
        try {
            fos = new FileOutputStream(excel);
            workbook.write(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return test;
    }

    public String excelFileName() {
        return "Somecrap.xls";
    }

ShowSoldArticlesBean

import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.*;

import java.io.*;
import java.util.List;       

@Name("showSoldArticlesBean")
@AutoCreate
@MeasureCalls
@Scope(ScopeType.CONVERSATION)
public class ShowSoldArticlesBean implements Serializable {

    @In
    private ArticleAdminBean articleAdminBean;

    @In(required = false)
    @Out(required = false)
    private String fromDate;

    @In(required = false)
    @Out(required = false)
    private String toDate;

    @Out(required = false)
    List<Article> currentArticleList;

    @Begin
    public void initiatePage() {
        if (StringUtils.isBlank(fromDate) && StringUtils.isBlank(toDate)) {
            fromDate = aWeekAgo();
            toDate = dateToString(now());
            this.showSoldArticles();
        }
    }

    @End
    public void showSoldArticles() {
        currentArticleList = articleAdminBean.getArticles(fromDate, toDate);
    }

    public byte[] excelData() {

        OutputStream fos = null;

        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();

        HSSFCellStyle style = workbook.createCellStyle();
        style.setBorderTop((short) 6); // double lines border
        style.setBorderBottom((short) 1); // single line border
        style.setFillBackgroundColor(HSSFColor.GREY_25_PERCENT.index);

        HSSFFont font = workbook.createFont();
        font.setFontName(HSSFFont.FONT_ARIAL);
        font.setFontHeightInPoints((short) 20);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setColor(HSSFColor.BLUE.index);
        style.setFont(font);

        HSSFRow row = sheet.createRow(1);
        HSSFCell cell = row.createCell(1);
        cell.setCellValue(new HSSFRichTextString("Doing some excel crazy stuff!"));
        cell.setCellStyle(style);
        sheet.autoSizeColumn((short) 1);

        fos = null;
        try {
            fos = new FileOutputStream(new File(this.excelFileName()));
            workbook.write(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return workbook.getBytes();
    }

    public String excelFileName() {
        return "Somecrap.xls";
    }

}
import org.apache.commons.lang.StringUtils;
导入org.apache.poi.hssf.usermodel.*;
导入org.apache.poi.hssf.util.HSSFColor;
导入org.jboss.seam.ScopeType;
导入org.jboss.seam.annotations.*;
导入java.io.*;
导入java.util.List;
@名称(“showSoldArticlesBean”)
@自动创建
@测量电池
@作用域(ScopeType.CONVERSATION)
公共类ShowSoldArticlesBean实现可序列化{
@在
私有ArticleAdminBean ArticleAdminBean;
@In(必需=false)
@输出(必需=假)
私有字符串fromDate;
@In(必需=false)
@输出(必需=假)
私有字符串toDate;
@输出(必需=假)
列表当前文章列表;
@开始
公共无效初始页(){
if(StringUtils.isBlank(fromDate)和&StringUtils.isBlank(toDate)){
fromDate=aWeekAgo();
toDate=dateToString(now());
这个。showSoldArticles();
}
}
@结束
公共空间展示工具(){
currentArticleList=articleAdminBean.getArticles(从日期到日期);
}
公共字节[]excelData(){
OutputStream fos=null;
HSSFWorkbook=新的HSSFWorkbook();
HSSFSheet sheet=workbook.createSheet();
HSSFCellStyle=workbook.createCellStyle();
style.setBorderTop((短)6);//双线边框
style.setBorderBottom((短)1);//单行边框
风格。背景颜色(HSSFColor.Gray_25_%索引);
hssfont font=工作簿.createFont();
font.setFontName(hssfont.font_ARIAL);
font.setFontHeightInPoints((短)20);
字体设置权重(hssfont.BOLDWEIGHT\u BOLD);
font.setColor(HSSFColor.BLUE.index);
style.setFont(字体);
HSSFRow行=sheet.createRow(1);
HSSFCell cell=row.createCell(1);
setCellValue(新的HSSFRichTextString(“做一些excel疯狂的事情!”);
cell.setCellStyle(style);
表1.autoSizeColumn((短)1);
fos=null;
试一试{
fos=新文件输出流(新文件(this.excelFileName());
练习册。写作(fos);
}捕获(IOE异常){
e、 printStackTrace();
}最后{
如果(fos!=null){
试一试{
fos.flush();
fos.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
返回workbook.getBytes();
}
公共字符串excelFileName(){
返回“Somecrap.xls”;
}
}
pom.xml:

    <servlet>
        <servlet-name>Document Store Servlet</servlet-name>
        <servlet-class>org.jboss.seam.document.DocumentStoreServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Document Store Servlet</servlet-name>
        <url-pattern>/seam/docstore/*</url-pattern>
    </servlet-mapping>
<s:resource xmlns="http://www.w3.org/1999/xhtml"
            xmlns:s="http://jboss.com/products/seam/taglib"
            data="#{showSoldArticlesBean.excelData()}"
            contentType="application/vnd.ms-excel"
            fileName="#{showSoldArticlesBean.excelFileName()}"/>
<s:download src="/export/export.xhtml">
                    <h:outputText value="Download excel"/>
                </s:download>
<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.8-beta4</version>
        </dependency>
public File excelData() {

        File excel = new File("Somecrap.xls");

        OutputStream fos = null;

        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();

        HSSFCellStyle style = workbook.createCellStyle();
        style.setBorderTop((short) 6); // double lines border
        style.setBorderBottom((short) 1); // single line border
        style.setFillBackgroundColor(HSSFColor.GREY_25_PERCENT.index);

        HSSFFont font = workbook.createFont();
        font.setFontName(HSSFFont.FONT_ARIAL);
        font.setFontHeightInPoints((short) 20);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setColor(HSSFColor.BLUE.index);
        //style.setFont(font);

        HSSFRow row = sheet.createRow(1);
        HSSFCell cell = row.createCell(1);
        cell.setCellValue(new HSSFRichTextString("Doing some excel crazy stuff!"));
        //cell.setCellStyle(style);
        sheet.autoSizeColumn((short) 1);

        fos = null;
        try {
            fos = new FileOutputStream(excel);
            workbook.write(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return test;
    }

    public String excelFileName() {
        return "Somecrap.xls";
    }

org.apache.poi
poi
3.8-β4
此代码生成一个excel文件,excel对此进行投诉并声明该文件已损坏。如果我选择修复该文件,我将获得具有正确数据的文件


你能帮我解释一下我错在哪里吗。

我想有时候在工作中喝酒并不能帮助你作为一名程序员表现得更好

当我选择返回字节而不是文件时,我不知道脑子里在想什么。 谢谢Gagravarr指出这一点

正确的代码:

    <servlet>
        <servlet-name>Document Store Servlet</servlet-name>
        <servlet-class>org.jboss.seam.document.DocumentStoreServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>Document Store Servlet</servlet-name>
        <url-pattern>/seam/docstore/*</url-pattern>
    </servlet-mapping>
<s:resource xmlns="http://www.w3.org/1999/xhtml"
            xmlns:s="http://jboss.com/products/seam/taglib"
            data="#{showSoldArticlesBean.excelData()}"
            contentType="application/vnd.ms-excel"
            fileName="#{showSoldArticlesBean.excelFileName()}"/>
<s:download src="/export/export.xhtml">
                    <h:outputText value="Download excel"/>
                </s:download>
<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.8-beta4</version>
        </dependency>
public File excelData() {

        File excel = new File("Somecrap.xls");

        OutputStream fos = null;

        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();

        HSSFCellStyle style = workbook.createCellStyle();
        style.setBorderTop((short) 6); // double lines border
        style.setBorderBottom((short) 1); // single line border
        style.setFillBackgroundColor(HSSFColor.GREY_25_PERCENT.index);

        HSSFFont font = workbook.createFont();
        font.setFontName(HSSFFont.FONT_ARIAL);
        font.setFontHeightInPoints((short) 20);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setColor(HSSFColor.BLUE.index);
        //style.setFont(font);

        HSSFRow row = sheet.createRow(1);
        HSSFCell cell = row.createCell(1);
        cell.setCellValue(new HSSFRichTextString("Doing some excel crazy stuff!"));
        //cell.setCellStyle(style);
        sheet.autoSizeColumn((short) 1);

        fos = null;
        try {
            fos = new FileOutputStream(excel);
            workbook.write(fos);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return test;
    }

    public String excelFileName() {
        return "Somecrap.xls";
    }

为什么要将工作簿写入一个文件,然后调用getBytes?我认为这个答案的返回也有问题。返回
test
,但是代码块中没有任何测试对象定义。应该是
excel
文件吗?我搞不懂这段代码是如何下载excel文件的?我使用相同的方法和代码来获取word文档,它已创建,但下载未启动。我错过什么了吗?