5

我不知道如何下载 CSV 文件。CSV 将在运行时生成。我需要先将文件保存在tomcat WEB-INF目录中吗?我正在使用 JSF 1.2。

顺便问一下,这种任务最受青睐的 JSF 组件是什么?


编辑 (05.05.2012 - 15:53)

我尝试了BalusC他的第一个链接中所述的解决方案,但是如果我单击我的 commandButton 文件的内容会显示在网页上。也许是有问题mimetype

xhtml 文件:

<a4j:form>
    <a4j:commandButton action="#{surveyEvaluationBean.doDataExport}" value="#{msg.srvExportButton}" />
</a4j:form>

主豆:

    public String doDataExport() {

    try {
        export.downloadFile();  
    } catch (SurveyException e) {
        hasErrors = true;
    }
    return "";
}

出口豆:

public void downloadFile() throws SurveyException {

    try {

        String filename = "analysis.csv";

        FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();

        response.reset();
        response.setContentType("text/comma-separated-values");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

        OutputStream output = response.getOutputStream();

        // writing just sample data
        List<String> strings = new ArrayList<String>();

        strings.add("filename" + ";" + "description" + "\n");
        strings.add(filename + ";" + "this is just a test" + "\n");

        for (String s : strings) {
            output.write(s.getBytes());
        }

        output.flush();
        output.close();

        fc.responseComplete();

    } catch (IOException e) {
        throw new SurveyException("an error occurred");
    }
}

编辑 (05.05.2012 - 16:27)

我解决了我的问题。我必须使用<h:commandButton>而不是,<a4j:commandButton>现在它可以工作了!

4

2 回答 2

4

我需要先将文件保存在tomcat WEB-INF目录中吗?

不,只需在设置正确的响应标头后将其直接写入 HTTP 响应正文,ExternalContext#getResponseOutputStream()该响应标头告诉浏览器它将检索什么。

根据以下答案中的具体示例进行数学运算:

基本上:

List<List<Object>> csv = createItSomehow();
writeCsv(csv, ';', ec.getResponseOutputStream());

顺便问一下,这种任务最喜欢的 jsf 组件是什么?

这是主观的。但不管怎样,我们都用<p:dataExporter>得很满意。

于 2012-05-04T16:16:59.753 回答
0

如果您使用的是 JSF 2,则可以使用 primefaces。
你可以看看那个链接

如果没有,你可以这样做:

List<Object> report = new ArrayList<Object>(); // fill your arraylist with relevant data 
String filename = "report.csv";    
File file = new File(filename);
Writer output = new BufferedWriter(new FileWriter(file));
output.append("Column1");
output.append(",");
output.append("Column2");
output.append("\n");
//your data goes here, Replcae Object with your bean
for (Object row:report){
    output.append(row.field1);
    output.append(",");
    output.append(row.field2);
    output.append("\n");
}
output.flush();
output.close();
于 2012-05-04T15:33:20.660 回答