簡體   English   中英

Excel.Workbook和Excel.Worksheet的通用方法

[英]Generic method for Excel.Workbook and Excel.Worksheet

我正在編寫一個Excel加載項,對於其中的一項功能,我需要計算一些匯總統計信息。 這些應作為名稱添加到整個Workbook或單個Worksheet 現在,我有兩種方法可以完成每件事。 但是,盡管這兩種方法看起來幾乎完全相同,不同之處在於第一種將名稱添加到工作簿,第二種將名稱添加到工作表。

有沒有一種方法可以使此方法更通用,以便基於傳遞的參數,我可以檢查所提供的工作表是否為null ,如果是,則將其添加到整個工作簿中?

    /// <summary>
    /// Generate dynamic summary statistics as <see cref="Name"/>s in the specified <see cref="Workbook"/>.
    /// </summary>
    /// <param name="range">The <see cref="Range"/> of the data that needs summary statistics.</param>
    /// <param name="doCalculate">Defines which variables in the summary have to be calculated.</param>
    public DynamicSummaryStatistics(Range range, SummaryStatisticsBool doCalculate)
    {
        var book = Globals.ThisAddIn.Application.ActiveWorkbook;
        var name = ((Name)range.Name).Name;
        if (doCalculate.Mean) Mean = book.Names.Add(name + "_MEAN", "=AVERAGE(" + name + ")");
        if (doCalculate.Variance) Variance = book.Names.Add(name + "_VAR", "=VAR.S(" + name + ")");
        if (doCalculate.StdDev) StdDev = book.Names.Add(name + "_STDEV", "=STDEV.S(" + name + ")");
        if (doCalculate.Minimum) Minimum = book.Names.Add(name + "_MINIMUM", "=MIN(" + name + ")");
        if (doCalculate.Quartile1) Quartile1 = book.Names.Add(name + "_QUARTILE1", "=QUARTILE.INC(" + name + ",1)");
        if (doCalculate.Median) Median = book.Names.Add(name + "_MEDIAN", "=MEDIAN(" + name + ")");
        if (doCalculate.Quartile3) Quartile3 = book.Names.Add(name + "_QUARTILE3", "=QUARTILE.INC(" + name + ",3)");
        if (doCalculate.Maximum) Maximum = book.Names.Add(name + "_MAXIMUM", "=MAX(" + name + ")");
        if (doCalculate.InterquartileRange) InterquartileRange = book.Names.Add(name + "_IQR", "=" + Quartile3.Name + "-" + Quartile1.Name);
        if (doCalculate.Skewness) Skewness = book.Names.Add(name + "_SKEW", "=SKEW(" + name + ")");
        if (doCalculate.Kurtosis) Kurtosis = book.Names.Add(name + "_KURT", "=KURT(" + name + ")");
        if (doCalculate.MeanAbsDev) MeanAbsDev = book.Names.Add(name + "_AVEDEV", "=AVEDEV(" + name + ")");
        if (doCalculate.Mode)
        {
            Mode = book.Names.Add(name + "_MODE", "=MODE.SNGL(" + name + ")");
            try
            {
                Globals.ThisAddIn.Application.WorksheetFunction.Mode_Sngl(range);
                HasMode = true;
            }
            catch
            {
                HasMode = false;
            }
        }
        if (doCalculate.Range) Range = book.Names.Add(name + "_RANGE", "=" + Maximum.Name + "-" + Minimum.Name);
        if (doCalculate.Count) Count = book.Names.Add(name + "_COUNT", "=COUNT(" + name + ")");
        if (doCalculate.Sum) Sum = book.Names.Add(name + "_SUM", "=SUM(" + name + ")");
    }

    /// <summary>
    /// Generate dynamic summary statistics as <see cref="Name"/>s in the specified <see cref="Worksheet"/>.
    /// </summary>
    /// <param name="sheet">The <see cref="Worksheet"/> on which the <see cref="Name"/>s should be generated.</param>
    /// <param name="range">The <see cref="Range"/> of the data that needs summary statistics.</param>
    /// <param name="doCalculate">Defines which variables in the summary have to be calculated.</param>
    public DynamicSummaryStatistics(Worksheet sheet, Range range, SummaryStatisticsBool doCalculate)
    {
        var name = ((Name)range.Name).Name;
        if (doCalculate.Mean) Mean = sheet.Names.Add(name + "_MEAN", "=AVERAGE(" + name + ")");
        if (doCalculate.Variance) Variance = sheet.Names.Add(name + "_VAR", "=VAR.S(" + name + ")");
        if (doCalculate.StdDev) StdDev = sheet.Names.Add(name + "_STDEV", "=STDEV.S(" + name + ")");
        if (doCalculate.Minimum) Minimum = sheet.Names.Add(name + "_MINIMUM", "=MIN(" + name + ")");
        if (doCalculate.Quartile1) Quartile1 = sheet.Names.Add(name + "_QUARTILE1", "=QUARTILE.INC(" + name + ",1)");
        if (doCalculate.Median) Median = sheet.Names.Add(name + "_MEDIAN", "=MEDIAN(" + name + ")");
        if (doCalculate.Quartile3) Quartile3 = sheet.Names.Add(name + "_QUARTILE3", "=QUARTILE.INC(" + name + ",3)");
        if (doCalculate.Maximum) Maximum = sheet.Names.Add(name + "_MAXIMUM", "=MAX(" + name + ")");
        if (doCalculate.InterquartileRange) InterquartileRange = sheet.Names.Add(name + "_IQR", "=" + Quartile3.Name + "-" + Quartile1.Name);
        if (doCalculate.Skewness) Skewness = sheet.Names.Add(name + "_SKEW", "=SKEW(" + name + ")");
        if (doCalculate.Kurtosis) Kurtosis = sheet.Names.Add(name + "_KURT", "=KURT(" + name + ")");
        if (doCalculate.MeanAbsDev) MeanAbsDev = sheet.Names.Add(name + "_AVEDEV", "=AVEDEV(" + name + ")");
        if (doCalculate.Mode)
        {
            Mode = sheet.Names.Add(name + "_MODE", "=MODE.SNGL(" + name + ")");
            try
            {
                Globals.ThisAddIn.Application.WorksheetFunction.Mode_Sngl(range);
                HasMode = true;
            }
            catch
            {
                HasMode = false;
            }
        }
        if (doCalculate.Range) Range = sheet.Names.Add(name + "_RANGE", "=" + Maximum.Name + "-" + Minimum.Name);
        if (doCalculate.Count) Count = sheet.Names.Add(name + "_COUNT", "=COUNT(" + name + ")");
        if (doCalculate.Sum) Sum = sheet.Names.Add(name + "_SUM", "=SUM(" + name + ")");
    }

