将javascript数据导出到CSV文件而无需服务器交互

将javascript数据导出到CSV文件而无需服务器交互,javascript,export-to-csv,Javascript,Export To Csv,如果我们在nodeJS服务器上,我们可以编写头,设置mime类型,然后发送它: res.header("Content-Disposition", "attachment;filename="+name+".csv"); res.type("text/csv"); res.send(200, csvString); 由于有标题,浏览器将为命名的csv文件创建下载 当在浏览器中生成有用的数据时,将其保存到CSV文件中的一种解决方案是使用ajax,将其上载到服务器(可能可以选择将其保存在服务器上

如果我们在nodeJS服务器上,我们可以编写头,设置mime类型,然后发送它:

res.header("Content-Disposition", "attachment;filename="+name+".csv"); 
res.type("text/csv");
res.send(200, csvString);
由于有标题,浏览器将为命名的csv文件创建下载

当在浏览器中生成有用的数据时,将其保存到CSV文件中的一种解决方案是使用ajax,将其上载到服务器(可能可以选择将其保存在服务器上),然后让服务器将其与这些标题一起发送回浏览器,使其成为CSV下载

但是,我想要一个100%的浏览器解决方案,不涉及服务器乒乓球

因此,我突然想到可以打开一个新窗口,并尝试使用等效的元标记设置标题

但这在最近的Chrome中对我不起作用

我确实得到了一个新窗口,它包含csvString,但不作为下载

我想我希望在底部选项卡中获得下载,或者在底部选项卡中获得带有下载的空白新窗口

我想知道meta标记是否正确,或者是否还需要其他标记

有没有一种方法可以在不将其推送到服务器的情况下使其工作

var A=[['n','sqrt(n)]];//将标题行作为第一项初始化行数组
对于(var j=1;j而言,HTML5属性始终存在:

此属性(如果存在)表示作者打算 用于下载资源的超链接,以便当用户 单击链接,系统将提示他们将其保存为本地文件

如果属性具有值,则该值将用作预填充值 当用户单击时打开的保存提示中的文件名 链接


请参阅adeneo的答案,但不要忘记
encodeURIComponent

a.href     = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csvString);
此外,我需要对行分隔符执行“\r\n”而不仅仅是“\n”

var csvString = csvRows.join("\r\n");

修改后的fiddle:

@adeneo-answer适用于Firefox和chrome…对于IE,可以使用以下选项

if(window.navigator.msSaveOrOpenBlob){
var blob=new blob([decodeURIComponent(encodeURI(result.data))]{
类型:“文本/csv;字符集=utf-8;”
});
msSaveBlob(blob,'FileName.csv');

}
一旦我将JS代码打包到一个很小的库中:

Github上提供了代码、文档和演示/游戏

享受:)


欢迎拉取请求。

我们可以使用javascript轻松创建和导出/下载带有任何分隔符的excel文件(在这个答案中,我使用逗号分隔符)。我没有使用任何外部软件包来创建excel文件

var头=[[
‘品目1’,
“标题2”,
‘品目3’,
“标题4”
]];
变量行=[
{键1:1,键2:2,键3:3,键4:4},
{键1:2,键2:5,键3:6,键4:7},
{键1:3,键2:2,键3:3,键4:4},
{键1:4,键2:2,键3:3,键4:4},
{键1:5,键2:2,键3:3,键4:4}
];
对于(变量项=0;项downloadLink.click()请参见adeneo的答案,但要在所有国家/地区的Excel中实现此功能,应在文件的第一行添加“SEP=,”。这将在Excel中设置标准分隔符,并且不会显示在实际文档中

var csvString = "SEP=, \n" + csvRows.join("\r\n");

也许这会有所帮助:@Vengarioth数据URL肯定很模糊,很有可能。这当然不是很明显,我还没有看到一个库可以做到这一点,2011年的另一个答案说这是不可能的。类似的数据URL技巧在@Italo的答案中也有,因为他不知道如何设置文件名,但我确信这是可能的。通常是
附件;filename=somefile.csv
但这似乎不适用于csv字符串?a.href='data:attachment/csv',+encodeURIComponent(csvString);我怀疑它们可能会被转换回实际的文件中。。。但不确定文件名在Chrome中对我不起作用。当我将a.href更改为:a.href=window.URL.createObjectURL(新Blob([csvString],{type:“attachment/csv”})时,它起作用了@FacioRatio Google改变了Chrome中的一些东西。正在中断设置文件名的功能。请参阅:我可以在IE11中确认这一点,并已更新了我的库,以包含基于此技术的IE11支持。我在代码注释中记下了你的帖子。非常感谢。我怀疑R或Pandas(Python)在csv文件中是否会像这样。@Paul,这可能是真的,但在我的情况下,我需要在excel中打开一个csv文件,并且我希望它以一种外观良好的方式打开,而不考虑位置。如果你有更好的解决办法,我很乐意听到!
a.href     = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csvString);
var csvString = csvRows.join("\r\n");
var csvString = "SEP=, \n" + csvRows.join("\r\n");