从C#读取Excel文件
是否有免费或者开放源代码库可直接从C程序读取Excel文件(.xls)?
不必太花哨,只需选择一个工作表并以字符串形式读取数据即可。到目前为止,我一直在使用Excel的"导出到Unicode文本"功能,并分析生成的(制表符分隔)文件,但是我想消除手动步骤。
解决方案
回答
我们可以编写一个Excel电子表格,该电子表格可以加载给定的Excel电子表格并将其保存为csv(而不是手动执行)。
那么我们可以通过c#将其自动化。
而一旦将其放入csv中,则cprogram可以取消该操作。
(此外,如果有人要求我们使用excel编程,最好假装我们不知道如何操作)
(编辑:是的,抢劫和瑞安都是对的)
回答
我知道人们为此一直在进行Excel"扩展"。
我们或者多或者少在Excel中创建一个按钮,将其显示为"导出到程序X",然后以程序可以读取的格式导出并发送数据。
http://msdn.microsoft.com/zh-cn/library/ms186213.aspx应该是一个不错的起点。
祝你好运
回答
如果我不在这里,请原谅我,但这不是Office PIA的目的吗?
回答
如果只是Excel文件中包含的简单数据,则可以通过ADO.NET读取数据。请参阅此处列出的连接字符串:
http://www.connectionstrings.com/?carrier=excel2007
或者
http://www.connectionstrings.com/?carrier=excel
-瑞安
更新:然后我们可以通过"从[Sheet1 $]中选择*"来读取工作表。
回答
它不是免费的,但是使用最新的Office会有一个非常不错的自动化.Net API。 (已经存在API已有很长时间了,但COM却很讨厌),而Office应用程序仍然是一个隐藏的后台进程,则可以在代码中完成所有想要/需要的事情。
回答
刚刚做了一个快速演示项目,需要管理一些excel文件。来自GemBox软件的.NET组件足以满足我的需求。它有一个免费版本,但有一些限制。
http://www.gemboxsoftware.com/GBSpreadsheet.htm
回答
这是几年前我在Cusing .NET 1.1中编写的一些代码。不知道这是否正是我们所需要的(可能不是我最好的代码:)。
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; } } }
回答
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"), });
回答
ADO.NET方法快速简便,但是我们需要注意一些怪癖,特别是关于如何处理数据类型。
这篇出色的文章将避免一些常见的陷阱:
http://blog.lab49.com/archives/196
回答
之前,我从Ca中的Excel文件中进行了大量读取,我们使用了两种方法:
- COM API,我们可以在其中直接访问Excel的对象并通过方法和属性对其进行操作
- 允许像数据库一样使用Excel的ODBC驱动程序。
后一种方法要快得多:通过COM读取包含20列和200行的大表将花费30秒,而通过ODBC则需要半秒。因此,如果我们需要的只是数据,我建议使用数据库方法。
干杯,
卡尔
回答
虽然我们确实确实要求.xls,这意味着较旧的文件格式,但对于OpenXML格式(例如xlsx),我强烈建议我们使用OpenXML SDK(http://msdn.microsoft.com/zh-cn/library/bb448854.aspx)
回答
我建议使用FileHelpers库,它是一个免费且易于使用的.NET库,用于从EXCEL,文件中的定长或者定界记录,字符串或者流中导入/导出数据,字符串或者流以及更多内容。
Excel数据链接文档部分
http://filehelpers.sourceforge.net/example_exceldatalink.html
回答
最近,部分是为了使LINQ更好。...我一直在使用Excel的自动化API将文件另存为XML Spreadsheet,然后使用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); } }
回答
Koogra是用C编写的开源组件,可读取和写入Excel文件。
回答
SpreadsheetGear for .NET是Excel的.NET兼容电子表格组件。我们可以在我们产品页面的右侧看到客户对性能的评价。我们可以免费试用功能齐全的评估版。
回答
ExcelMapper是一个开放源代码工具(http://code.google.com/p/excelmapper/),可用于将Excel工作表作为强类型对象读取。它同时支持xls和xlsx格式。
回答
我只是使用ExcelLibrary将.xls电子表格加载到DataSet中。对我来说很棒。
回答
SmartXLS是另一个excel电子表格组件,它支持excel图表的大多数功能,公式引擎,并且可以读取/写入excel2007 openxml格式。
回答
Excel Package是一个开放源代码(GPL)组件,用于读取/写入Excel 2007文件。我在一个小项目上使用了它,API很简单。仅适用于XLSX(Excel 200&),不适用于XLS。
源代码似乎也井井有条,易于解决(如果我们需要像我一样扩展功能或者解决小问题)。
最初,我尝试使用ADO.Net(Excel连接字符串)方法,但是这种方法充满了讨厌的骇客-例如,如果第二行包含数字,它将为下面列中的所有字段返回整数,并静默删除所有不适合。
回答
我们可以尝试使用此开放源代码解决方案,该解决方案使与Excel的处理更加简洁。
http://excelwrapperdotnet.codeplex.com/
回答
SpreadsheetGear很棒。是的,这是一种支出,但是与花钱与其他解决方案相比,这是值得的。它快速,可靠,非常全面,我必须说在我的全职软件工作中使用此产品一年半之后,他们的客户支持非常棒!
回答
Excel Data Reader怎么样?
http://exceldatareader.codeplex.com/
我曾在生产环境中使用它来将大量数据从各种Excel文件中提取到SQL Server Compact中。它工作得很好,并且相当健壮。