Heim > Artikel > Backend-Entwicklung > ADO.NET liest EXCEL-Implementierungscode ((c#))
// Verbindungszeichenfolge
// 连接字符串 string xlsPath = Server.MapPath("~/app_data/somefile.xls"); // 绝对物理路径 string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Extended Properties=Excel 8.0;" + "data source=" + xlsPath; // 查询语句 string sql = "SELECT * FROM [Sheet1$]"; DataSet ds = new DataSet(); OleDbDataAdapter da = new OleDbDataAdapter(sql, connStr); da.Fill(ds); // 填充DataSet // 在这里对DataSet中的数据进行操作 // 输出,绑定数据 GridView1.DataSource = ds.Tables[0]; GridView1.DataBind();
Ganz einfach, oder? ! Alles ist wie der Betrieb einer Datenbank, außer dass Sie Folgendes beachten müssen:
1. Der Datenanbieter verwendet Jet und Sie müssen das Schlüsselwort „Erweiterte Eigenschaften“ angeben, um Excel-spezifische Eigenschaften festzulegen. Verschiedene Versionen von Excel entsprechen unterschiedlichen Eigenschaftswerten: die gültige Excel-Version für den Wert „Erweiterte Eigenschaften“.
Verwenden Sie für Arbeitsmappen von Microsoft Excel 8.0 (97), 9.0 (2000) und 10.0 (2002) Excel 8.0.
Verwenden Sie für Microsoft Excel 5.0- und 7.0 (95)-Arbeitsmappen Excel 5.0.
Für Microsoft Excel 4.0-Arbeitsmappen verwenden Sie Excel 4.0.
Für Microsoft Excel 3.0-Arbeitsmappen verwenden Sie Excel 3.0.
ref:
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/dv_vbcode/html/vbtskcodeexamplereadingexceldataintodataset.asp
2 . Der Datenquellenpfad verwendet den physischen absoluten Pfad (wie Access)
3. Wie verweise ich auf den Tabellennamen?
Ein gültiger Verweis auf eine Tabelle (oder einen Bereich) in einer Excel-Arbeitsmappe.
Um auf eine Reihe vollständig verwendeter Arbeitsblätter zu verweisen, geben Sie den Arbeitsblattnamen gefolgt von einem Dollarzeichen an. Beispiel:
wählen Sie * aus [Blatt1$] aus
Um auf einen bestimmten Adressbereich in einem Arbeitsblatt zu verweisen, geben Sie den Namen des Arbeitsblatts gefolgt von einem Dollarzeichen und dem Bereich an. Beispiel:
wählen Sie * aus [Sheet1$A1:B10] aus
Um auf einen bestimmten Bereich zu verweisen, verwenden Sie den Namen des Bereichs. Beispiel:
select * from [MyNamedRange]
ref:
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/dv_vbcode/ html /vbtskcodeexamplereadingexceldataintodataset.asp
Hinweis:
kann auf drei Objekte in der Excel-Arbeitsmappe verweisen:
• Das gesamte Arbeitsblatt: [Sheet1$], Sheet1 ist der Name des Arbeitsblatts
• Auf dem Arbeitsblatt Benannt Zellbereich: [MyNamedRange] (Das Arbeitsblatt muss nicht angegeben werden, da der benannte Bereich nur in der gesamten XLS-Datei eindeutig sein kann)
XLS-Benennungsmethode: Wählen Sie den Zellbereich》Einfügen》Name》Definition
• Auf der Arbeitsblatt Der unbenannte Zellbereich: [Sheet1$A1:B10]
(Unter den verschiedenen Objekten, die von relationalen Datenbanken bereitgestellt werden (Tabellen, Ansichten, gespeicherte Prozeduren usw.), stellt die Excel-Datenquelle nur Objekte bereit, die Tabellen entsprechen Bestehend aus Arbeitsblättern und definierten benannten Bereichen in der angegebenen Arbeitsmappe. Benannte Bereiche werden als „Tabellen“ und Arbeitsblätter als „Systemtabellen“ betrachtet.
Hinweis:
•Andernfalls muss [] (eckige Klammern) verwendet werden Es wird Folgendes gemeldet:
Syntaxfehler der FROM-Klausel
• Es muss ein $ (Dollarzeichen) folgen, andernfalls wird Folgendes gemeldet:
Microsoft Jet-Datenbankmodul kann Objekt „Sheet2“ nicht finden. Bitte stellen Sie sicher, dass das Objekt existiert und geben Sie seinen Namen und Pfad korrekt ein.
•Wenn der Arbeitsblattname falsch ist oder nicht existiert, wird Folgendes gemeldet:
„Sheet2$“ ist kein gültiger Name. Stellen Sie sicher, dass der Name keine ungültigen Zeichen oder Satzzeichen enthält und dass der Name nicht zu lang ist.
•In So verwenden Sie ADO zum Verarbeiten von Excel-Daten in Visual Basic oder VBA wird erwähnt, dass Sie
~ und „(Tilde und einfache Anführungszeichen) anstelle von [] verwenden können, um ADO zu verwenden. NET-Test war nicht erfolgreich und meldete:
Syntaxfehler der FROM-Klausel
•Beim Verweis auf den Arbeitsblattnamen ([Sheet1$]) geht der Datenanbieter davon aus, dass die Datentabelle ab der nicht leeren Zelle oben links beginnt Das angegebene Arbeitsblattraster wird gestartet. Wenn das Arbeitsblatt beispielsweise bei Zeile 3, Spalte C beginnt, bevor Zeile 3, Spalte C und die Zeilen 1 und 2 alle leer sind, werden nur die Daten ab Zeile 3, Spalte C angezeigt, der maximale Bereich des Finales Tabelle wird verwendet. Endet mit einer nicht leeren Einheit innerhalb;
• Wenn Sie den Bereich genau lesen müssen, sollten Sie daher den benannten Bereich [NamedRange] verwenden oder die Adresse angeben: [Sheet1$A1:C10 ]
4. Wie zitiert man Spaltennamen?
•Gemäß der Standardverbindungszeichenfolge verwendet der Datenanbieter die erste Zeile im gültigen Bereich als Spaltennamen. Wenn eine Zelle in dieser Zeile leer ist, wird sie durch F1 und F2 dargestellt, wobei die Ordnungszahl steht folgt der Zellenname, beginnend mit 1; Wenn Sie möchten, dass die erste Zeile als Daten anstelle von Spaltennamen angezeigt wird, können Sie Folgendes angeben: HDR=NO in der Eigenschaft „Erweiterte Eigenschaften“. Verbindungszeichenfolge.
Der Standardwert ist: HDR=NO. Das Format ist wie folgt:
"Extended Properties= "Excel 8.0;HDR=NO";" +
"data source=" + xlsPath;
Hinweis: Excel 8.0;HDR=NO erfordert die Verwendung von doppelten Anführungszeichen (der Backslash ist hier das Escape in C#)
ms-help://MS. Abschnitt „Verbindung mit Excel herstellen“ in VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/WD_ADONET/html/745c5f95-2f02 -4674-b378-6d51a7ec2490.htm
(Hinweis: In meinem eigenen MSDN-Beispiel ist die Verwendung von zwei doppelten Anführungszeichen falsch und der Test schlägt fehl. Der Originaltext lautet:
In diesem Fall beginnen alle Spaltennamen mit F, gefolgt von Indizes, beginnend mit F1, F2, F3. . . . . . .
5. Warum werden die gültigen Zelldaten nicht angezeigt?
Der mögliche Grund für diese Situation ist, dass der Datenanbieter in der Standardverbindung den Datentyp nachfolgender Zellen basierend auf der vorherigen Zelle ableitet.Sie können den Treiber anweisen, „gemischte“ Datenspalten immer als Text zu lesen, indem Sie IMEX=1
„IMEX=1;“ in den erweiterten Eigenschaften angeben
PS:在baidu这个问题的时候,有网友说,将每个单元都加上引号,这固然是格方案,但是工作量何其大啊,又不零活,庆幸自己找到”治本药方“
more ref:
如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据
http://dotnet.aspx.cc/ShowDetail.aspx?id=C673E2CD-3F1E-4919-8CE0-D69B894A0599
应
用程序经常需要与Excel进行数据交互,以上阐述了基于ADO.NET
读取Excel的基本方法与技巧。现在要介绍是如何动态的读取Excel数据,这里的动态指的是事先不知道Excel文件的是什么样的结构,或者无法预
测,比如一张.xls文件有多少张sheet,而且每张sheet的结构可能都不一样等等。
其实我们可以通过获取Excel的“架构信息”来动态
的构造查询语句。这里的“架构信息”与数据库领域的“数据库架构信息”意义相同(也称“元数据”),对于整个数据库,这些“元数据”通常包括数据库或可通
过数据库中的数据源、表和视图得到的目录以及所存在的约束等;而对于数据库中的表,架构信息包括主键、列和自动编号字段等。
在上文中提到
在关系数据库提供的各种对象中(表、视图、存储过程等),Excel 数据源仅提供相当于表的对象,它由指定工作簿中的工作表和定义的命名区域组成。命名区域被视为“表”,而工作表被视为“系统表”)
这里我们将Excel也当作一个“数据库”来对待,然后利用OleDbConnection.GetOleDbSchemaTable 方法
要获取所需的架构信息,该方法获取的架构信息与ANSI SQl-92是兼容的:
注
意:对于那些不熟悉 OLE DB 架构行集的人而言,它们基本上是由 ANSI SQL-92
定义的数据库构造的标准化架构。每个架构行集具有为指定构造提供定义元数据的一组列(称作 .NET
文档中的“限制列”)。这样,如果请求架构信息(例如,列的架构信息或排序规则的架构信息),则您会明确知道可以得到哪种类型的数据。如果希望了解更多信
息,请访问 Appendix B:Schema Rowsets。
ref:http://www.microsoft.com/china/msdn/library/office/office/odatanet2.mspx?mfr=true
以下是读取Excel文件内“表”定义元数据,并显示出来的的程序片断:
// 读取Excel数据,填充DataSet // 连接字符串 string xlsPath = Server.MapPath("~/app_data/somefile.xls"); string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\";" + // 指定扩展属性为 Microsoft Excel 8.0 (97) 9.0 (2000) 10.0 (2002),并且第一行作为数据返回,且以文本方式读取 "data source=" + xlsPath; string sql_F = "SELECT * FROM [{0}]"; OleDbConnection conn = null; OleDbDataAdapter da = null; DataTable tblSchema = null; IList<string> tblNames = null; // 初始化连接,并打开 conn = new OleDbConnection(connStr); conn.Open(); // 获取数据源的表定义元数据 //tblSchema = conn.GetSchema("Tables"); tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); GridView1.DataSource = tblSchema; GridView1.DataBind(); // 关闭连接 conn.Close(); GetOleDbSchemaTable 方法的详细说明可以参考: http://msdn2.microsoft.com/zh-CN/library/system.data.oledb.oledbconnection.getoledbschematable.aspx 接着是一段利用“架构信息”动态读取Excel内部定义的表单或者命名区域的程序片断: // 读取Excel数据,填充DataSet // 连接字符串 string xlsPath = Server.MapPath("~/app_data/somefile.xls"); string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\";" + // 指定扩展属性为 Microsoft Excel 8.0 (97) 9.0 (2000) 10.0 (2002),并且第一行作为数据返回,且以文本方式读取 "data source=" + xlsPath; string sql_F = "SELECT * FROM [{0}]"; OleDbConnection conn = null; OleDbDataAdapter da = null; DataTable tblSchema = null; IList<string> tblNames = null; // 初始化连接,并打开 conn = new OleDbConnection(connStr); conn.Open(); // 获取数据源的表定义元数据 //tblSchema = conn.GetSchema("Tables"); tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); //GridView1.DataSource = tblSchema; //GridView1.DataBind(); // 关闭连接 //conn.Close(); tblNames = new List<string>(); foreach (DataRow row in tblSchema.Rows) { tblNames.Add((string)row["TABLE_NAME"]); // 读取表名 } // 初始化适配器 da = new OleDbDataAdapter(); // 准备数据,导入DataSet DataSet ds = new DataSet(); foreach (string tblName in tblNames) { da.SelectCommand = new OleDbCommand(String.Format(sql_F, tblName), conn); try { da.Fill(ds, tblName); } catch { // 关闭连接 if (conn.State == ConnectionState.Open) { conn.Close(); } throw; } } // 关闭连接 if (conn.State == ConnectionState.Open) { conn.Close(); } // 对导入DataSet的每张sheet进行处理 // 这里仅做显示 GridView1.DataSource = ds.Tables[0]; GridView1.DataBind(); GridView2.DataSource = ds.Tables[1]; GridView2.DataBind();
这里我们就不需要对SELEC 语句进行“硬编码”,可以根据需要动态的构造FROM 字句的“表名”。
不仅可以,获取表明,还可以获取每张表内的字段名、字段类型等信息:
tblSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, null, null });
在ADO.nET
1.x 时候只有OleDb提供了GetOleDbSchemaTable
方法,而SqlClient或者OrcaleClient没有对应的方法,因为对应数据库已经提供了类似功能的存储过程或者系统表供应用程序访问,比如对
于Sql Server:
SELECT *
FROM Northwind.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'Customers'
而在ADO.NET 2.0中每个xxxConnenction都实现了基类System.Data.Common.DbConnection的 GetSchemal 方法
来获取数据源的架构信息。
http://msdn2.microsoft.com/zh-cn/library/system.data.common.dbconnection.getschema.aspx
//---------------------------------------------------------------------------
//IMEX 正確寫法
string connExcel = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath +";Extended Properties='Excel 8.0;IMEX=1;'"; //HDR=NO;IMEX=1
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Data.OleDb; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { string strconn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + @"D:/last.xls" + ";Extended Properties=Excel 8.0;"; //HDR=no";//IMEX=1 OleDbConnection conn = new OleDbConnection(strconn); DataSet myset = new DataSet(); try { conn.Open(); string mysql = "select * from [Sheet1$] ";//where chs <> '' OleDbDataAdapter aper = new OleDbDataAdapter(mysql, conn); myset.Tables.Clear(); aper.Fill(myset, "book"); conn.Close(); GridView1.DataSource = myset.Tables["book"]; GridView1.DataBind(); } catch (Exception ex) { conn.Close(); this.lb_msg.Text = ex.Message; return; // return ex.Message; } } }
更多ADO.NET 读取EXCEL的实现代码((c#))相关文章请关注PHP中文网!