0

我正在使用 JSF 动态/运行时生成 CSV 文件,代码如下

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

int read = 0;
byte[] bytes = new byte[1024];

response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");

ServletOutputStream os = null;

StringBuffer stringBuffer1 = new StringBuffer("");

stringBuffer1.append("Disconnect Time");
stringBuffer1.append(',');
stringBuffer1.append("Calling Number");

stringBuffer1.append("01/06/2010 01:00:35 AM");
stringBuffer1.append(", ");
stringBuffer1.append("447744369900");


ByteArrayInputStream bis1;
try {
    bis1 = new ByteArrayInputStream(stringBuffer1.toString().getBytes("UTF-8"));

    os = response.getOutputStream();

    while ((read = bis1.read(bytes)) != -1) {
        os.write(bytes, 0, read);
    }

    os.flush();
    os.close();
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

FacesContext.getCurrentInstance().responseComplete();

以下是打开时文件的内容

Disconnect Time Calling Number
1/6/2010 1:00   4.47744E+11

实际预期结果将是完整的日期格式 wrt AM/PM 和完整长度的数字。

我已经尝试过给定Excel CSV - 数字单元格格式和其他一些添加空格的双引号示例,但它们没有用。用户还将对数字列执行算术运算。

提前致谢。

4

6 回答 6

1

我不是 JSF 专家,但这似乎与 Excel 如何读取这些信息完全相关。

我尝试对数据进行一些处理,但无法使其在 CSV 中执行您希望它执行的操作。

我创建了一个包含此内容的示例 CSV 文件(使用 Nopepad++):

Disconnect Time, Calling Number
01/06/2010 01:00:35 AM,447744369900

当我使用 Excel 查看它时,它给了我相同的输出 - 所以你面临的问题与在 Excel 中显示 CSV 有关 - 而不是 JSF。

于 2012-09-09T10:51:36.970 回答
1

您已经提到您正在动态生成文件。如果您要从 dataTable 导出数据,您可能需要考虑使用 PrimeFaces 中的p:dataExporter组件(尽管您必须使用p:dataTable)。如果它已经在您的 dataTable 中的正确结构中,它可以节省您以编程方式创建 excel 文件。

然后就像将 p:dataExporter 附加到链接并将其指向您的 dataTable 一样简单(tbl在这种情况下)。

<h:commandLink>  
    <p:graphicImage value="/images/excel.png" />  
    <p:dataExporter type="xls" target="tbl" fileName="cars" />  
</h:commandLink>

顺便说一下,它还支持 CSV 和 PDF。

于 2012-09-19T22:39:16.080 回答
0

RonK 是对的。使用 CSV 文件时,您无法告诉 Excel 如何格式化数据。Excel 只是对 CSV 列中的数据进行最佳猜测,然后为该类型的数据应用默认格式。
Excel 很可能仍然有正确的数据(即仍然有您的时间列的秒数),这只是 Excel 中的格式问题。
您是否尝试过在 Excel 中应用不同的格式?

您要么必须告诉用户如何在 Excel 中正确格式化数据,要么必须直接创建一个 Excel 文件(例如使用Apache POI)并以这种方式应用正确的格式。

于 2012-09-09T11:16:15.660 回答
0

抱歉,看起来像是 Excel 中的错误(“功能”、“不足”)。

它假设任何看起来像数字的东西都是数字(并且在读取时会丢失精度)。

最简单的方法可能是确保电话号码看起来不像数字。例如通过包含(和相似的字符。

'=123+456请记住,在 Excel 中,如果您不希望它计算方程,有时您需要编写它。也试试这个。

日期可能只是格式化,尝试格式化列以包含秒数。

于 2012-09-09T12:54:44.270 回答
0

为了在 CSV 中显示正确的日期和数字格式,我使用了 =("447744369900") 方法。缺点是我们无法对单元执行算术运算。现在正如与 RonK 和 Turismo 讨论的那样,我现在转移到 Apache Excel 库,它允许您定义 Excel 文件的格式并创建 XLS 文件而不是 CSV。它比 CSV 慢一点,但满足我的要求。请参阅API 以使用 java 编写巨大的 excel 文件

再次感谢 RonK 和 Turismo

于 2012-09-09T13:26:30.477 回答
0

在 Excel 中打开 CSV 后,您可以将“主叫号码”单元格的格式更改为数字。选择列 -> 格式化单元格 -> 更改为数字

于 2012-09-09T14:55:07.853 回答