MS вставки данные Excel к SQL Server

Как указано в других ответах, использование двух точек создаст скрытые ссылки, которые нельзя закрыть 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();
            }
        }
    }
}
65
задан raven 5 November 2009 в 15:30
поделиться

6 ответов

Я использовал эту технику успешно в прошлом:

Using Excel для генерации Вставляет для SQL Server

(...) Пропуск столбец (или используйте его для примечаний), и затем введите что-то как следующая формула в нем:

="insert into tblyourtablename (yourkeyID_pk, intmine, strval) values ("&A4&", "&B4&", N'"&C4&"')"

Теперь you’ve получил Ваш оператор вставки для таблицы с Вашим первичным ключом (PK), целым числом и строкой unicode. (...)

36
ответ дан bzlm 24 November 2019 в 15:23
поделиться

Самый простой путь состоит в том, чтобы создать вычисляемый столбец в XLS, который генерировал бы синтаксис оператора вставки. Тогда скопируйте, они вставляют в текстовый файл и затем выполняются на SQL. Другие альтернативы должны купить дополнение возможности соединения базы данных для Excel и записать код VBA для выполнения того же.

2
ответ дан Dheer 24 November 2019 в 15:23
поделиться

Я думал бы, что некоторый datbases может импортировать данные из CSV (запятая разделила значения), файлы, которые можно экспортировать из exel. Или по крайней мере это довольно просто в использовании csv синтаксический анализатор (найдите один для Вашего языка, не пытайтесь создать тот сами - это более твердо, чем это смотрит) импортировать его к базе данных.

я не знаком с SQL MS, но меня не удивило бы, если это действительно поддерживает его непосредственно.

В любом случае я думаю, что requrement должен быть то, что структура в листе Exel и таблице базы данных подобна.

1
ответ дан Stein G. Strindhaug 24 November 2019 в 15:23
поделиться

Если интерфейс работает способ, которым он действительно длился, я использовал его, можно выбрать регион в Excel, скопировать его, открыть SQL Server и вставить данные в таблицу, как Вы были бы с Доступом.

Или Вы могли установить ссылку ODBC между Excel и SQL Server.

0
ответ дан warren 24 November 2019 в 15:23
поделиться

почему не только используют мастер экспорта/импорта в SSMS?

0
ответ дан Mladen Prajdic 24 November 2019 в 15:23
поделиться

Если у вас есть SQL Server Management Studio, вы можете просто скопировать из Excel и вставить в таблицу в Management Studio с помощью мыши. Просто

  1. Перейдите к таблице, в которую хотите вставить.
  2. Выберите «Редактировать первые 200 строк».
  3. Щелкните правой кнопкой мыши в любом месте и выберите Вставить.

Перед тем как сделать это, вы должны сопоставить столбцы между Excel и Management Studio. Кроме того, вы должны поместить все нередактируемые столбцы последними (крайний правый) с помощью конструктора таблиц в Management Studio.

Вся процедура занимает секунды (до установки и запуска ] - не обязательно выполнять) и не требует никаких операторов SQL.

Относительно пустых таблиц базы данных и SSMS v18.1 + .

65
ответ дан 24 November 2019 в 15:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: