是否有免费或开源库可以直接从 C# 程序读取 Excel 文件 (.xls)?

它不需要太花哨,只需选择一个工作表并将数据作为字符串读取即可。到目前为止,我一直在使用 Excel 的“导出到 Unicode 文本”功能,并解析生成的(制表符分隔的)文件,但我想消除手动步骤。

有帮助吗?

解决方案

var fileName = string.Format("{0}\\fileNameHere", Directory.GetCurrentDirectory());
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString);
var ds = new DataSet();

adapter.Fill(ds, "anyNameHere");

DataTable data = ds.Tables["anyNameHere"];

这是我通常使用的。它有点不同,因为我通常在表的编辑处粘贴 AsEnumerable() :

var data = ds.Tables["anyNameHere"].AsEnumerable();

因为这让我可以使用 LINQ 从字段中搜索和构建结构。

var query = data.Where(x => x.Field<string>("phoneNumber") != string.Empty).Select(x =>
                new MyContact
                    {
                        firstName= x.Field<string>("First Name"),
                        lastName = x.Field<string>("Last Name"),
                        phoneNumber =x.Field<string>("Phone Number"),
                    });

其他提示

如果只是 Excel 文件中包含的简单数据,您可以通过 ADO.NET 读取数据。请参阅此处列出的连接字符串:

http://www.connectionstrings.com/?Carrier=excel2007或者http://www.connectionstrings.com/?Carrier=excel

-瑞安

更新:那么你可以通过类似的方式阅读工作表 select * from [Sheet1$]

ADO.NET 方法既快速又简单,但它有一些您应该注意的怪癖,特别是关于如何处理数据类型。

这篇优秀的文章将帮助您避免一些常见的陷阱:http://blog.lab49.com/archives/196

这是我在 Excel 2003 中使用的:

Dictionary<string, string> props = new Dictionary<string, string>();
props["Provider"] = "Microsoft.Jet.OLEDB.4.0";
props["Data Source"] = repFile;
props["Extended Properties"] = "Excel 8.0";

StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, string> prop in props)
{
    sb.Append(prop.Key);
    sb.Append('=');
    sb.Append(prop.Value);
    sb.Append(';');
}
string properties = sb.ToString();

using (OleDbConnection conn = new OleDbConnection(properties))
{
    conn.Open();
    DataSet ds = new DataSet();
    string columns = String.Join(",", columnNames.ToArray());
    using (OleDbDataAdapter da = new OleDbDataAdapter(
        "SELECT " + columns + " FROM [" + worksheet + "$]", conn))
    {
        DataTable dt = new DataTable(tableName);
        da.Fill(dt);
        ds.Tables.Add(dt);
    }
}

Excel 数据阅读器怎么样?

http://exceldatareader.codeplex.com/

我曾在生产环境中使用它,将大量数据从各种 Excel 文件提取到 SQL Server Compact 中。它工作得很好而且相当健壮。

这是几年前我使用 .NET 1.1 用 C# 编写的一些代码。不确定这是否正是您所需要的(并且可能不是我最好的代码:))。

using System;
using System.Data;
using System.Data.OleDb;

namespace ExportExcelToAccess
{
    /// <summary>
    /// Summary description for ExcelHelper.
    /// </summary>
    public sealed class ExcelHelper
    {
        private const string CONNECTION_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<FILENAME>;Extended Properties=\"Excel 8.0;HDR=Yes;\";";

        public static DataTable GetDataTableFromExcelFile(string fullFileName, ref string sheetName)
        {
            OleDbConnection objConnection = new OleDbConnection();
            objConnection = new OleDbConnection(CONNECTION_STRING.Replace("<FILENAME>", fullFileName));
            DataSet dsImport = new DataSet();

            try
            {
                objConnection.Open();

                DataTable dtSchema = objConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if( (null == dtSchema) || ( dtSchema.Rows.Count <= 0 ) )
                {
                    //raise exception if needed
                }

                if( (null != sheetName) && (0 != sheetName.Length))
                {
                    if( !CheckIfSheetNameExists(sheetName, dtSchema) )
                    {
                        //raise exception if needed
                    }
                }
                else
                {
                    //Reading the first sheet name from the Excel file.
                    sheetName = dtSchema.Rows[0]["TABLE_NAME"].ToString();
                }

                new OleDbDataAdapter("SELECT * FROM [" + sheetName + "]", objConnection ).Fill(dsImport);
            }
            catch (Exception)
            {
                //raise exception if needed
            }
            finally
            {
                // Clean up.
                if(objConnection != null)
                {
                    objConnection.Close();
                    objConnection.Dispose();
                }
            }


            return dsImport.Tables[0];
            #region Commented code for importing data from CSV file.
            //              string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + System.IO.Path.GetDirectoryName(fullFileName) +";" +"Extended Properties=\"Text;HDR=YES;FMT=Delimited\"";
            //
            //              System.Data.OleDb.OleDbConnection conText = new System.Data.OleDb.OleDbConnection(strConnectionString);
            //              new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " + System.IO.Path.GetFileName(fullFileName).Replace(".", "#"), conText).Fill(dsImport);
            //              return dsImport.Tables[0];

            #endregion
        }

        /// <summary>
        /// This method checks if the user entered sheetName exists in the Schema Table
        /// </summary>
        /// <param name="sheetName">Sheet name to be verified</param>
        /// <param name="dtSchema">schema table </param>
        private static bool CheckIfSheetNameExists(string sheetName, DataTable dtSchema)
        {
            foreach(DataRow dataRow in dtSchema.Rows)
            {
                if( sheetName == dataRow["TABLE_NAME"].ToString() )
                {
                    return true;
                }   
            }
            return false;
        }
    }
}

库格拉 是一个用 C# 编写的开源组件,用于读取和写入 Excel 文件。

