Chr*_*ato 2 .net excel serialization dataset
在.NET 2.0(在本例中为VB)中,是否有一个标准API可以将DataSet对象序列化为可以保存为制表符分隔文件并直接在Excel中打开的流?或者是否必须通过迭代表集合的成员来手动创建分隔文件?
在本例中,DataSet 很小,由大约 10 个 DataTable 组成,每个 DataTable 包含一到几十行。我只是想知道是否有一种内置机制可以处理这种情况,因为我认为这是一种相对常见的机制。
理想情况下,我希望能够通过一次单击返回所有内容 - 例如,客户端单击生成报告按钮,我组装报告,并返回包含格式化数据的响应对象,提示保存或打开等(我不想让他们下载文件然后导入它,因为这在可用性方面似乎不必要地麻烦。)
有一个适用于 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 文件将非常普通/简单。没有格式、颜色、公式等。
| 归档时间: |
|
| 查看次数: |
8433 次 |
| 最近记录: |