最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C#實現(xiàn)解析Excel公式

 更新時間:2024年02月27日 09:36:02   作者:葡萄城官網  
在日常工作中,我們經常需要在Excel中使用公式對表中數(shù)據(jù)進行計算和分析,所以本文小編主要來和大家介紹一下如何在C#中實現(xiàn)解析Excel公式,感興趣的可以了解下

前言

在日常工作中,我們經常需要在Excel中使用公式對表中數(shù)據(jù)進行計算(求和、求差和求均值等)和分析,從而實現(xiàn)對數(shù)據(jù)的分類,通常情況下,當數(shù)據(jù)量較少或場景變化單一的情況下,使用公式可以滿足用戶的要求,但當數(shù)據(jù)量較大或者場景變化復雜的情況下,使用公式也無法滿足用戶的需求的情況。這個時候就可以用編碼的方式來解決,以下面的背景需求為例,小編將為大家介紹如何使用葡萄城公司基于 .NET 和 .NET Core 平臺的服務端高性能表格組件組件GrapeCity Documents for Excel (以下簡稱GcExcel)解析Excel中的現(xiàn)有公式并根據(jù)需求對其進行修改。

背景需求

下圖是一張銷售數(shù)據(jù)表,左側顯示原始銷售數(shù)據(jù),包括銷售代表的姓名、地區(qū)、產品和銷售數(shù)量,右側顯示了從原始數(shù)據(jù)中提取的特定的銷售代表對應的銷售分析結果,以及每個產品區(qū)域組合的月度銷售目標進度。目標進度的標準如下:

低于 2500:低于目標

超過 3000:達到目標

超過 5000:高于目標

一般情況下,我們使用Excel中的 IF、ISNUMBER 和 FILTER 函數(shù)就可以實現(xiàn)將左側的銷售原始數(shù)據(jù)轉化為右側的銷售分析結果,如下所示:

=IF(ISNUMBER(FILTER(A2:D19,A2:A19="Fritz")),IFS(FILTER(A2:D19,A2:A19="Fritz")>5000,"Above Target",FILTER(A2:D19,A2:A19="Fritz")>3000,"On Target",FILTER(A2:D19,A2:A19="Fritz")<2500,"Below Target"),FILTER(A2:D19,A2:A19="Fritz"))

但是這樣的話就會出現(xiàn)一個問題,對于不同的人名,小編需要將上面公式中銷售代表的姓名進行替換,也就是需要不斷地手動改變姓名執(zhí)行操作,這一舉動不僅枯燥,而且很容易出錯。因此這個時候就可以使用GcExcel通過解析公式并使用解析的語法樹輕松替換銷售代表姓名,可以簡化此任務。

使用 C# 解析和修改 Excel 公式

首先,創(chuàng)建一個新的 C#(.NET Core) 項目,并使用NuGet 包管理器安裝 GcExcel 包,然后按照前面的步驟操作。

1、使用示例數(shù)據(jù)初始化工作簿

實例化 Workbook 類的實例并從 Excel 文件導入示例數(shù)據(jù),如下所示。

//Create a new workbook
var workbook = new GrapeCity.Documents.Excel.Workbook();           
//Load sample data from excel file
workbook.Open("SampleData.xlsx");
//Enable dynamic array formula
workbook.AllowDynamicArray = true;

2、提取公式

在工作簿加載示例數(shù)據(jù)和預期公式后,我們從工作表中提取所需的公式,以便使用 Formula 屬性進行解析和修改。

GcExcel API 提供的公式解析器希望傳遞的公式不帶“=”(等于)運算符,以便成功進行公式解析。因此,請注意如何在不使用“=”運算符的情況下提取公式。

//Fetch worksheet
var worksheet = workbook.Worksheets[0];
//Fetch the original formula which needs to be parsed.
var originalFormula = worksheet.Range["H3"].Formula.Substring(1);

3、解析公式

調用 FormulaSynatxTree 類的 Parse 方法來解析公式并生成語法樹,幫助您理解公式包含的所有不同類型的值、運算符和函數(shù)。

公式語法樹的每個標記都由 GcExcel API 中的其他類表示,例如函數(shù)的 FunctionNode、運算符的 OperatorNode 等。

下面的代碼解析了上一步中提取的銷售分析公式。然后,它將生成的 FormulaSyntaxTree 中的值附加到工作簿,該工作簿隨后保存為 Excel 文件,以幫助您了解公式的語法樹。

