【问题标题】:C# converting .xls to .csv without Excel [duplicate]C#在没有Excel的情况下将.xls转换为.csv [重复]
【发布时间】:2011-09-27 17:53:03
【问题描述】:

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

谢谢

【问题讨论】:

  • 谢谢你。我确实在 C# 角落看到了类似的东西,但我错过了 stackoverflow 上的那个帖子。感谢您发布那个。我想我会采用这个解决方案。

标签: c# asp.net csv


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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 吗?
    • 不,不需要 Excel,只需要 ADODB.NET jet 驱动程序。
    【解决方案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,这是一个不错的简单解决方案,但是,我讨厌必须定义输出的想法。如果他们决定在未来改变某些东西,这对企业来说就不那么灵活了。
    • @MikaelÖstberg - 你所要做的就是定义一个输出。然后,您可以读取该输入并将其更改为其他功能。
    • @Tim 你在想一个通用的 Excel -> CSV 吗?将 Excel 文件中的任何内容写入 CSV?
    • 我不是 Filehelpers 的粉丝,因为我有它损坏的数据。不会经常发生,但确实会发生。问题在于 FileHelpers.RecordInfo.RecursiveGetFields(...) 进而调用 FileHelpers.FieldInfoCacheManipulator.ResetFieldInfoCache(...) 它使用反射来修改实际 .NET 反射库的私有成员,以尝试强制 .NET 反射按照声明的顺序返回字段。但是,Microsoft 明确声明“您的代码不得依赖于返回字段/属性的顺序”msdn.microsoft.com/.../kyaxdd3x.aspx
    【解决方案4】:

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

    【讨论】:

    • 不幸的是,我被业务端使用的格式卡住了。我希望在某个地方可能有一个具有我不知道的功能的 3rd 方库
    • 您可能会查看 Libre Office SDK,但我没有使用它。它理论上可以帮助您阅读 xls 文件。
    • 我不认为这是他的问题 - 他已经在使用 NPOI 来读取 Excel 文件。
    猜你喜欢
    • 2013-11-07
    • 2012-11-21
    • 2021-10-24
    • 2010-10-30
    • 2015-03-14
    • 2014-05-05
    • 1970-01-01
    • 2021-10-23
    • 2016-06-26
    相关资源
    最近更新 更多