Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C中读取Excel文件_C#_.net_Excel_Ms Office - Fatal编程技术网

C# 从C中读取Excel文件

C# 从C中读取Excel文件,c#,.net,excel,ms-office,C#,.net,Excel,Ms Office,有没有免费或开源的库可以直接从C程序读取Excel文件.xls 不需要太花哨,只需选择一个工作表并将数据作为字符串读取即可。到目前为止,我一直在使用Excel的“导出到Unicode文本”功能,并解析生成的制表符分隔文件,但我想取消手动步骤。您可以编写Excel电子表格,加载给定的Excel电子表格并将其保存为csv,而不是手动执行 然后你可以从c语言中自动完成 一旦进入csv,c程序就可以实现这一点 另外,如果有人让你用excel编程,最好假装你不知道如何编程 编辑:啊,是的,rob和ryan

有没有免费或开源的库可以直接从C程序读取Excel文件.xls


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

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

然后你可以从c语言中自动完成

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

另外,如果有人让你用excel编程,最好假装你不知道如何编程


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

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

应该是一个好的开始


祝您好运

如果我在这里不在这里,请原谅我,但这不就是我们的目的吗?

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

-瑞安


更新:然后您可以通过[Sheet1$]中的select*之类的工具阅读工作表。

这不是免费的,但最新的Office提供了非常好的自动化.Net API。API已经存在很长一段时间了,但它是一个很好的应用程序。在Office应用程序仍然是一个隐藏的后台进程的同时,您可以在代码中做任何您想要/需要的事情。

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


以下是几年前我使用.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;
        }
    }
}
这是我通常使用的。这有点不同,因为我通常在编辑表格时粘贴一个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"),
                    });

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

这篇优秀的文章将帮助您避免一些常见的陷阱:

不久前,我用C语言阅读了大量Excel文件,我们使用了两种方法:

COM API,您可以在其中直接访问Excel的对象,并通过方法和属性对其进行操作 允许像数据库一样使用Excel的ODBC驱动程序。 后一种方法要快得多:通过COM读取一个包含20列和200行的大表需要30秒,通过ODBC读取需要半秒。因此,如果您只需要数据,我建议您使用数据库方法

干杯


Carl

虽然您确实特别要求.xls,这意味着较旧的文件格式,但对于OpenXML格式,例如xlsx,我强烈推荐OpenXML SDK

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

Excel数据链接文档部分

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

这是我在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);
    }
}

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

是一个与Excel兼容的.NET电子表格组件。您可以在我们的右侧看到客户对性能的看法。您可以使用免费的、功能齐全的Excel Mapper进行尝试。

Excel Mapper是一个开源工具,可用于将Excel工作表作为强类型对象进行读取。它支持xls和xlsx两种格式。

我刚刚将.xls电子表格加载到数据集中。非常适合我。

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

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

如果您需要像我一样扩展功能或修复小问题,那么源代码看起来也组织得很好,很容易获得


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

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


电子表格真是太棒了。是的,这是一笔费用,但与其他解决方案相比,这是值得的。它是快速、可靠的
,非常全面,我必须说,在我的全职软件工作中使用该产品一年半之后,他们的客户支持非常棒

Excel数据阅读器怎么样


我曾在it anger中,在生产环境中,将大量数据从各种Excel文件拉入SQL Server Compact。它工作得非常好,而且相当健壮。

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


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

允许读取/写入Excel生成的文件 性能要快,不要像使用COM一样 独立于MS Office需要在没有安装MS Office的客户端的情况下可用 免费或开源,但积极开发 有几种选择,但我们发现Java长期存在的Poi开源项目的NPoi.NET端口是最好的:


如果只是表格数据,它还允许使用.doc和.ppt文件格式。我推荐Marcos Melli的文件数据助手,可以下载。

Take.io电子表格将为您免费完成这项工作。请看一下。

我想展示一个使用.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]; } } 代码来自文章:。您可以从中获得更多详细信息。

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

自由的 易于安装 直接编码 反应迅速的支持 开发团队非常愿意接受新的建议。新功能和错误修复通常在同一周内实施

晚会迟到了,但我是一个

