提问人:dbkk 提问时间:8/19/2008 最后编辑:Chrisdbkk 更新时间:12/23/2012 访问量:530654
从 C 读取 Excel 文件#
Reading Excel files from C#
问:
是否有免费或开源库可以直接从 C# 程序读取 Excel 文件 (.xls)?
它不需要太花哨,只需选择一个工作表并将数据读取为字符串即可。到目前为止,我一直在使用Excel的导出到Unicode文本功能,并解析生成的(制表符分隔)文件,但我想消除手动步骤。
答:
您可以编写一个 Excel 电子表格,该电子表格加载给定的 Excel 电子表格并将其另存为 CSV(而不是手动执行)。
然后,您可以从 C# 中自动执行此操作。
一旦它进入 CSV,C# 程序就可以解决这个问题。
(另外,如果有人要求您在 Excel 中编程,最好假装不知道怎么做)
(编辑:啊,是的,Rob 和 Ryan 都是对的)
我知道人们一直在为此目的制作 Excel“扩展”。
您或多或少地在 Excel 中创建一个按钮,上面写着“导出到程序 X”,然后以程序可以读取的格式导出和发送数据。
http://msdn.microsoft.com/en-us/library/ms186213.aspx 应该是一个很好的起点。
祝你好运
请原谅我是否在这里,但这不正是 Office PIA 的用途吗?
评论
如果只是Excel文件中包含的简单数据,则可以通过 ADO.NET 读取数据。请参阅此处列出的连接字符串:See the connection strings listed here:
http://www.connectionstrings.com/?carrier=excel2007 或 http://www.connectionstrings.com/?carrier=excel
-莱恩
更新:然后你可以通过类似的东西阅读工作表select * from [Sheet1$]
评论
不是免费的,但最新的 Office 有一个非常好的自动化 .Net API。(有一个 API 已经有一段时间了,但很讨厌 COM)你可以在代码中执行任何想要/需要的事情,而 Office 应用仍然是一个隐藏的后台进程。
评论
刚刚做了一个快速演示项目,需要管理一些 excel 文件。GemBox 软件的 .NET 组件足以满足我的需求。它有一个免费版本,但有一些限制。
http://www.gemboxsoftware.com/GBSpreadsheet.htm
评论
这是我几年前使用 .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;
}
}
}
评论
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)
ADO.NET 方法既快速又简单,但它有一些你应该注意的怪癖,特别是关于如何处理数据类型。
这篇优秀的文章将帮助您避免一些常见的陷阱: http://blog.lab49.com/archives/196
评论
不久前,我在 C# 中从 Excel 文件中进行了大量阅读,我们使用了两种方法:
- COM API,您可以在其中直接访问 Excel 的对象,并通过方法和属性操作它们
- 允许像使用数据库一样使用 Excel 的 ODBC 驱动程序。
后一种方法要快得多:通过 COM 读取一个包含 20 列和 200 行的大表需要 30 秒,通过 ODBC 需要半秒。因此,如果您只需要数据,我会推荐数据库方法。
干杯
卡尔
虽然您确实特别要求.xls,这意味着较旧的文件格式,但对于 OpenXML 格式(例如.xlsx),我强烈推荐 OpenXML SDK (http://msdn.microsoft.com/en-us/library/bb448854.aspx)
我推荐 FileHelpers 库,这是一个免费且易于使用的 .NET 库,用于从 EXCEL、文件、字符串或流中的固定长度或分隔记录 + 更多中导入/导出数据。
Excel 数据链接文档部分 http://filehelpers.sourceforge.net/example_exceldatalink.html
评论
最近,部分原因是为了在 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);
}
}
评论
Koogra 是一个用 C# 编写的开源组件,用于读取和写入 Excel 文件。
评论
SpreadsheetGear for .NET 是用于 .NET 的 Excel 兼容电子表格组件。您可以在我们产品页面的右侧查看客户对性能的评价。您可以通过免费的全功能评估自行尝试。
ExcelMapper 是一个开源工具 (http://code.google.com/p/excelmapper/),可用于将 Excel 工作表读取为强类型对象。它支持 xls 和 xlsx 格式。
我刚刚使用 ExcelLibrary 将 .xls 电子表格加载到 DataSet 中。对我来说效果很好。
SmartXLS 是另一个 excel 电子表格组件,它支持 excel 图表、公式引擎的大多数功能,并且可以读/写 excel2007 openxml 格式。
Excel 包是用于读取/写入 Excel 2007 文件的开源 (GPL) 组件。我在一个小项目中使用了它,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 中。它运行良好,而且相当强大。
评论
<dimension>
<worksheet>
.NET 组件 Excel Reader .NET 可以满足您的要求。它足以读取 XLSX 和 XLS 文件。因此,请尝试:
我们使用的解决方案需要:
- 允许读取/写入 Excel 生成的文件
- 性能要快(不像使用 COM)
- 独立于 MS Office(需要在没有安装 MS Office 的客户端的情况下可用)
- 是自由的或开源的(但积极开发)
有几种选择,但我们发现 NPoi(Java 长期存在的 Poi 开源项目的 .NET 端口)是最好的: http://npoi.codeplex.com/
它还允许使用 .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]; } }
代码来自文章:http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/。您可以从中获得更多详细信息。
评论
我们在相当大的系统中使用 ClosedXML。
- 自由
- 易于安装
- 直接编码
- 反应灵敏的支持
- 开发团队对新建议持非常开放的态度。通常,新功能和错误修复会在同一周内实现
聚会迟到了,但我是 LinqToExcel 的粉丝
评论