CSV文件可以有多个标签/工作表吗?

52
我正在调用一个网络服务,该服务返回的数据是csv格式。 如果我尝试将数据保存为xls/xlsx,则会得到多个工作簿中的多个工作表。 那么,如何在C#中以csv格式保存具有多个选项卡/工作表的数据。
我知道带有多个选项卡的csv并不实际,但是否有任何方法或库可以在csv中保存具有多个选项卡/工作表的数据?

2
一个可能的替代方案 - https://technet.microsoft.com/zh-cn/magazine/2006.01.blogtales.aspx - MethodMan
什么是 CSV 的“多个选项卡/工作表”?这意味着在Excel中打开时,您会得到多个选项卡吗? - Ann L.
4
无法将带有多个选项卡的 CSV 文件保存。 - Praveen Paulose
2
将其转换为XML(如@MethodMan所建议的)是否可行? - Ann L.
保存和从XML中检索数据并不会很复杂?@MethodMan提供的链接需要您手动设置。 - hello temp9
显示剩余2条评论
4个回答

39

CSV作为一种文件格式,假设有一个数据“表”;在Excel中,这就是工作簿的一个表格。虽然它只是纯文本,你可以按任何你想要的方式解释它,但是“标准”的CSV格式不支持你的主管所想的。

你可以用以下几种方式来解决:

  • 使用不同的文件来表示每个表格,文件名相关但不同,例如 "Book1_Sheet1"、"Book1_Sheet2"等等。你可以根据第一个下划线之前的文本找到相关的文件组。这是最简单的实现方法之一,但需要用户携带多个与逻辑“工作簿”相关的文件,如果其中一个文件遗失了,数据也将丢失。

  • 采用上述方式,并将文件“压缩”成一个可移动的单个文件。你保留了上述选项的纯CSV优点,同时又方便地只需移动一个文件,而不是几个文件,但是缺点是必须压缩/解压缩文件才能获取实际文件。为了减轻这种痛苦,如果你使用.NET 4.5,则可以访问内置的ZipFile实现;如果不是,可以使用开源的DotNetZip或SharpZipLib,其中任何一个都可以允许你编程创建和使用标准的Windows ZIP文件。你也可以使用几乎通用的.tar.gz(又称.tgz)组合,但你的用户需要你的程序或第三方压缩工具,如7Zip或WinRAR来从一组导出的CSV中创建归档。

  • 实现一种准CSV格式,其中空白行(仅包含换行符)充当“制表符分隔符”,而你的解析器将期望一个新行的列标题,然后是新配置中的数据行。这个变体不遵循预期的文件格式,可能无法被CSVs的其他消费者读取,因此我建议你不要使用“.csv”扩展名,因为它会让用户感到困惑和沮丧,他们希望能够在其他应用程序中打开它,如电子表格。


谢谢。您能给我一个实现准CSV格式且空行作为分隔符的例子吗? - hello temp9
1
这很简单;只需像正常解析CSV行一样解析它们(第一行是标题,然后是与这些标题匹配的数据行),但在解析数据行之前,测试一下该行是否包含任何非空白字符。如果没有,则退出数据行解析并重复列标题逻辑,使用新集合存储下一个表格的数据。如果需要更具体的内容,您将要求我提供可插入代码,而这不是本网站的目的。 - KeithS

13
如果我尝试保存xls / xlsx中的数据,那么我会得到一个包含多个工作表的工作簿。
您的答案就在您的问题中,请不要使用文本/ csv(几乎肯定不能使用多个工作表,它甚至无法处理一个工作表;虽然在某些应用程序中,如Excel或Calc导入它时有工作表,但在文本/ csv中并没有工作表),而是将其保存为xls,xlsx,ods或其他具有工作表的格式。
XLSX和ODS都比文本/ csv复杂得多,但是它们分别可能是各自格式中最简单的。

C#/Asp.net中没有可以制作多个工作表的库吗? - hello temp9
你不会想在服务器上使用Excel——它明确不是为重度多线程、非UI使用而设计的。有很多库可以在服务器环境中生成Excel文件(在纯.NET代码中,没有外部依赖);有很多好的付费库,也可能有一些免费的。 - Joe White
有没有在.NET中好用且免费的库?我不想使用Interop。 - hello temp9
2
你不能在CSV中拥有多个工作表,因为CSV没有工作表。 - Jon Hanna
3
请向您的主管询问 https://www.ietf.org/rfc/rfc4180.txt 中指定表格的部分。他们无法找到,因为那里没有这样的内容。这就像询问如何在CSV上调高音量。 与此同时,XLSX文件实际上是几个相关XML和文本文件的内部zip文件。它们在编程方面不是非常容易构建,但也不是非常困难。 - Jon Hanna
显示剩余7条评论

5
我已经使用这个库有一段时间了,https://github.com/SheetJS/js-xlsx,在我的项目中导入数据和结构,支持格式包括:xls(x),csv和xml。当然,您也可以保存为这些格式(全部来自客户端)!希望这对您有所帮助,可以查看在线演示:http://oss.sheetjs.com/js-xlsx/,查看源代码或在GH上提交问题?但我认为你将不得不大部分时间自己编写代码。

那么你的意思是多表格的 CSV 可能吗? - hello temp9
不,那个东西不存在,csv是一种粗糙的格式,旧的格式,但主要用于数据传输,没有多重什么的 :) - Kresimir Pendic
这看起来真的很不错。你能告诉我如何在我的Visual Studio中使用这个库吗? - hello temp9
我想提取每个由一行分隔的文件的CSV,这就是这个库所提供的。但请帮我安装这个库。 - hello temp9

-3

我认为您想要减小Excel文件的大小。如果是这样,您可以将其保存为xlsb格式,即Excel二进制工作簿格式。此外,您可以通过删除所有空白单元格来减小文件大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接