的粉丝。这种方式是目前为止最快的。当然不是这样,小气鬼。你必须筛选所有的数据,编写蹩脚的数据库代码,手工制作模型,将列映射到属性。最快的办法是让其他可怜的人帮你做这件事。这就是为什么人们使用框架而不是自下而上写所有东西的原因。毫无价值的方法!读取时将文本列截断为255个字符。当心看:ACE引擎做同样的事情!请注意,使用ADO.NET从exel读取数据需要安装Microsoft Access或Microsoft Access Database Engine Redistributable。驱动程序还将根据前几行猜测列类型。如果在第一行中有一列看起来像整数,则在遇到非整数(例如浮点、字符串)时会遇到错误。是,但这将涉及创建Excel.Application实例、加载xls文件、,等等。如果要求纯粹是从文件中读取一些数据,那么使用其他答案中描述的ADO.NET方法就更容易、更轻量级。如果使用Office PIA作为基线,速度太慢,其他一切都会更快-即使只是使用从.Value2属性传递的对象数组。仍然在使用PIA。非常同意切里安。此代码已存在多年。。。在我熟练使用Resharper之前:代码很难看,但它显示了如何获取工作表名称,太棒了!我不会拒绝你,但我最近开始使用FileHelper,并对。。。糟透了。例如,将csv中的列映射到属性的唯一方法。。。对不起,字段,一个模型的作用是按列的顺序创建字段。我不知道你的情况,但我不会依赖编译器的一个怪癖来作为我的f8king框架最核心的设计考虑之一。我怀疑你可以从Excel中保护它,但不能从使用编译器的人那里保护它……就像任何东西一样……它只是字节。@gsvirdi,发布一个关于Excel文件安全性的单独问题,这个问题是关于性能的。这种方法中的Select似乎试图猜测列的数据类型,并强制执行猜测的数据类型。例如,如果有一个列的值大部分为双值,则它不希望您传递x.Field,而是希望传递x.Field。这是真的吗?只是在MSDN上查了一下。看起来只是用于尝试将列中的内容强制转换为类型。在本例中,只需将列中的数据转换为字符串。如果您想要双人,您需要调用double.Parsex.FieldCost或类似的东西。字段是DataRow的扩展方法,看起来没有非泛型版本。向Linq查询添加double.Parse是否会大大降低查询速度?请注意,如果正在阅读xlsx,则需要使用此连接字符串:string.FormatProvider=Microsoft.ACE.OLEDB.12.0;数据源={0};扩展属性=Excel 12.0;,FileName仅Jet.OLEDB驱动程序不兼容64位;如果仍要继续使用此方法,则需要切换到目标x86,而不是任何CPU。或者安装64位ACE驱动程序并更改conn字符串以使用此驱动程序,如Andreas所示-您以上述注释的形式回答了我的问题;它还带来了非常有用的Excel数据驱动测试库,它由我们提供
利用NUnit 2.5的TestCaseSource属性,使用Excel电子表格进行数据驱动的测试变得非常简单。请注意,Resharper还不支持TestCaseSource,因此您必须使用NUnit runner。不幸的是,我们刚刚遇到了这个库的一些问题。首先,我们有一些货币字段显示为日期。其次,如果工作簿中有任何空工作表,则会导致崩溃。所以,虽然整合起来很容易,但我们现在正在重新评估是否继续使用这个库。它似乎没有被积极开发。它还假设xlsx文件中存在一些可选元素,如果这些元素不存在,则会导致xlsx文件无法读取数据。来自SQL Server Reporting Services的Excel文件存在问题。它们就是不起作用,除非你打开它们并保存它们,即使是未经编辑的@RichieHindle:你说的是什么可选元素,希望它能帮助我处理我的SSRS Excel文件?@Peter:我想这是中缺少的元素,给我带来了麻烦。很难证明有这么多简单有效的方法可以免费阅读和编写Excel。@Anonymous type我确实阅读了问题并提供了一个有助于替代理想的OSS实现的方案。。。因为,嗯,我很确定没有什么可用的。而且,根据公认的答案判断,安装Office的要求不是问题。工作表没有定义。。。在清楚地定义了所有其他内容之后,我觉得有点奇怪。这很有帮助,特别是关于读取图纸名称的部分。与NPOIFI相比,它看起来不再特别活跃了:我尝试过,但它不能满足我读取加密文件的需要。这是一个非常棒的小库。它只是将所有内容转换为字符串列表,这对于我需要它的工作来说是很好的。 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]; } }