C#如何在没有安装Excel的情况下将.xls文件转换为.csv文件

4
需要在C#/ASP.net Web应用程序中将.xls或.xlsx文件转换为.csv文件,而不使用Excel。该应用程序目前正在使用NPOI.dll实现某些功能,但我在codeplex wiki上没有找到有关该特定功能的任何信息。请问是否有任何建议?
谢谢。

谢谢Chezy。我在C# Corner上看到了类似的东西,但是我错过了stackoverflow上的那篇文章。感谢您发布这个。我想我会采用这个解决方案。 - Tim
4个回答

5

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...

这需要安装Excel吗? - Rup
不需要Excel,只需要ADODB.NET Jet驱动程序。 - amit_g

5

有一些库(例如Excel Data Reader),可以让您读取Excel文件。一旦您能够读取数据,写入CSV应该很简单。


3
请看 FileHelpers 库。它可以完美地解决您的问题。
使用 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();

以下内容摘自这里:http://filehelpers.sourceforge.net/example_exceldatalink.html


谢谢Mikael,这是一个不错的简单解决方案,但我不喜欢必须定义输出的想法。如果业务在未来决定更改某些内容,这将使其不太灵活。 - Tim
@MikaelÖstberg - 你所需要做的就是定义一个输出。然后,你可以读取该输入并更改它以获得额外的功能。 - Security Hound
@Tim 你是在考虑通用的 Excel -> CSV 转换吗?将 Excel 文件中的任何内容都写入到 CSV 中? - Mikael Östberg
1
我不是Filehelpers的粉丝,因为我曾经遇到过它破坏数据的情况。虽然这种情况并不经常发生,但确实会发生。问题出在FileHelpers.RecordInfo.RecursiveGetFields(...)上,它又调用了FileHelpers.FieldInfoCacheManipulator.ResetFieldInfoCache(...),后者使用反射修改实际的.NET Reflection库的私有成员,试图强制.NET反射按照声明的顺序返回字段。然而,微软明确指出:“您的代码不能依赖于返回字段/属性的顺序”msdn.microsoft.com/.../kyaxdd3x.aspx - Nathan

-4

.xls是一种专有的二进制格式,无法以纯文本格式读取,因此您需要使用Office或Libre Office或其他软件来读取它... .xlsx是基于XML的格式,应该可以通过解析DOM来实现...但您仍然需要手动迭代每个值并手动分隔等。您考虑过使用XSLT吗?


不幸的是,我被迫使用业务端正在使用的格式。我希望可能会有一个第三方库具有我不知道的该功能。 - Tim
你可以尝试使用Libre Office SDK,但我没有用过。理论上它可以帮助你读取xls文件。 - therealmitchconnors
我认为这不是他的问题 - 他已经在使用NPOI来读取Excel文件了。 - Rup

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