Java CSV生成、日期和长数字格式

Java CSV生成、日期和长数字格式,java,jsf,csv,Java,Jsf,Csv,我正在使用JSF动态/运行时生成一个CSV文件,代码如下 FacesContext context = FacesContext.getCurrentInstance(); HttpServletResponse response = HttpServletResponse)context.getExternalContext().getResponse(); int read = 0; byte[] bytes = new byte[1024]; response.setContentTy

我正在使用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
实际预期结果将是完整的日期格式w.r.t AM/PM和完整长度的数字

我已经尝试过给出的双引号示例和其他一些添加空格的示例,但它们都不起作用。用户还将对数字列执行算术运算


提前感谢。

我不是JSF专家,但这似乎完全与Excel读取这些信息的方式有关

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

我使用以下内容创建了一个示例CSV文件(使用Nopepad++):


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

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

您必须告诉用户如何在Excel中正确设置数据格式,或者您必须直接创建Excel文件(例如,使用)并以这种方式应用正确的格式。

对不起,Excel中似乎存在错误(“功能”、“缺陷”)

它假定任何看起来像一个数字的东西都是一个数字(读取时会失去精度)

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

请记住,在Excel中,如果您不想让它计算公式,您有时需要编写
'=123+456
。也可以试试这个


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

要在CSV中显示日期和数字的正确格式,我使用=(“447744369900”)方法。缺点是我们无法在单元格上执行算术运算。正如RonK和Turismo所讨论的,我现在转到Apache Excel库,该库允许您定义Excel文件的格式,并创建XLS文件而不是CSV。它比CSV稍慢,但满足我的要求。请参阅


再次感谢RonK和Turismo

在excel中打开CSV后,您可以更改“呼叫号码”的格式选择“列”>“格式单元格”> >更改为“数字< /p> ”。您提到了您正在动态生成文件。如果要从DATABATE导出数据,您可能需要考虑使用PrimeFrases中的组件(必须使用A)。。如果excel文件在数据表中的结构正确,则可以通过编程方式创建excel文件

然后,将p:dataExporter附加到一个链接,并将其指向您的数据表(本例中为
tbl
)就很容易了



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

我在问题中已经提到,双引号在我的情况下不起作用,因为它提供的输出类似于1/6/2010 1:00“447744369900”用户将无法在第二列进行计算,如总和等,因此在修改后的示例中,您能否共享记事本中的CSV原始内容file@AsadNauman:修改后的示例是CSV原始内容。在Excel中查看时,它与您的问题完全相同-这就是Excel显示值的方式。原始数据仍然是t这里-但Excel“猜测”如何最好地显示它。谢谢RonK,我尝试了=“447744369900”现在CSV显示了正确的格式。我们手头没有Excel,但是计算真的失败了吗?对我来说,这似乎只是Excel中的一个格式问题。感谢Turismo,那么有没有库可以创建具有xls扩展名的Excel文件,ww可以在其中预定义单元格格式
Disconnect Time, Calling Number
01/06/2010 01:00:35 AM,447744369900
<h:commandLink>  
    <p:graphicImage value="/images/excel.png" />  
    <p:dataExporter type="xls" target="tbl" fileName="cars" />  
</h:commandLink>