//Method to parse a formula and print the syntax tree
public static void ParseAndPrint(IWorksheet worksheet, string formula)
{
   // Get syntax tree
   var syntaxTree = FormulaSyntaxTree.Parse(formula);

   // Flatten nodes
   var displayItems = new List<(string TypeName, int IndentLevel, string Content)>();

   void flatten(SyntaxNode node, int level)
   {
      displayItems.Add((node.GetType().Name, level, node.ToString()));
      foreach (var child in node.Children)
      {
         flatten(child, level + 1);
      }
   }

   flatten(syntaxTree.Root, 0);

   // Output          
   worksheet.ShowRowOutline = false;
   worksheet.OutlineColumn.ColumnIndex = 1;

   // Header
   worksheet.Range["A1"].Value = "Formula";
   worksheet.Range["A3"].Value = "Syntax node";
   worksheet.Range["B3"].Value = "Part";

   // Values
   worksheet.Range["B1"].Value = "'=" + formula;
   for (var i = 0; i < displayItems.Count; i++)
   {
      var item = displayItems[i];
      var text = "'" + item.TypeName;

      worksheet.Range[i + 4, 0].Value = text;
      worksheet.Range[i + 4, 0].IndentLevel = item.IndentLevel;
      worksheet.Range[i + 4, 1].Value = "'" + item.Content;
   }

   //Apply styling
   worksheet.Range["A1:B3"].Interior.Color = System.Drawing.Color.FromArgb(68, 114, 196);
   worksheet.Range["A1:B3"].Font.Color = System.Drawing.Color.White;
   worksheet.Range["A1:B3"].Borders.Color = System.Drawing.Color.FromArgb(91, 155, 213);
   worksheet.Range["A1:B3"].Borders.LineStyle = BorderLineStyle.Thin;
   worksheet.Range["A1,A3,B3"].Font.Size = 14;
   worksheet.Range["A1,A3,B3"].Font.Bold = true;
   worksheet.Range["A:C"].EntireColumn.AutoFit();           
}

下圖是生成的 FormulaSyntaxTree 的效果圖圖。請注意,這只是完整語法樹的一部分:

4、修改公式

從上一步生成的語法樹中,您可以看到銷售代表姓名以 TextNode 形式表示,并且在公式中多次出現(xiàn)。我們可以通過簡單的查找和替換操作來替換所有這些出現(xiàn)的情況,如下面的代碼所示:

  • 了替換公式中的銷售代表姓名,我們從他們的姓名列表開始。我們使用 UNIQUE 函數(shù)從原始數(shù)據(jù)中過濾掉唯一名稱列表。然后使用這個 UNIQUE 函數(shù)的結果來解析和修改所有銷售代表的銷售分析公式。
  • 我們使用 TextNode 類修改銷售代表姓名。下面的代碼初始化 TextNode 類的實例,并將要在公式中搜索的銷售代表姓名作為參數(shù)傳遞。該實例可以稱為查找節(jié)點。
  • 接下來,我們初始化 TextNode 類的另一個實例,并將公式中要替換的銷售代表姓名作為參數(shù)傳遞。該實例可以稱為替換節(jié)點。
  • 下面的代碼中定義了一個遞歸函數(shù) replaceNode,用于遍歷語法樹的所有子節(jié)點,并將每個出現(xiàn)的 Find 節(jié)點替換為 Replace 節(jié)點。每個銷售代表都會重復此操作。
  • 修改公式后,新公式將分配給工作表中的單元格以生成預期的銷售報告。

下面的代碼包含一些格式化代碼來格式化銷售報告內容。

//Method to parse and modify the formula
public static void ModifyFormula(IWorksheet worksheet, string originalFormula)
{
    //Apply UNIQUE formula to get unique sales representatives list
    worksheet.Range["F1"].Value = "Unique Rep";
    worksheet.Range["F2"].Formula = "=UNIQUE(A2:A19)";
    var uniqueRep = worksheet.Range["F2#"];
    // Apply Styling
    worksheet.Range["F:F"].EntireColumn.AutoFit();
    worksheet.Range["F1"].Interior.Color = System.Drawing.Color.FromArgb(68, 114, 196);
    worksheet.Range["F1"].Font.Color = System.Drawing.Color.White;
    worksheet.Range["F2#"].Borders.Color = System.Drawing.Color.FromArgb(91, 155, 213);
    worksheet.Range["F2#"].Borders.LineStyle = BorderLineStyle.Thin;

    //Get syntax tree
    var syntaxTree = FormulaSyntaxTree.Parse(originalFormula);

    //Find
    var findText = new TextNode("Fritz");

    //Replacement
    var replaceText = new TextNode("");

    //Loop through names list to modify the formula for each sales representative
    for (int r = 0, resultRow = 3; r < uniqueRep.Cells.Count; r++, resultRow = resultRow + 4)
    {
       //Get name to be replaced in the formula
       var cval = uniqueRep.Cells[r].Value.ToString();

       if (findText.Value != cval)
       {
          //Assign name to be replaced to Replace TextNode
          replaceText.Value = cval;

          //Invoke the recursive method to perform find and replace operation
          replaceNode(syntaxTree.Root, findText, replaceText);

          //Assign the modified formula to a cell in the worksheet
          var resultRange = "H" + resultRow.ToString();
          worksheet.Range[resultRange].Formula = "=" + syntaxTree.ToString();
          worksheet.Range[resultRange + "#"].Borders.Color = System.Drawing.Color.FromArgb(91, 155, 213);
          worksheet.Range[resultRange + "#"].Borders.LineStyle = BorderLineStyle.Thin;

          //Update the value of Find node to perform find and replace operation for next sales representative name
          findText = replaceText;
       }
    }

    //Find and replace
    void replaceNode(SyntaxNode lookIn, SyntaxNode find, SyntaxNode replacement)
    {
       var children = lookIn.Children;

       for (var i = 0; i < children.Count; i++)
       {
          var child = children[i];
          if (child.Equals(find))
          {
             children[i] = replacement;
          }
          else
          {
             replaceNode(child, find, replacement);
          }
       }
    }
 }

