将一个System.Data.DataSet导入Excel最简单的方法是什么?

在.NET 2.0中(在这种情况下VB),是否有一个标准的API,将一个DataSet对象序列化成一个stream,可以保存为制表符分隔的文件,并直接在Excel中打开? 还是必须通过遍历表集合的成员手动创build分隔文件?

在这种情况下,DataSet的小,由大约10个数据表组成,每个数据表有一到几十行。 我只是想知道是否有一个内置的机制来处理这种情况,因为我认为这是一个相对常见的机制。

理想情况下,我希望能够在一次点击中全部返回它 – 例如,客户端单击“生成报告”button,组装报告,并返回包含格式化数据的Response对象,提示保存或打开等(我宁愿不要他们下载一个文件,然后导入它,因为这似乎是一个不必要的繁琐的可用性)。

有一个Excel的ADO.NET提供程序。 这意味着,如果您有数据集,则可以使用两个DataAdapter将数据从一个地方移动到另一个地方:从Oracle到Excel,从SQL到Excel,从Excel到Oracle等。

使用第一个DA从源填充数据集,然后使用第二个DA更新目标。 DataAdapter不需要是相同的types – 您可以使用OleDbDataAdapter,SqlDataAdapter,OracleDataAdapter等的任何读取和更新。

无需摆弄CSV或XML格式。 不需要使用Office自动化,所以没有PIA,它在服务器上工作。 这只是ADO.NET。

要连接到Excel,请使用Microsoft.Jet.OLEDB oledb提供程序。

完整的示例源码 。

摘抄:

System.Data.DataSet ds1; const string ConnStringSql= "Provider=sqloledb;Data Source=dinoch-8;Initial Catalog=Northwind;Integrated Security=SSPI;" ; const string OutputFilename= "ExtractToExcel.xls"; const string ConnStringExcel= "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + OutputFilename + ";" + "Extended Properties=\"Excel 8.0;HDR=yes;\""; // FIRSTROWHASNAMES=1;READONLY=false\" const string sqlSelect="SELECT top 10 ProductId, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, GETDATE() as Extracted from Products order by UnitPrice"; const string sqlInsert="INSERT INTO Extracto (ProductId, ProductName, QuantityPerUnit, UnitPrice, UnitsInStock, Extracted) VALUES (@ProductId, @ProductName, @QuantityPerUnit, @UnitPrice, @UnitsInStock, @Extracted)"; private void ReadFromSql() { var ConnSql= new System.Data.OleDb.OleDbConnection(ConnStringSql); var da1 = new System.Data.OleDb.OleDbDataAdapter(); da1.SelectCommand= new System.Data.OleDb.OleDbCommand(sqlSelect); da1.SelectCommand.Connection= ConnSql; ds1= new System.Data.DataSet(); da1.Fill(ds1, "Extracto"); } private void InsertIntoExcel() { // need to update the row so the DA does the insert... foreach (System.Data.DataRow r in ds1.Tables[0].Rows) { r.SetModified(); // mark the row as updated to force an insert } var da2 = new System.Data.OleDb.OleDbDataAdapter(); da2.UpdateCommand= new System.Data.OleDb.OleDbCommand(sqlInsert); da2.UpdateCommand.Connection= ConnExcel; da2.UpdateCommand.Parameters.Add("@ProductId", System.Data.OleDb.OleDbType.Integer, 4, "ProductId"); da2.UpdateCommand.Parameters.Add("@ProductName", System.Data.OleDb.OleDbType.VarWChar, 40, "ProductName"); da2.UpdateCommand.Parameters.Add("@QuantityPerUnit", System.Data.OleDb.OleDbType.VarWChar, 20, "QuantityPerUnit"); da2.UpdateCommand.Parameters.Add("@UnitPrice", System.Data.OleDb.OleDbType.Currency, 8, "UnitPrice"); da2.UpdateCommand.Parameters.Add("@UnitsInStock", System.Data.OleDb.OleDbType.SmallInt, 2, "UnitsInStock"); da2.UpdateCommand.Parameters.Add("@Extracted", System.Data.OleDb.OleDbType.Date, 8, "Extracted"); da2.Update(ds1, "Extracto"); } 

这不是Excel自动化,所以适用于在服务器上使用Excel自动化的警告不适用。

您可以从现有的XLS文件(或XLSX)开始,只需填写一个命名范围即可。 在插入ilve数据之前,这使您有机会应用格式化等。 实质上,现有的XLS文件是一个模板。
或者,您可以从头开始,在运行时完全dynamic地创buildXLS文件,以及XLS文件中的表/范围。 在这种情况下,XLS文件将是相当香草/平原。 没有格式,颜色,公式等。

DataSet.writeXML(Stream)然后,您可以将XML文件导入到Excel中

你也可以看看这个工具来为你做。

您也可以使用简单的HTML表格标签(或gridview)在您的.aspx页面的HTML中创build一个表格,然后在您的代码隐藏文件中在您的page.load中包含此行:

 Response.ContentType = "application/vnd.ms-excel" 

请享用 :)

将数据集Serilize到XML DataSet.WriteXML ,您可以创build一个Xsl将其转换为CSV (您可以使用XslTransform来将xml转换为xsl)

编辑:其他选项是直接将其转换为CSV

 Sub DataTable2CSV(ByVal table As DataTable, ByVal filename As String) DataTable2CSV(table, filename, vbTab) End Sub Sub DataTable2CSV(ByVal table As DataTable, ByVal filename As String, _ ByVal sepChar As String) Dim writer As System.IO.StreamWriter Try writer = New System.IO.StreamWriter(filename) ' first write a line with the columns name Dim sep As String = "" Dim builder As New System.Text.StringBuilder For Each col As DataColumn In table.Columns builder.Append(sep).Append(col.ColumnName) sep = sepChar Next writer.WriteLine(builder.ToString()) ' then write all the rows For Each row As DataRow In table.Rows sep = "" builder = New System.Text.StringBuilder For Each col As DataColumn In table.Columns builder.Append(sep).Append(row(col.ColumnName)) sep = sepChar Next writer.WriteLine(builder.ToString()) Next Finally If Not writer Is Nothing Then writer.Close() End Try End Sub 

除非你真的需要纯粹的Excel格式