Существует поставщик ADO.NET для Excel.
Это означает, что если у вас есть набор данных, вы можете использовать два адаптера данных для перемещения данных из одного места в другое: из Oracle в Excel, из SQL в Excel, из Excel в Oracle и т. Д.
Заполните DataSet из источника первым DA, затем обновите место назначения вторым DA. DataAdapters не обязательно должны быть одного типа - вы можете использовать любой из OleDbDataAdapter, SqlDataAdapter, OracleDataAdapter и т. Д. Как для чтения, так и для обновления.
Нет необходимости возиться с форматированием CSV или XML. Нет необходимости использовать Office Automation, поэтому нет 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 Automation на сервере, не применяются.
Вы можете начать с существующего файла XLS (или XLSX) и просто указать именованный диапазон. Это дает вам возможность применить форматирование и т. Д. До вставки данных ilve. По сути, существующий файл XLS является шаблоном.
Или вы можете начать с нуля и создать файл XLS и таблицу / диапазон в файле XLS, полностью динамически, во время выполнения. В этом случае файл XLS будет довольно ванильным / простым. Нет форматирования, цветов, формул и тд.