Как получить доступ к диапазону, выбранному в Excel, через ExcelDNA в С#?

Я нуб с ДНК Excel и программированием на С#. Это должен быть один из основных вопросов, и если на SO уже был дан ответ, я был бы более чем счастлив, если бы мне указали в этом направлении. Я пытаюсь отправить любой диапазон или ячейку, которая активна на листе Excel, в соответствующую функцию С# при нажатии кнопки.

Это мой класс контроллера.

using System;
using ExcelDna;
using Excel = Microsoft.Office.Interop.Excel;
//Other dependencies
namespace My_Prj
{
  [ComVisible(true)]
  public class RibbonController : ExcelRibbon
  {
     return @"
     <customUI xmlns='http://schemas.microsoft.com/office/2006/01/customui'>
  <ribbon>
    <tabs>
      <tab id='tab1' label='Temp Tab'>
        <group id='group1' label='Temp Group'>
          <button id='button1' label='Attach Db' onAction='OnButton1Pressed'/>
          <button id='button2' label='Detach Db' onAction='OnButton2Pressed'/>
          <button id='button3' label='Write Data'   onAction='OnButton3Pressed'/>
        </group >
      </tab>
    </tabs>
  </ribbon>
</customUI>";
 }
public void OnButton1Pressed(IRibbonControl control)
    {
        bool status = Main.Attach();
        //+control.Id
        MessageBox.Show("DB session Attach status: [" + status + "] ");
    }
    public void OnButton2Pressed(IRibbonControl control)
    {
        bool status = Main.Detach();
        MessageBox.Show("DB session Detach status: [" + status + "]");
    }
    public void OnButton3Pressed(IRibbonControl control)
    {
        // Code to access range

    }

Это мой основной класс.

using System;
using ExcelDna;
using Excel = Microsoft.Office.Interop.Excel;
// Other dependencies
namespace My_Prj
{
   public class Main
   {
      // Class variables
      [ExcelFunction(Category = "Main", Description = "Attach DB", Name = "Attach_DB")]
      public static bool Attach()
      {
        //Connect to DB;
        return status;
      }
      [ExcelFunction(Category = "Main", Description = "Detach DB", Name = "Detach_DB")]
      public static bool Detach()
      {
        //Disconnect from DB;
        return status;
      }
      [ExcelFunction(Category = "Main", Description = "Write Data", Name = "Write_Data")]
      public static bool WriteData(Object[,] data)
      {
        //Write data;
      }
  }
}

Очевидно, что если я вызову функцию Write_Data из Excel и выберу диапазон, я смогу сохранить данные в БД. Моя цель - нажать третью кнопку после выбора диапазона или ячейки в Excel и сохранить эти данные в БД. Мой код может обрабатывать разные данные (либо одну ячейку, либо диапазон ячеек).

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.


person Sree Sake    schedule 08.04.2020    source источник


Ответы (1)


Из обработчиков событий ленты вы можете получить доступ к Excel COM API через ExcelDnaUtil.Application, получить ссылку на активный лист, получить выбранный диапазон и проверить его значения.

Установите пакет NuGet ExcelDna.Interop, чтобы упростить его (чтобы вы могли получить IntelliSense ) и используйте экземпляр ExcelDnaUtil.Application для доступа к COM API.

e.g.

try
{
    var excelApp = (Microsoft.Office.Interop.Excel.Application)ExcelDnaUtil.Application;

    // Use excelApp to access the selected sheet, range, etc.
    // the same way you would do with VBA
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
person C. Augusto Proiete    schedule 08.04.2020
comment
Не могли бы вы предоставить подробную информацию о точном API, который даст выбранный диапазон? Я пробовал Excel.Application excelApp = (Excel.Application) ExcelDnaUtil.Application; Excel.Range range = excelApp.ActiveCell; dynamic data = (Object[,])range.Value2;, но у меня есть исключение времени выполнения, говорящее Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: «Невозможно преобразовать тип «строка» в «объект [, - person Sree Sake; 10.04.2020
comment
Большое спасибо, я разобрался с API, но по какой-то странной причине приведенный двумерный массив начинается с [1,1]. Я всегда думал, что массивы инициализируются начальными индексами [0,0] - person Sree Sake; 10.04.2020
comment
@SreeSake Да, это характеристика объектной модели Excel, и она задумана. Вы используете массив для доступа к Range объектам, которые напрямую сопоставляются со строками и столбцами Excel. Строки и столбцы в Excel начинаются с 1 (т.е. в Excel нет строки 0) - person C. Augusto Proiete; 10.04.2020