C# 加载项 Excel:ActiveSheet

C# Add-In Excel : ActiveSheet

对于我的第一个 AddIn Excel,我希望 select sheet 处于活动状态并计算 sheet 中的列和行。

我在自定义功能区中创建了一个按钮。

    private void AddValues_Click(object sender, RibbonControlEventArgs e)
        {  
            int lastRow;
            int lastColonne;

            lastRow = Globals.VATTools.Application.Selection.Rows.Count;
            lastColonne = Globals.VATTools.Application.Selection.Columns.Count;

            System.Windows.Forms.MessageBox.Show("Row : " + lastRow + " " + "Columns : " + lastColonne); 

            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            xlApp.Visible = true;             
            Microsoft.Office.Interop.Excel.Workbook xlWb = xlApp.ActiveWorkbook as Microsoft.Office.Interop.Excel.Workbook;
            Microsoft.Office.Interop.Excel.Worksheet xlSheet = xlWb.ActiveSheet;
            Microsoft.Office.Interop.Excel.Range range = xlSheet.get_Range("A19"); 
            range.Value = "hello world!";
        }

我的第一个问题:return我有 1 列和 1 行。但是在我的 sheet 中,我有 23 列和 17 行。 为什么 return 我的 sheet 中的列数和行数不正确?

第二个问题:ActiveSheet 出现异常:

Microsoft.Office.Interop.Excel.Worksheet xlSheet = xlWb.ActiveSheet;

错误:System.NullReferenceException:'Object reference not set to an instance of an object.'

我不明白为什么会出现这个错误。

谢谢!

第一个问题:

您需要使用工作表对象中的 UsedRange 属性。 选择只会为您提供有关所选单元格的当前部分的信息。

Microsoft.Office.Interop.Excel.Range usedRange = xlSheet.UsedRange;
//To get the number of rows/columns
int totalRows = usedRange.Rows.Count;
int totalColumns = usedRange.Columns.Count;

第二个问题:

由于您编写的是插件,因此无需创建新的 excelApp。 以下代码将使您能够访问您的文档

Microsoft.Office.Interop.Excel.Workbook xlWb = Globals.ThisAddin.Application.ActiveDocument.Workbook;

根据 Rafatic 的回答(第二个问题 - 访问文档),我发现我可以使用以下代码访问工作表。我提到这个是因为 Globals.ThisAddIn.Application.ActiveDocument 似乎不存在。

//using System.Windows.Forms;
//using Excel = Microsoft.Office.Interop.Excel;

Excel.Worksheet xlWb = Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet;

MessageBox.Show(xlWb.Name);
xlWb.Range["A1"].Value = "Hello World!";