从浏览器将CSV数据下载到Excel

时间:2019-08-09 11:51:38

标签: excel csv browser download

所以我在PHP中有一个脚本,用于创建制表符分隔 CSV输出。

我的HTML中有一个按钮,其工作方式如下:

<a href="https://www.domain.co.uk/api.php?mode=csv" target="_blank" download="export.csv">Export Data</a>

理想情况下,我希望用户在Excel中打开此CSV文件。

我在这里遇到的问题是制表符分隔的CSV,文件扩展名以及Excel如何处理所有这些问题。例如:

download="export.csv"

浏览器中的结果要求我在Excel中打开它(不需要的行为),但是一旦在Excel中,则没有任何列受到尊重,因为它们是制表符分隔的(不是逗号分隔的,这显然是Excel所期望的)。

download="export.xls"

浏览器中的结果要求我在Excel中再次打开它(再次是想要的行为),但是Excel抱怨文件扩展名和内容不匹配,并向用户发出警告。如果用户超过此警告,则数据将按预期显示,但是我可以在没有警告的情况下进行操作。

download="export.txt"

导致浏览器将文件下载为文本文件。一旦导入到Excel中,列就会受到尊重,但是我可以考虑将其视为类似于CSV文件的Excel文件。

download="export.tsv"

导致浏览器下载文件,但是由于无法识别此扩展名,因此需要手动将其导入Excel,这不是我要的。实际上,即使TSV是制表符分隔节的最正确文件扩展名,TXT扩展名似乎也能更流畅地工作。

我无法在最终用户计算机上设置文件关联,并且我尽可能避免采用“将数据导出为实际XLXS文件”路线。我更喜欢使用制表符分隔的CSV而不是逗号分隔的CSV,因为导出的数据自然会包含很多逗号。


编辑:

因此,根据罗恩·罗森菲尔德(Ron Rosenfeld)的建议,我尝试输出一个用逗号分隔的CSV文件,并在数据周围加上引号-并将文件加载到Excel中,并保留了列-但是引号会出现在使用引号的每列数据中。

是否可能不出现引号?

理想情况下,我希望将内容选项卡分开,但是在此阶段,任何允许我从浏览器打开CSV文件到Excel的东西都很好。


我希望有一种方法,可以将浏览器中由制表符分隔的CSV文件下载到Excel,而不必大惊小怪。如何实现?

3 个答案:

答案 0 :(得分:4)

  

CSV和TSV文件之间的区别是-只要创建者遵循某些 规则 ,即: CSV file 将具有 comma separated 值,而 TSV file 将具有 tab separated 值。

     

对于 TXT 文件,未指定格式。

CSV 文件为comma-delimited,因此您必须使用以下文件:

sep=,

TSV 文件是tab-delimited,因此您必须使用以下文件:

sep=\t

如果您的计算机上安装了MS Excel,则 CSV文件与Excel紧密相关。

请查看 this post ,以了解将sep=;用于UTF-8UTF-16LE的用途。

  

在PHP中正确输出UTF-8UTF-16LE CSV文件非常重要。

     

所以THIS POST将为您提供有用的信息

答案 1 :(得分:2)

CSV表示“逗号分隔的值”,因此默认分隔符为beforeEach(() => { jest.spyOn(window, 'fetch').mockImplementation((...args) => { console.warn('window.fetch is not mocked for this call', ...args) return Promise.reject(new Error('This must be mocked!')) }) }) afterEach(() => { window.fetch.mockRestore() })

要将该分隔符更改为标签,请放入

,

作为.csv文件中的第一行(是的,您仍然可以将其命名为.csv)。这告诉excel分隔符应该是什么。

请注意,如果您使用实际的文本编辑器打开.csv,则其内容应为

sep=\t

.csv https://github.com/kentcdodds/bookshelf/blob/4057cf5d5d6c0c3d40868abb804ffe3acf850c97/src/setupTests.js#L3-L13中尚未正式定义此功能,因此,是否可以与Excel以外的其他软件一起使用取决于该软件的实现。

答案 2 :(得分:0)

我以前做过。痛苦的经历,我宁愿重生。但是自从你问了(并被悬赏)。

  1. 确保您的http标头阅读:内容类型:application / x-www-form-urlencoded
  2. ;用作分隔符
  3. 不要用"括起来(这是我尚未了解的魔术)。
  4. 手指交叉