Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#在不使用Excel的情况下将.xls转换为.csv_C#_Asp.net_Csv - Fatal编程技术网

C#在不使用Excel的情况下将.xls转换为.csv

C#在不使用Excel的情况下将.xls转换为.csv,c#,asp.net,csv,C#,Asp.net,Csv,需要将.xls或.xlsx转换为.csv,而无需在C#/ASP.net web应用程序中使用Excel。该应用程序目前正在使用NPOI.dll实现某些功能,但我在codeplex wiki for NPOI上没有看到该特定功能的任何信息。有人有什么建议吗 谢谢.xls是一种专有的二进制格式,不能以纯文本格式读取,因此您需要office或Libre office或其他东西来读取该格式。xlsx是一种基于xml的格式,只需通过DOM解析即可。。。但是您仍然需要手动迭代每个值和手动定界等。您考虑过使用

需要将.xls或.xlsx转换为.csv,而无需在C#/ASP.net web应用程序中使用Excel。该应用程序目前正在使用NPOI.dll实现某些功能,但我在codeplex wiki for NPOI上没有看到该特定功能的任何信息。有人有什么建议吗


谢谢

.xls是一种专有的二进制格式,不能以纯文本格式读取,因此您需要office或Libre office或其他东西来读取该格式。xlsx是一种基于xml的格式,只需通过DOM解析即可。。。但是您仍然需要手动迭代每个值和手动定界等。您考虑过使用xslt吗?

有一些库(例如)可以让您阅读excel。一旦您能够读取数据,写入csv应该很简单

看看图书馆。它会完全满足你的要求

使用FileHelpers,您可以读取Excel文件并写入csv或平面文本文件。而且它是面向对象的!您所要做的就是用一些属性注释类,以便它们与源excel文件匹配

考虑这个例子:

[DelimitedRecord("|")]
public class CustomersVerticalBar {
   public string CustomerID;
   public string CompanyName;
   ...
}
使用以下内容阅读:

ExcelStorage provider = new ExcelStorage(typeof(CustomersVerticalBar));

provider.StartRow = 3;
provider.StartColumn = 2;

provider.FileName = "Customers.xls";

CustomerVerticalBar[] res = (CustomerVerticalBar[]) provider.ExtractRecords();

示例如下:

ADODB.NET可用于将Excel文件视为数据源

//string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;";
string ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;";

ConnectionString = string.Format(ConnectionString, @"FullPathToExcelFile");

OleDbConnection conn = new OleDbConnection(ConnectionString);
conn.Open();

OleDbCommand cmdSelect = new OleDbCommand("SELECT * FROM [Sheet1$]", conn);
OleDbDataAdapter oleDBAdapter = new OleDbDataAdapter();
oleDBAdapter.SelectCommand = cmdSelect;

DataSet myDataset = new DataSet();
oleDBAdapter.Fill(myDataset);
conn.Close(); 

// Do whatever with data in myDataset including export to csv...

不幸的是,我无法使用业务端使用的格式。我希望在某个地方有一个第三方库,具有我不知道的功能。你可以查看Libre Office SDK,但我没有使用它。理论上,它可以帮助您读取xls文件。我不认为这是他的问题-他已经在使用NPOI读取Excel文件。感谢Mikael,这是一个很好的简单解决方案。但是,我讨厌我必须定义输出的想法。如果企业决定在未来改变某些东西,这就使得这一点变得不那么灵活了。@MikaelÖstberg-你所要做的就是定义一个输出。然后,您可以读取该输入,并将其更改为其他功能。@Tim您是在考虑一个通用的Excel->CSV吗?获取Excel文件中的任何内容,并将其写入CSV?我不喜欢Filehelpers,因为我让它破坏了数据。不经常发生,但确实发生了。问题在于FileHelpers.RecordInfo.RecursiveGetFields(…),它依次调用FileHelpers.FieldInfoCacheMipulator.ResetFieldInfoCache(…),它使用反射修改实际.NET反射库的私有成员,试图强制.NET反射按声明的顺序返回字段。但是,Microsoft明确声明“您的代码不能依赖于字段/属性的返回顺序”msdn.Microsoft.com/../kyaxdd3x.aspxThanks chezy。我确实在C#corner上看到了类似的东西,但我错过了stackoverflow上的帖子。谢谢你发这封信。我想我会选择这个解决方案。不过,这不需要安装Excel吗?不,不需要Excel,只需要ADODB.NET jet驱动程序。