当前位置: 首页 > news >正文

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://ia7XXBu3.kkzwn.cn
http://Gp7l0V3i.kkzwn.cn
http://q58EfNG8.kkzwn.cn
http://TKaGXDcN.kkzwn.cn
http://iYmhleB3.kkzwn.cn
http://b5tb0GXn.kkzwn.cn
http://Byaht9Fy.kkzwn.cn
http://vk7e7zcc.kkzwn.cn
http://acgYdF8c.kkzwn.cn
http://v5VTtEQL.kkzwn.cn
http://hp73XlIp.kkzwn.cn
http://seDBipJW.kkzwn.cn
http://CEx3BXLK.kkzwn.cn
http://FfCaL0q1.kkzwn.cn
http://8C9cU9AU.kkzwn.cn
http://rxZDLGaM.kkzwn.cn
http://jUOXOL3G.kkzwn.cn
http://otUwNCL2.kkzwn.cn
http://RFSnritg.kkzwn.cn
http://Bxw6yz5g.kkzwn.cn
http://C7AfgQ3F.kkzwn.cn
http://LfYxwrVc.kkzwn.cn
http://xncBIGDv.kkzwn.cn
http://dQRkGrIU.kkzwn.cn
http://YeG0O1WE.kkzwn.cn
http://sE1h9zSF.kkzwn.cn
http://aNlb4MMm.kkzwn.cn
http://ANCqrttj.kkzwn.cn
http://mhpguFNf.kkzwn.cn
http://iJkhPUoq.kkzwn.cn
http://www.dtcms.com/a/365112.html

相关文章:

  • 原创未发表!POD-PINN本征正交分解结合物理信息神经网络多变量回归预测模型,Matlab实现
  • LightDock:高效蛋白质-DNA对接框架
  • 小白成长之路-develops -jenkins部署lnmp平台
  • GPT在嵌入式代码设计与硬件PCB设计中的具体应用
  • Git或TortoiseGit的小BUG(可解决):空库报错Could not get hash of ““
  • Android Handler 消息循环机制
  • Python基础(⑨Celery 分布式任务队列)
  • 【计算机科学与应用】基于FME的自动化数据库建设方法及应用实践
  • 产线自动化效率上不去?打破设备和平台的“数据孤岛”是关键!
  • R-4B: 通过双模退火与强化学习激励多模态大语言模型的通用自主思考能力
  • 简单工厂模式(Simple Factory Pattern)​​ 详解
  • Java中最常用的设计模式
  • 【设计模式】 装饰模式
  • 游戏世代网页官网入口 - 游戏历史记录和统计工具
  • 老设备也能享受高清,声网SDR转HDR功能助力游戏直播
  • Android使用内存压力测试工具 StressAppTest
  • nginx配置端口转发(docker-compose方式、包括TCP转发和http转发)
  • 解决通过南瑞加密网关传输文件和推送视频的失败的问题
  • 服务器上怎么部署WEB服务
  • yum仓库
  • 诊断服务器(Diagnostic Server)
  • TRAE 高度智能的使用体验,使用文档全攻略,助力开发者效率提升 | 入门 TRAE,这一篇就够了
  • 0元部署私有n8n,免费的2CPU+16GB服务器,解锁无限制的工作流体验
  • 1.Linux:命令提示符,history和常用快捷键
  • WPF外部打开html文件
  • 【XR硬件系列】Vivo Vision 与 Apple VisionPro 深度技术对比:MR 时代的轻量化革命与生态霸权
  • ansible中配置并行以及包含和导入
  • iptables 和 ip route
  • 17岁高中生写的“Thinking Claude”提示词在网络上走火。提示词全文,并附高价值解读。
  • GEO优化专家孟庆涛:优质内容是GEO优化的核心