代码之家  ›  专栏  ›  技术社区  ›  dbkk

从C中读取Excel文件#

  •  233
  • dbkk  · 技术社区  · 16 年前

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

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

    32 回复  |  直到 16 年前
        1
  •  152
  •   Robin Robinson    16 年前
    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"),
                        });
    
        2
  •  83
  •   Paul G    16 年前

    http://www.connectionstrings.com/?carrier=excel2007 http://www.connectionstrings.com/?carrier=excel

    更新:然后您可以通过以下方式阅读工作表 select * from [Sheet1$]

        3
  •  27
  •   Ian Nelson    16 年前

    ADO.NET方法快速且简单,但它有一些需要注意的问题,特别是关于如何处理数据类型的问题。

    http://blog.lab49.com/archives/196

        4
  •  22
  •   Dmitry Shechtman    16 年前

    这是我在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);
        }
    }
    
        5
  •  21
  •   Michał Pawłowski    14 年前

    Excel数据阅读器怎么样?

    http://exceldatareader.codeplex.com/

        6
  •  16
  •   hitec    16 年前

    以下是几年前我使用.NET1.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;
            }
        }
    }
    
        7
  •  15
  •   Rune Grimstad    16 年前

    Koogra 是一个用C语言编写的开源组件,它可以读取和写入Excel文件。

        9
  •  8
  •   Carl Seleborg    16 年前

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

    干杯

        10
  •  6
  •   2 revs<br/>anonymous&#13;    15 年前

    ExcelMapper是一个开源工具( http://code.google.com/p/excelmapper/

        11
  •  6
  •   Lizzy    12 年前

    我想展示一个使用.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/ . 你可以从中得到更多的细节。

        12
  •  4
  •   xanadont    16 年前

    非常 漂亮的自动化.NETAPI。(API已经存在很长一段时间了,但它是一个令人讨厌的COM)在Office应用程序仍然是一个隐藏的后台进程的同时,您可以在代码中完成您想要/需要的一切。

        13
  •  3
  •   Rob Cooper    16 年前

    原谅我,如果我在这里离开了基地,但这不是问题所在吗 Office PIA's

        14
  •  3
  •   Kenny    16 年前

    最近,在一定程度上是为了在LINQ取得更好的成绩。。。。我一直在使用Excel的自动化API将文件保存为XML电子表格,然后使用LINQ to XML处理该文件。

        15
  •  3
  •   Joe Erickson    16 年前

    SpreadsheetGear for .NET 是与Excel兼容的.NET电子表格组件。您可以在屏幕右侧看到客户对性能的看法 product page evaluation .

        16
  •  3
  •   liya    15 年前

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

        17
  •  3
  •   Bonnie Cornell    13 年前

    NET组件Excel Reader.NET可能满足您的要求。这对于读取XLSX和XLS文件来说已经足够了。因此,请从以下方面进行尝试:

    http://www.devtriogroup.com/ExcelReader

        18
  •  2
  •   Jason Von Ruden    16 年前

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

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

        19
  •  2
  •   user289261    14 年前

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

    http://excelwrapperdotnet.codeplex.com/

        20
  •  2
  •   John R    14 年前

        21
  •  2
  •   Marcel Toth    13 年前

    • 允许 阅读/写作 Excel生成文件的格式
    • 在性能方面(与使用COMs不同)
    • 自由的 开源

    有几种选择,但我们发现 非营利组织 (.NET端口是Java长期存在的 开放源代码项目)成为最佳: http://npoi.codeplex.com/

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

        22
  •  2
  •   cless    13 年前
        23
  •  2
  •   DeeDee    12 年前

    晚会迟到了,但我是一个歌迷 LinqToExcel

        24
  •  1
  •   Leon Bambrick    16 年前

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

    一旦进入csv,c#程序就可以实现这一点。

    (此外,如果有人要求您使用excel编程,最好假装您不知道如何编程)

        25
  •  1
  •   Lars Mæhlum    16 年前

    我知道人们一直在为此制作Excel“扩展”。

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

        26
  •  1
  •   Christian Hagelid    16 年前

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

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

        27
  •  1
  •   dbkk    15 年前

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

    源代码似乎组织得很好,很容易获得(如果您需要像我一样扩展功能或修复小问题)。

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

        28
  •  1
  •   Doctor Rudolf    12 年前

    ClosedXML 在相当大的系统中。

    • 易于安装
    • 直接编码
    • 非常
    • 开发团队是 极端地 接受新的建议。新功能和错误修复通常在同一周内实施
        29
  •  1
  •   greeness    12 年前

    Take.io this .

        30
  •  0
  •   Hafthor    15 年前

    我刚用过 ExcelLibrary