虽然您确实特别要求使用 .xls,这意味着 OpenXML 格式(例如,较旧的文件格式)xlsx)我强烈推荐 OpenXML SDK(http://msdn.microsoft.com/en-us/library/bb448854.aspx)

不久前,我用 C# 阅读了很多 Excel 文件,我们使用了两种方法:

  • COM API,您可以直接访问 Excel 的对象并通过方法和属性操作它们
  • 允许像数据库一样使用 Excel 的 ODBC 驱动程序。

后一种方法是 很多 快点:通过 COM 读取包含 20 列和 200 行的大表需要 30 秒,通过 ODBC 则需要半秒。因此,如果您只需要数据,我会推荐数据库方法。

干杯,

卡尔

ExcelMapper 是一个开源工具(http://code.google.com/p/excelmapper/)可用于将 Excel 工作表读取为强类型对象。它支持 xls 和 xlsx 格式。

我想展示一种使用 .NET 读取 xls/xlsx 文件的简单方法。希望以下内容对您有所帮助。

 private DataTable ReadExcelToTable(string path)    
 {

     //Connection String

     string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";  
     //the same name 
     //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + //";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; 

     using(OleDbConnection conn = new OleDbConnection(connstring))
     {
        conn.Open();
        //Get All Sheets Name
        DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"});  

        //Get the First Sheet Name
        string firstSheetName = sheetsName.Rows[0][2].ToString(); 

        //Query String 
        string sql = string.Format("SELECT * FROM [{0}]",firstSheetName); 
        OleDbDataAdapter ada =new OleDbDataAdapter(sql,connstring);
        DataSet set = new DataSet();
        ada.Fill(set);
        return set.Tables[0];   
   }
 }

代码来自文章: http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/. 。您可以从中获得更多详细信息。

不是免费的,但最新的 Office 有 非常 不错的自动化.Net API。(API 已经存在很长一段时间了,但它是令人讨厌的 COM)您可以在代码中执行您想要/需要的所有操作,而 Office 应用程序仍然是一个隐藏的后台进程。

如果我在这里偏离基地,请原谅我,但这不是吗? 办公室 PIA 是给?

最近,部分是为了更好地使用 LINQ......我一直在使用 Excel 的自动化 API 将文件另存为 XML 电子表格,然后使用 LINQ to XML 处理该文件。

用于 .NET 的 SpreadsheetGear 是适用于 .NET 的 Excel 兼容电子表格组件。您可以在我们的右侧查看我们的客户对性能的评价 产品页面. 。您可以自己尝试一下,免费的,功能齐全的 评估.

智能XLS 是另一个excel电子表格组件,它支持excel图表、公式引擎的大部分功能,并且可以读/写excel2007 openxml格式。

.NET 组件 Excel Reader .NET 可能会满足您的要求。对于读取 XLSX 和 XLS 文件来说已经足够了。所以尝试一下:

http://www.devtriogroup.com/ExcelReader

我推荐 FileHelpers 库,它是一个免费且易于使用的 .NET 库,用于从 EXCEL、文件、字符串或流等中的固定长度或分隔记录导入/导出数据。

Excel 数据链接文档部分 http://filehelpers.sourceforge.net/example_exceldatalink.html

您可以尝试使用这个开源解决方案,它使处理 Excel 变得更加干净。

http://excelwrapperdotnet.codeplex.com/

SpreadsheetGear 太棒了。是的,这是一笔费用,但与摆弄这些其他解决方案相比,这是值得的。它快速、可靠、非常全面,我不得不说,在我的全职软件工作中使用该产品一年半多后,他们的客户支持非常棒!

我们使用的解决方案需要:

  • 允许 阅读/写作 Excel 生成的文件数
  • 快速地 性能方面(与使用 COM 不同)
  • 是微软Office 独立的 (无需安装 MS Office 的客户端即可使用)
  • 自由的 或者 开源 (但积极开发)

有多种选择,但我们发现 NPoi (Java 长期存在的 .NET 端口 波伊 开源项目)是最好的:http://npoi.codeplex.com/

它还允许使用 .doc 和 .ppt 文件格式

如果只是表格数据。我推荐 Marcos Melli 的文件数据助手,可以下载 这里.

聚会迟到了,但我是它的粉丝 LinqToExcel

您可以编写一个 Excel 电子表格来加载给定的 Excel 电子表格并将其保存为 csv(而不是手动执行)。

然后你可以从 C# 自动化它。

一旦它在 csv 中,c# 程序就可以理解它。

(另外,如果有人让你用Excel编程,最好假装你不知道怎么做)

(编辑:啊,是的,罗布和瑞安都是对的)

我知道人们一直在为此目的制作 Excel“扩展”。
您或多或少会在 Excel 中创建一个按钮,显示“导出到程序 X”,然后以程序可以读取的格式导出并发送数据。

http://msdn.microsoft.com/en-us/library/ms186213.aspx 应该是一个好的起点。

祝你好运

刚刚做了一个快速演示项目,需要管理一些 Excel 文件。GemBox 软件中的 .NET 组件足以满足我的需求。它有一个免费版本,但有一些限制。

http://www.gemboxsoftware.com/GBSpreadsheet.htm

Excel 包 是一个用于读取/写入 Excel 2007 文件的开源 (GPL) 组件。我在一个小项目上使用过它,API 很简单。仅适用于 XLSX (Excel 200&),不适用于 XLS。

源代码似乎组织良好并且易于绕过(如果您需要像我一样扩展功能或修复小问题)。

起初,我尝试了 ADO.Net(Excel 连接字符串)方法,但它充满了令人讨厌的黑客行为 - 例如,如果 第二 如果行包含一个数字,它将返回下面列中所有字段的整数,并悄悄删除任何不适合的数据。

我们用 封闭XML 在相当大的系统中。

  • 自由的
  • 易于安装
  • 直接编码
  • 非常 响应支持
  • 开发团队是 极端地 接受新的建议。通常新功能和错误修复会在同一周内实施

Take.io 电子表格将为您完成这项工作,并且免费。看看吧 .

我刚用过 Excel图书馆 将 .xls 电子表格加载到数据集中。对我来说效果很好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top