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

Chr*_*ato 2 .net excel serialization dataset

在.NET 2.0(在本例中为VB)中,是否有一个标准API可以将DataSet对象序列化为可以保存为制表符分隔文件并直接在Excel中打开的流?或者是否必须通过迭代表集合的成员来手动创建分隔文件?

在本例中,DataSet 很小,由大约 10 个 DataTable 组成,每个 DataTable 包含一到几十行。我只是想知道是否有一种内置机制可以处理这种情况,因为我认为这是一种相对常见的机制。

理想情况下,我希望能够通过一次单击返回所有内容 - 例如,客户端单击生成报告按钮,我组装报告,并返回包含格式化数据的响应对象,提示保存或打开等(我不想让他们下载文件然后导入它,因为这在可用性方面似乎不必要地麻烦。)

Che*_*eso 5

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

使用第一个 DA 填充源中的 DataSet,然后使用第二个 DA 更新目标。DataAdapter 不需要是相同的类型 - 您可以使用 OleDbDataAdapter、SqlDataAdapter、OracleDataAdapter 等中的任何一个来进行读取和更新。

无需摆弄 CSV 或 XML 格式。无需使用办公自动化,因此无需 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");
}
Run Code Online (Sandbox Code Playgroud)

这不是 Excel 自动化,因此适用于在服务器上使用 Excel 自动化的注意事项不适用。

您可以从现有的 XLS 文件(或 XLSX)开始,然后只需填写命名范围。这使您有机会在插入数据之前应用格式设置等。本质上,现有的 XLS 文件是一个模板。
或者,您可以从零开始并在运行时完全动态地创建 XLS 文件以及 XLS 文件中的表/范围。在这种情况下,XLS 文件将非常普通/简单。没有格式、颜色、公式等。