我不是說要使對WorkbookWorksheet的訪問具有通用性,我會說提供允許訪問該WorkbookWorksheetFunc<string, string, Name>會是一個更好的方法。

public DynamicSummaryStatistics(Range range, SummaryStatisticsBool doCalculate)
{
    var functionToRun = (arg1, arg2) => Globals.ThisAddIn.Application.ActiveWorkbook.Names.Add(arg1, arg2);

    this.ComputeDynamicSummaryStatistics(range, doCalculate, functionToRun);
}

public DynamicSummaryStatistics(Worksheet sheet, Range range, SummaryStatisticsBool doCalculate)
{
    var functionToRun = (arg1, arg2) => sheet.Names.Add(arg1, arg2);

    this.ComputeDynamicSummaryStatistics(range, doCalcualte, functionToRun);
}

private void ComputeDynamicSummaryStatistics(Range range, SummaryStatisticsBool doCalculate, Func<string, string, Name> functionToRun)
{
    var name = ((Name)range.Name).Name;
    if(doCalculate.Mean) Mean = functionToRun(name + "_MEAN", "=AVERAGE(" + name + ")");
    if(doCalculate.Variance) Variance = functionToRun(name + "_VAR", "=VAR.S(" + name + ")");
    // etc. etc.
}

所以這就是每次我調用functionToRun函數ComputeDynamicSummaryStatistics我基於哪個構造functionToRun調用sheet.Names.Add(...)Globals.ThisAddIn.Application.ActiveWorkbook.Names.Add(...)被稱為。

該方法完全不知道對WorkbookWorksheet的訪問,現在所關心的只是提供要添加的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM