net9 aspose.cell 自定義公式AbstractCalculationEngine,帶超鏈接excel轉html后背景色丟失

AbstractCalculationEngine?是 Aspose.Cells 中一個強大的抽象類,允許您自定義公式計算邏輯。當您需要覆蓋默認計算行為或實現自定義函數時非常有用。

直接上代碼

1. 創建自定義計算引擎

using Aspose.Cells;
using System;// 創建自定義計算引擎
public class CustomCalculationEngine : AbstractCalculationEngine
{public override void Calculate(CalculationData data){// 檢查函數名稱if (data.FunctionName == "CUSTOMFUNCTION"){// 處理自定義函數double result = CalculateCustomFunction(data);data.CalculatedValue = result;}}private double CalculateCustomFunction(CalculationData data){// 實現您的自定義邏輯if (data.ParamCount == 2){double param1 = Convert.ToDouble(data.GetParamValue(0));double param2 = Convert.ToDouble(data.GetParamValue(1));return param1 * param2 + 100; // 示例計算}return 0;}
}

2. 使用自定義計算引擎

using Aspose.Cells;// 使用自定義計算引擎
Workbook workbook = new Workbook("input.xlsx");// 創建自定義計算引擎實例
CustomCalculationEngine customEngine = new CustomCalculationEngine();// 設置計算選項
CalculationOptions options = new CalculationOptions();
options.CustomEngine = customEngine;
options.IgnoreError = true;// 使用自定義引擎計算公式
workbook.CalculateFormula(options);// 保存結果
workbook.Save("output.xlsx");

高級應用示例

示例1:自定義數學函數

public class MathCalculationEngine : AbstractCalculationEngine
{public override void Calculate(CalculationData data){switch (data.FunctionName.ToUpper()){case "CUSTOMSUM":data.CalculatedValue = CustomSum(data);break;case "CUSTOMAVG":data.CalculatedValue = CustomAverage(data);break;case "DISCOUNT":data.CalculatedValue = CalculateDiscount(data);break;default:break;}}private double CustomSum(CalculationData data){double sum = 0;for (int i = 0; i < data.ParamCount; i++){object paramValue = data.GetParamValue(i);if (paramValue is double){sum += (double)paramValue;}}return sum;}private double CustomAverage(CalculationData data){double sum = CustomSum(data);return data.ParamCount > 0 ? sum / data.ParamCount : 0;}private double CalculateDiscount(CalculationData data){if (data.ParamCount == 2){double price = Convert.ToDouble(data.GetParamValue(0));double discountRate = Convert.ToDouble(data.GetParamValue(1));return price * (1 - discountRate / 100);}return 0;}
}

示例2:業務邏輯計算引擎

public class BusinessCalculationEngine : AbstractCalculationEngine
{private readonly double _taxRate;private readonly double _shippingCost;public BusinessCalculationEngine(double taxRate, double shippingCost){_taxRate = taxRate;_shippingCost = shippingCost;}public override void Calculate(CalculationData data){switch (data.FunctionName.ToUpper()){case "CALCULATETAX":data.CalculatedValue = CalculateTax(data);break;case "TOTALWITHSHIPPING":data.CalculatedValue = TotalWithShipping(data);break;case "BUSINESSPROFIT":data.CalculatedValue = CalculateProfit(data);break;default:break;}}private double CalculateTax(CalculationData data){if (data.ParamCount >= 1){double amount = Convert.ToDouble(data.GetParamValue(0));return amount * _taxRate;}return 0;}private double TotalWithShipping(CalculationData data){if (data.ParamCount >= 1){double subtotal = Convert.ToDouble(data.GetParamValue(0));return subtotal + _shippingCost + (subtotal * _taxRate);}return 0;}private double CalculateProfit(CalculationData data){if (data.ParamCount == 2){double revenue = Convert.ToDouble(data.GetParamValue(0));double cost = Convert.ToDouble(data.GetParamValue(1));return revenue - cost - (revenue * _taxRate);}return 0;}
}

示例3:條件計算引擎

public class ConditionalCalculationEngine : AbstractCalculationEngine
{public override void Calculate(CalculationData data){if (data.FunctionName.StartsWith("VALIDATE_")){string validationType = data.FunctionName.Substring(9);data.CalculatedValue = ValidateData(data, validationType);}}private bool ValidateData(CalculationData data, string validationType){switch (validationType.ToUpper()){case "EMAIL":return IsValidEmail(data);case "PHONE":return IsValidPhone(data);case "DATE":return IsValidDate(data);default:return false;}}private bool IsValidEmail(CalculationData data){if (data.ParamCount >= 1){string email = data.GetParamValue(0)?.ToString();return !string.IsNullOrEmpty(email) && email.Contains("@") && email.Contains(".");}return false;}private bool IsValidPhone(CalculationData data){if (data.ParamCount >= 1){string phone = data.GetParamValue(0)?.ToString();return !string.IsNullOrEmpty(phone) && phone.Length >= 10;}return false;}private bool IsValidDate(CalculationData data){if (data.ParamCount >= 1){object dateValue = data.GetParamValue(0);return dateValue is DateTime;}return false;}
}

使用示例

// 使用業務計算引擎
var businessEngine = new BusinessCalculationEngine(taxRate: 0.08, shippingCost: 5.99);Workbook workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];// 設置一些測試數據
worksheet.Cells["A1"].PutValue(100); // 價格
worksheet.Cells["A2"].PutValue(0.1); // 折扣率
worksheet.Cells["A3"].Formula = "=DISCOUNT(A1, A2*100)"; // 使用自定義函數// 設置計算選項
CalculationOptions options = new CalculationOptions
{CustomEngine = businessEngine,IgnoreError = true,Recursive = true
};// 計算公式
workbook.CalculateFormula(options);Console.WriteLine($"折扣后價格: {worksheet.Cells["A3"].Value}");

