繁体   English   中英

从 C# 读取 Excel 文件

[英]Reading Excel files from C#

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

不需要太花哨,只需将 select 一个工作表读取为字符串即可。 到目前为止,我一直在使用 Export to Unicode text function of Excel,并将生成的(制表符分隔的)文件解析为手动步骤。

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=excel2007http://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;
        }
    }
}

Koogra是一个用 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 应用程序仍然是一个隐藏的后台进程。

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

如果我不在基地,请原谅我,但这不是办公室 PIA 的用途吗?

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

SpreadsheetGear for .NET适用于 .NET的 Excel 兼容电子表格组件。 您可以在我们产品页面的右侧看到我们的客户对性能的评价。 您可以通过免费的、功能齐全的评估自行试用

.NET 组件 Excel Reader .NET 可以满足您的要求。 它足以读取 XLSX 和 XLS 文件。 所以尝试从:

http://www.devtriogroup.com/ExcelReader

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

您可以尝试使用这个开源解决方案,它可以让处理 Excel 更加清晰。

http://excelwrapperdotnet.codeplex.com/

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

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

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

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

  • 允许读取/写入Excel 生成的文件
  • 性能要(不像使用 COM)
  • 独立于 MS Office(需要在没有安装 MS Office 的客户端的情况下可用)
  • 免费开源(但积极开发)

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

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

如果只是表格数据。 我会推荐 Marcos Melli 的文件数据助手,可以在此处下载。

我们在相当大的系统中使用ClosedXML

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

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

源代码似乎也井井有条且易于使用(如果您需要像我一样扩展功能或修复小问题)。

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

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

那么你可以从 c# 自动化。

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

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

(编辑:啊,是的,rob 和 ryan 都是对的)

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

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

祝你好运

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

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

Take.io Spreadsheet 将为您完成这项工作,并且不收取任何费用。 看看这个

我只是使用ExcelLibrary将 .xls 电子表格加载到 DataSet 中。 对我很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM