我正在尝试使用新的ActiveXObject("Excel.application")
将HTML表格转换为Javascript中的Excel。基本上我循环遍历表格单元格并将值插入excel中的相应单元格:
//for each table cell
oSheet.Cells(x,y).value = cell.innerText;
问题是当细胞的日期格式为'dd-mm-yyyy'(例如10-09-2008)时,excel将读作'mm-dd-yyyy'(即2008年10月9日)。我试着指定NumberFormat
像:
oSheet.Cells(x,y).NumberFormat = 'dd-mm-yyyy';
但是,它没有任何效果。看来这只影响excel显示值的方式,而不是解析。我现在唯一的解决方案是交换日期,如:
var txt = cell.innerText;
if(/^(\d\d)-(\d\d)-\d\d\d\d$/.test(txt)) txt = txt.replace(/^(\d\d)-(\d\d)/,'$2-$1');
但是,我担心它不是通用的,不同的机器设置会失败。
有没有办法具体说明excel如何解析输入值?
您可以通过使用其本机“序列”日期格式输入数据来避免Excel的日期解析。例如,'08年12月22日'是39804作为Excel序列日期。 (有关这些的详细解释,请参阅here)
然后像以前一样格式化单元格。
我不知道excel支持哪些格式,但你需要像.net's round trip or sortable formats这样的东西,它始终会被一致地读取。
对于#2,如果你可以信任javascript从你提供的任何字符串构建一个合适的日期,这很好。如果你不确定那些你可能会看到像datejs这样的图书馆,在那里你可以更具体地了解你想要发生什么。
代替
oSheet.Cells(x,y).NumberFormat = 'dd-mm-yyyy';
设置这个:
oSheet.Cells(x,y).NumberFormat = 14;
在Vbscript中,我们用来解决这个问题
If IsDate ( Cell.Value ) Then
Cell.Value = DateValue ( Cell.Value )
End If
也许,在java脚本中你也需要使用相同的方法。
我已经尝试过你的代码但是在这个过程的最后,我重新将格式应用到包含日期的列。它工作正常,无论你配置什么样的本地语言机器。
作为我的excel对象被定义为'模板',一旦我得到数据填充,我应用(仅举例):
template.ActiveSheet.Range("D10:F99").NumberFormat = "dd/MMM/yyyy;@";
最好的祝福