實例:帶超鏈接excel轉html后背景色丟失(D列帶鏈接)

excel 公式D2單元格=HYPERLINK(C2,B2)

轉html后D列條件格式背景色丟失。

 public class MyEngine : AbstractCalculationEngine{public override bool ProcessBuiltInFunctions => true;public override void Calculate(CalculationData data){string funcName = data.FunctionName.ToUpper();if ("HYPERLINK".Equals(funcName)){if (data.ParamCount < 1) return;string hyperlink = data.GetParamText(0).ToString();string name = data.GetParamValue(data.ParamCount == 2 ? 1 : 0).ToString();data.CalculatedValue = hyperlink;//data.CalculatedValue =new string[] { name, hyperlink };}}}

替換超鏈接

    HtmlSaveOptions options = new HtmlSaveOptions();options.EnableCssCustomProperties = true; // 啟用CSS優化var tempFilePath = "ExcelReportTest.xlsx";using (var fileStream = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)){// 加載Excel文件var workbook = new Aspose.Cells.Workbook(fileStream);var sheet = workbook.Worksheets[0];Cell hyperLinkCell = null;while (true){// Loop to find the hyperlink formulas on this sheet.hyperLinkCell = sheet.Cells.Find("hyperlink", hyperLinkCell, new FindOptions(){CaseSensitive = false,LookInType = LookInType.OnlyFormulas,});// No more hyperlinks, we're doneif (hyperLinkCell == null)break;// Calculate the hyperlink formula, using a custom enginevar result = sheet.CalculateFormula(hyperLinkCell.Formula, new CalculationOptions(){CustomEngine = new MyEngine()});// 保存當前值object cellValue = hyperLinkCell.Value;// 如果需要保留值,重新設置值hyperLinkCell.PutValue(cellValue);// The result of the hyperlink formula with out custom engine will give us the name and address in an arrayif (result != null){var linkString = sheet.Cells[result.ToString()].StringValue;sheet.Hyperlinks.Add(hyperLinkCell.Name, 1, 1, linkString);}}workbook.Save("HtmlSaveOptionsExample.html", options);}
}

轉換后的html效果如下

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921257.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何監控員工的電腦?7款實用的員工電腦管理軟件,探索高效管理捷徑!

當銷售團隊在淘寶刷單、設計師用公司電腦挖礦、程序員頻繁訪問代碼托管網站時&#xff0c;企業損失的不僅是帶寬——低效、泄密、合規風險正成為隱形利潤殺手。 傳統管理依賴“人盯人”或抽查日志&#xff0c;但面對分布式辦公與遠程協作趨勢&#xff0c;這些方法早已力不從心…

機器視覺軟件--VisionPro、Visual Master,Halcon 和 OpenCV 的學習路線

Halcon 和 OpenCV區別 Halcon 和 OpenCV 都是計算機視覺領域的重要工具&#xff0c;但它們的設計理念、功能側重和適用場景有顯著不同。下面這個表格匯總了它們的核心區別&#xff0c;方便你快速了解&#xff1a; 開發模式與體驗??&#xff1a;Halcon 配備了強大的??圖形化…

算法-根據前序+中序遍歷打印樹的右視圖

題目請根據二叉樹的前序遍歷&#xff0c;中序遍歷恢復二叉樹&#xff0c;并打印出二叉樹的右視圖數據范圍&#xff1a; 0≤n≤100000≤n≤10000 要求&#xff1a; 空間復雜度 O(n)O(n)&#xff0c;時間復雜度 O(n)O(n)如輸入[1,2,4,5,3],[4,2,5,1,3]時&#xff0c;通過前序遍歷…

Kafka面試精講 Day 7:消息序列化與壓縮策略

【Kafka面試精講 Day 7】消息序列化與壓縮策略 在Kafka的高性能消息系統中&#xff0c;消息序列化與壓縮是影響吞吐量、延遲和網絡開銷的核心環節。作為“Kafka面試精講”系列的第7天&#xff0c;本文聚焦于這一關鍵主題&#xff0c;深入剖析其原理、實現方式、配置策略及常見…

Xterminal軟件下載_Xterminal ssh遠程鏈接工具下載__Xterminal安裝包 網盤下載_Xterminal ssh遠程鏈接工具安裝包

Xterminal 作為一款國產 SSH 工具&#xff0c;專為開發人員量身打造。它支持 SSH 和 Telnet 協議連接遠程服務器與虛擬機&#xff0c;無論是進行代碼部署&#xff0c;還是服務器運維&#xff0c;都能輕松勝任。軟件界面采用極簡設計&#xff0c;黑色背景搭配白色文字&#xff0…

Lua > 洛谷

Lua > 洛谷P1000 超級瑪麗游戲P1001 AB ProblemP1008 [NOIP 1998 普及組] 三連擊P1035 [NOIP 2002 普及組] 級數求和P1046 [NOIP 2005 普及組] 陶陶摘蘋果P1047 [NOIP 2005 普及組] 校門外的樹P1085 [NOIP 2004 普及組] 不高興的津津P1089 [NOIP 2004 提高組] 津津的儲蓄計劃…

小企業環境-火山方舟和扣子

背景說明 并不是說應該怎么辦&#xff0c;而是基本配置有這些可以進行使用&#xff0c;具體不同企業使用的時候肯定要個性化配置。 使用了火山方舟和扣子 火山方舟 應用實驗室列表 簡單使用了提示詞的功能&#xff0c;后端服務ARK_API_KEY 應用ID 來對應請求發送http請求…

QT-事件

Qt事件 除了信號和槽通信機制外&#xff0c;Qt中還提供了事件處理機制實現與用戶的交互和對象間的通信。Qt捕獲底層操作系統消息&#xff0c;進行封裝之后轉換為Qt事件&#xff0c;事件處理后才發出信號。 一、事件概述Qt中事件是程序內部或外部發生的動作。比如程序外部&#…

HI3519DRFCV500/HI3519DV500海思核心板IPC算力2.5T圖像ISP超高清智能視覺應用提供SDK軟件開發包

Hi3519DV500是一顆面向視覺行業推出的超高清智能 SoC。最高支持四路sensor輸入&#xff0c;支持最高4K30fps的ISP圖像處理能力&#xff0c;支持 2F WDR、多級降噪、六軸防抖、全景拼接、多光 譜融合等多種傳統圖像增強和處理算法&#xff0c;支持通過AI算法對輸入圖像進行實時降…

go 初始化組件最佳實踐

Go 語言初始化最佳實踐 在 Go 語言中, 有一個 init() 函數可以對程序進行包級別的初始化, 但 init() 函數有諸多不便, 例如: 無法返回錯誤, 進行耗時初始化時, 會增加程序啟動時間。因此 init() 函數并不適用于所有初始化。 1.初始化方式 在程序進行初始化時&#xff0c;我們應…

域名暫停解析是怎么回事

域名注冊和使用是需要付費的&#xff0c;如果沒有及時續費&#xff0c;域名注冊商就會暫停該域名的解析服務。相關數據顯示&#xff0c;大約有 30% 的域名暫停解析情況是由于欠費引起的。比如&#xff0c;有個小公司的網站域名到期了&#xff0c;負責續費的員工忘記操作&#x…

前端開發的“三劍客”—— ??HTML、CSS、JavaScript??

前端開發的“三劍客”—— ??HTML、CSS、JavaScript??&#xff0c;是構建所有網頁和Web應用的基石。它們分工明確又緊密協作&#xff0c;共同實現了網頁的“內容結構”“視覺表現”和“交互行為”。以下是三者的詳細解析及協作邏輯&#xff1a;??1. HTML&#xff1a;網頁…

TDengine TIMEDIFF() 函數用戶使用手冊

TDengine TIMEDIFF() 函數詳細使用手冊 目錄 功能概述函數語法參數說明返回值說明版本變更說明技術特性使用場景及示例時間單位處理數據類型兼容性注意事項常見問題最佳實踐 功能概述 TIMEDIFF() 函數用于計算兩個時間戳的差值&#xff0c;返回 expr1 - expr2 的結果。結果…

數據結構:棧和隊列(上)

匯總代碼見&#xff1a;登錄 - Gitee.com 上一篇文章&#xff1a;數據結構&#xff1a;雙向鏈表-CSDN博客 與本文相關的結構體傳參&#xff1a;自定義類型&#xff1a;結構體-CSDN博客 1.棧 1.1概念和結構 棧&#xff1a;一種特殊的線性表&#xff0c;其只允許在固定的一端…

文檔抽取技術:提取非結構化文檔中的關鍵信息,提升檔案管理、金融保險和法律合規領域的效率與準確性

在信息爆炸的時代&#xff0c;各種機構、企業等都面臨著海量非結構化文檔數據的挑戰。報告、合同、票據、檔案記錄、法律文書等文檔中蘊藏著巨大的數據&#xff0c;但傳統依靠人工閱讀、理解和錄入的方式效率低下、成本高昂且容易出錯。文檔抽取技術作為人工智能和自然語言處理…

雷柏VT1 MAX評測:原生中小手形電競鼠標 但既不僅限于中小手形 也不僅限于電競

一、前言&#xff1a;真正針對中小手形設計的電競鼠標 雷柏第二代VT系列電競鼠標我們已經體驗過很多款了&#xff0c;基本都是針對大中手形設計的外形模具&#xff0c;只有VT3s系列是VT3系列的縮小版&#xff0c;更適合中小手形使用&#xff0c;但也只是對中大手形模具重新優化…

新客戶 | TDengine 時序數據庫賦能開源鴻蒙物聯展區實時監控與展示

在工業物聯網快速發展的當下&#xff0c;企業普遍面臨著兩大挑戰&#xff1a;一是設備種類繁多、接入標準不一&#xff0c;導致系統建設容易陷入“數據孤島”&#xff1b;二是實時監控和多場景聯動的需求越來越強烈&#xff0c;但傳統數據庫在高頻寫入與多維分析上難以兼顧&…

深入剖析 ConcurrentHashMap:Java 并發編程的基石

目錄 【1】Java 7 中 ConcurrentHashMap 的實現原理 1.分段鎖&#xff08;Segment&#xff09; 2. 數據結構 3. 操作流程 【2】Java 8 中 ConcurrentHashMap 的改進 1.紅黑樹的引入 2.CAS 操作 3.數據結構的變化 【3】ConcurrentHashMap 的常用方法及使用示例 1.put(…

【會員專享數據】2020-2022年我國鄉鎮的逐日地表氣壓數據(Shp/Excel格式)

之前我們分享過2020—2022年中國0.01分辨率逐日地表氣壓柵格數據&#xff08;可查看之前的文章獲悉詳情&#xff09;&#xff01;該數據是研究者張凌, 胡英屹等發布在國家冰川凍土沙漠科學數據中心平臺上的高分辨地表氣壓數據。很多小伙伴拿到數據后反饋柵格數據不太方便使用&a…

第二階段WinForm-12:UI控件庫

1_驗證碼與條形碼 1.1_條碼基礎知識 條碼&#xff1a;條碼是由一組按一定編碼規則排列的條、空符號組成&#xff0c;用以表示一定的字符、數字及符號組成的信息 1.2_一維碼 &#xff08;1&#xff09;Code 128 Code 128 是一種密度很高的字母數字代碼系統&#xff0c;可對其…