這是修改后的公式之一:

=IF(ISNUMBER(FILTER(A2:D19,A2:A19="Xi")),IFS(FILTER(A2:D19,A2:A19="Xi")>5000,"Above Target",FILTER(A2:D19,A2:A19="Xi")>3000,"On Target",FILTER(A2:D19,A2:A19="Xi")<2500,"Below Target"),FILTER(A2:D19,A2:A19="Xi"))

5、保存 Excel 文件

將所有修改的公式添加到工作表后,將調用 Workbook 類的 Save 方法來保存 Excel 文件,如下面的代碼所示:

//Save modified Excel file
workbook.Save("ModifiedFormula.xlsx", SaveFileFormat.Xlsx);

打開保存的 Excel 文件可以看到下圖:

到此這篇關于使用C#實現(xiàn)解析Excel公式的文章就介紹到這了,更多相關C#解析Excel公式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用C#發(fā)送帶附件的電子郵件的方法的代碼示例分析

    使用C#發(fā)送帶附件的電子郵件的方法的代碼示例分析

    這篇文章主要介紹了使用C#發(fā)送帶附件的電子郵件的方法的代碼示例分析,文中還提到了利用163的SMTP服務器發(fā)郵件的方法,需要的朋友可以參考下
    2016-02-02
  • 基于WPF實現(xiàn)代碼查看器控件

    基于WPF實現(xiàn)代碼查看器控件

    這篇文章主要為大家詳細介紹了WPF如何實現(xiàn)代碼查看器控件,文中的示例代碼講解詳細,對我們學習或工作有一定幫助,感興趣的小伙伴可以了解一下
    2022-11-11
  • C# 打開藍牙設置界面的兩種方法

    C# 打開藍牙設置界面的兩種方法

    這篇文章主要介紹了C# 打開藍牙設置界面的兩種方法,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#實現(xiàn)封面圖片生成器的示例代碼

    C#實現(xiàn)封面圖片生成器的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)簡單的封面圖片生成器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C#使用GDI繪制矩形的方法

    C#使用GDI繪制矩形的方法

    這篇文章主要介紹了C#使用GDI繪制矩形的方法,涉及C#使用GDI繪圖的相關技巧,需要的朋友可以參考下
    2015-04-04
  • C#中弱引用使用小結

    C#中弱引用使用小結

    弱引用是一種不會阻止垃圾回收的對象引用,適用于緩存和事件監(jiān)聽等場景,但需注意其不確定性和潛在的性能影響,下面就來詳細的介紹C#中弱引用使用小結,感興趣的可以了解一下
    2025-12-12
  • Unity實現(xiàn)倒計時組件

    Unity實現(xiàn)倒計時組件

    這篇文章主要介紹了Unity實現(xiàn)倒計時組件的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • c# TreeView添加右鍵快鍵菜單有兩種方法

    c# TreeView添加右鍵快鍵菜單有兩種方法

    c# TreeView添加右鍵快鍵菜單有兩種方法,需要的朋友可以參考一下
    2013-04-04
  • WPF開發(fā)之UniformGrid和ItemsControl的應用詳解

    WPF開發(fā)之UniformGrid和ItemsControl的應用詳解

    為了簡化開發(fā),WPF提供了UniformGrid布局和ItemsControl容器,本文以一個簡單的小例子,簡述如何在WPF開發(fā)中應用UniformGrid和ItemsControl實現(xiàn)均勻的布局,希望對大家有所幫助
    2024-01-01
  • C#函數(shù)式編程中的緩存技術詳解

    C#函數(shù)式編程中的緩存技術詳解

    這篇文章主要介紹了C#函數(shù)式編程中的緩存技術詳解,本文我們將分成兩部分來講解,第一部分為預計算,第二部分則為緩存,需要的朋友可以參考下
    2015-01-01

最新評論

澎湖县| 南皮县| 长汀县| 平山县| 禹州市| 斗六市| 奈曼旗| 黄梅县| 遵义县| 康平县| 哈密市| 古丈县| 自治县| 米脂县| 白玉县| 旌德县| 邹城市| 邓州市| 固始县| 固安县| 河池市| 宁海县| 江川县| 城口县| 永顺县| 香河县| 桂平市| 宜州市| 新郑市| 南丰县| 通渭县| 天等县| 万全县| 临武县| 桐乡市| 宾阳县| 武山县| 保靖县| 汶川县| 仪征市| 永仁县|