Как получить доступ к диапазону, выбранному в Excel, через ExcelDNA в C#? - PullRequest
0 голосов
/ 08 апреля 2020

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

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

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 и сохранить эти данные в БД. Мой код может обрабатывать разные данные (одну ячейку или диапазон ячеек).

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

1 Ответ

0 голосов
/ 08 апреля 2020

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

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

например

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);
}
...