Как указано в других ответах, использование двух точек создаст скрытые ссылки, которые нельзя закрыть Marshal.FinalReleaseComObject
. Я просто хотел поделиться своим решением, которое устраняет необходимость запоминать Marshal.FinalReleaseComObject
- это очень легко пропустить, и боль, чтобы найти виновника.
Я использую общий класс оболочки IDisposable, который можно использовать на любом COM-объекте. Он работает как шарм, и он держит все красивым и чистым. Я могу даже повторно использовать частные поля (например, this.worksheet
). Он также автоматически освобождает объект, когда что-то выдает ошибку из-за характера IDisposable (метод Dispose работает как finally
).
using Microsoft.Office.Interop.Excel;
public class ExcelService
{
private _Worksheet worksheet;
private class ComObject<TType> : IDisposable
{
public TType Instance { get; set; }
public ComObject(TType instance)
{
this.Instance = instance;
}
public void Dispose()
{
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(this.Instance);
}
}
public void CreateExcelFile(string fullFilePath)
{
using (var comApplication = new ComObject<Application>(new Application()))
{
var excelInstance = comApplication.Instance;
excelInstance.Visible = false;
excelInstance.DisplayAlerts = false;
try
{
using (var workbooks = new ComObject<Workbooks>(excelInstance.Workbooks))
using (var workbook = new ComObject<_Workbook>(workbooks.Instance.Add()))
using (var comSheets = new ComObject<Sheets>(workbook.Instance.Sheets))
{
using (var comSheet = new ComObject<_Worksheet>(comSheets.Instance["Sheet1"]))
{
this.worksheet = comSheet.Instance;
this.worksheet.Name = "Action";
this.worksheet.Visible = XlSheetVisibility.xlSheetHidden;
}
using (var comSheet = new ComObject<_Worksheet>(comSheets.Instance["Sheet2"]))
{
this.worksheet = comSheet.Instance;
this.worksheet.Name = "Status";
this.worksheet.Visible = XlSheetVisibility.xlSheetHidden;
}
using (var comSheet = new ComObject<_Worksheet>(comSheets.Instance["Sheet3"]))
{
this.worksheet = comSheet.Instance;
this.worksheet.Name = "ItemPrices";
this.worksheet.Activate();
using (var comRange = new ComObject<Range>(this.worksheet.Range["A4"]))
using (var comWindow = new ComObject<Window>(excelInstance.ActiveWindow))
{
comRange.Instance.Select();
comWindow.Instance.FreezePanes = true;
}
}
if (this.fullFilePath != null)
{
var currentWorkbook = (workbook.Instance as _Workbook);
currentWorkbook.SaveAs(this.fullFilePath, XlFileFormat.xlWorkbookNormal);
currentWorkbook.Close(false);
}
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
throw;
}
finally
{
// Close Excel instance
excelInstance.Quit();
}
}
}
}
Я использовал эту технику успешно в прошлом:
Using Excel для генерации Вставляет для SQL Server
(...) Пропуск столбец (или используйте его для примечаний), и затем введите что-то как следующая формула в нем:
="insert into tblyourtablename (yourkeyID_pk, intmine, strval) values ("&A4&", "&B4&", N'"&C4&"')"
Теперь you’ve получил Ваш оператор вставки для таблицы с Вашим первичным ключом (PK), целым числом и строкой unicode. (...)
Самый простой путь состоит в том, чтобы создать вычисляемый столбец в XLS, который генерировал бы синтаксис оператора вставки. Тогда скопируйте, они вставляют в текстовый файл и затем выполняются на SQL. Другие альтернативы должны купить дополнение возможности соединения базы данных для Excel и записать код VBA для выполнения того же.
Я думал бы, что некоторый datbases может импортировать данные из CSV (запятая разделила значения), файлы, которые можно экспортировать из exel. Или по крайней мере это довольно просто в использовании csv синтаксический анализатор (найдите один для Вашего языка, не пытайтесь создать тот сами - это более твердо, чем это смотрит) импортировать его к базе данных.
я не знаком с SQL MS, но меня не удивило бы, если это действительно поддерживает его непосредственно.
В любом случае я думаю, что requrement должен быть то, что структура в листе Exel и таблице базы данных подобна.
Если интерфейс работает способ, которым он действительно длился, я использовал его, можно выбрать регион в Excel, скопировать его, открыть SQL Server и вставить данные в таблицу, как Вы были бы с Доступом.
Или Вы могли установить ссылку ODBC между Excel и SQL Server.
почему не только используют мастер экспорта/импорта в SSMS?
Если у вас есть SQL Server Management Studio, вы можете просто скопировать из Excel и вставить в таблицу в Management Studio с помощью мыши. Просто
Перед тем как сделать это, вы должны сопоставить столбцы между Excel и Management Studio. Кроме того, вы должны поместить все нередактируемые столбцы последними (крайний правый) с помощью конструктора таблиц в Management Studio.
Вся процедура занимает секунды (до установки и запуска ] - не обязательно выполнять) и не требует никаких операторов SQL.
Относительно пустых таблиц базы данных и SSMS v18.1 + .