Answers:
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"),
});
xlsx
,则需要改用以下连接字符串:string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=Excel 12.0;", fileName)
如果只是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 Data Reader怎么样?
http://exceldatareader.codeplex.com/
我曾在生产环境中使用它来将大量数据从各种Excel文件中提取到SQL Server Compact中。它工作得很好,并且非常健壮。
<dimension>
因素,<worksheet>
给我造成了麻烦。
这是几年前我使用.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;
}
}
}
当您确实确实要求.xls时,意味着使用了较旧的文件格式,而对于OpenXML格式(例如xlsx),我强烈建议您使用OpenXML SDK(http://msdn.microsoft.com/zh-cn/library/bb448854.aspx)
ExcelMapper是一个开放源代码工具(http://code.google.com/p/excelmapper/),可用于将Excel工作表读取为强类型对象。它同时支持xls和xlsx格式。
我想展示一种使用.NET读取xls / xlsx文件的简单方法。希望以下内容对您有所帮助。
私有DataTable ReadExcelToTable(字符串路径) { //连接字符串 string connstring =“ Provider = Microsoft.ACE.OLEDB.12.0; Data Source =” + path +“;扩展属性='Excel 8.0; HDR = NO; IMEX = 1';”; //同名 // string connstring = Provider = Microsoft.JET.OLEDB.4.0; Data Source =“ + path + //”;扩展属性='Excel 8.0; HDR = NO; IMEX = 1';“; using(OleDbConnection conn =新的OleDbConnection(connstring)) { conn.Open(); //获取所有工作表名称 DataTablesheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object [] {null,null,null,“ Table”}); //获取第一个工作表名称 字符串firstSheetName = sheetName.Rows [0] [2] .ToString(); //请求参数 字符串sql = string.Format(“ SELECT * FROM [{0}]”,firstSheetName); OleDbDataAdapter ada =新OleDbDataAdapter(sql,connstring); DataSet set = new DataSet(); ada.Fill(set); 返回set.Tables [0]; } }
代码来自文章:http : //www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/。您可以从中获取更多详细信息。
它不是免费的,但是使用最新的Office会有一个非常不错的自动化.Net API。(已经存在API已有很长时间了,但是它却是令人讨厌的COM),而Office应用程序仍然是一个隐藏的后台进程,则可以在代码中完成所有想要/需要的事情。
如果我不在这里,请原谅我,但这不是Office PIA的目的吗?
.NET组件Excel Reader .NET可能满足您的要求。足以读取XLSX和XLS文件。因此,请尝试以下方法:
我建议使用FileHelpers库,它是一个免费且易于使用的.NET库,用于从EXCEL,文件中的定长或定界记录,字符串或流中导入/导出数据,字符串或流以及更多内容。
Excel数据链接文档部分 http://filehelpers.sourceforge.net/example_exceldatalink.html
您可以尝试使用此开放源代码解决方案,该解决方案使与Excel的处理更加简洁。
我们使用的解决方案需要:
有多种选择,但是我们发现NPoi(Java长期存在的Poi开源项目的.NET端口)是最好的:http : //npoi.codeplex.com/
它还允许使用.doc和.ppt文件格式
参加聚会晚了,但我是LinqToExcel的粉丝
您可以编写一个Excel电子表格,该电子表格可以加载给定的Excel电子表格并将其保存为csv(而不是手动执行)。
那么您可以通过c#将其自动化。
并且一旦在csv中,C#程序就可以解决该问题。
(此外,如果有人要求您使用excel编程,最好假装您不知道如何操作)
(编辑:是的,抢劫和瑞安都是对的)
我知道人们为此一直在进行Excel“扩展”。
您或多或少在Excel中创建一个按钮,显示“导出到程序X”,然后以程序可以读取的格式导出并发送数据。
http://msdn.microsoft.com/zh-cn/library/ms186213.aspx应该是一个不错的起点。
祝好运
刚刚做了一个快速演示项目,需要管理一些excel文件。来自GemBox软件的.NET组件足以满足我的需求。它有一个免费版本,但有一些限制。
Excel Package是用于读取/写入Excel 2007文件的开源(GPL)组件。我在一个小项目上使用了它,API很简单。仅适用于XLSX(Excel 200&),不适用于XLS。
源代码看起来也井井有条,易于解决(如果您需要像我一样扩展功能或解决小问题)。
最初,我尝试使用ADO.Net(Excel连接字符串)方法,但此方法充满了讨厌的骇客-例如,如果第二行包含数字,它将为下面列中的所有字段返回整数,并静默删除任何数据那不合适。
我只是使用ExcelLibrary将.xls电子表格加载到DataSet中。对我来说很棒。