高级公式与 VBA 集成
本页是公式与函数应用的续篇,可结合前文一起阅读。
高级公式应用
数组公式应用
csharp
using System;
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Excel;
namespace ArrayFormulaExample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("=== 数组公式应用示例 ===");
try
{
// 基本数组公式
BasicArrayFormulaDemo();
// 动态数组公式
DynamicArrayFormulaDemo();
// 矩阵运算
MatrixFormulaDemo();
Console.WriteLine("\n✓ 数组公式示例完成");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 数组公式示例时出错: {ex.Message}");
}
}
static void BasicArrayFormulaDemo()
{
Console.WriteLine("\n1. 基本数组公式:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "基本数组公式";
// 创建测试数据
var salesData = new double[,]
{
{ 1200, 1500, 1800, 2000 },
{ 900, 1100, 1300, 1600 },
{ 800, 950, 1200, 1400 },
{ 1500, 1700, 1900, 2100 }
};
// 写入销售数据
for (int row = 0; row < salesData.GetLength(0); row++)
{
for (int col = 0; col < salesData.GetLength(1); col++)
{
worksheet.Cells[row + 1, col + 1].Value = salesData[row, col];
}
}
// 添加季度标签
string[] quarters = { "Q1", "Q2", "Q3", "Q4" };
for (int i = 0; i < quarters.Length; i++)
{
worksheet.Cells[6, i + 1].Value = quarters[i] + "总和";
}
// 使用数组公式计算季度总和
for (int col = 1; col <= 4; col++)
{
// 传统数组公式(需要Ctrl+Shift+Enter)
worksheet.Cells[6, col].FormulaArray = $"=SUM(A1:A4)";
// 现代Excel中的动态数组公式
worksheet.Cells[7, col].Formula = $"=SUM(A1:A4)";
}
// 数组公式:计算每个季度的平均值
worksheet.Cells[8, 1].Value = "季度平均值:";
for (int col = 1; col <= 4; col++)
{
worksheet.Cells[8, col + 1].FormulaArray = $"=AVERAGE(A1:A4)";
}
// 设置格式
var dataRange = worksheet.Range("A1:D4");
dataRange.NumberFormat = "#,##0";
var totalRange = worksheet.Range("A6:D7");
totalRange.Font.Bold = true;
totalRange.Interior.Color = System.Drawing.Color.LightBlue;
var averageRange = worksheet.Range("B8:E8");
averageRange.Font.Bold = true;
averageRange.Interior.Color = System.Drawing.Color.LightGreen;
worksheet.Columns["A:E"].AutoFit();
workbook.SaveAs("BasicArrayFormulas.xlsx");
Console.WriteLine(" ✓ 基本数组公式创建完成");
}
static void DynamicArrayFormulaDemo()
{
Console.WriteLine("\n2. 动态数组公式:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "动态数组公式";
// 创建员工数据
var employees = new[]
{
new { Name = "张三", Department = "销售部", Salary = 12000, Bonus = 3000 },
new { Name = "李四", Department = "技术部", Salary = 15000, Bonus = 4000 },
new { Name = "王五", Department = "财务部", Salary = 13000, Bonus = 3500 },
new { Name = "赵六", Department = "销售部", Salary = 11000, Bonus = 2800 },
new { Name = "钱七", Department = "技术部", Salary = 16000, Bonus = 4500 }
};
// 写入数据
worksheet.Cells[1, 1].Value = "姓名";
worksheet.Cells[1, 2].Value = "部门";
worksheet.Cells[1, 3].Value = "基本工资";
worksheet.Cells[1, 4].Value = "奖金";
worksheet.Cells[1, 5].Value = "总收入";
for (int i = 0; i < employees.Length; i++)
{
worksheet.Cells[i + 2, 1].Value = employees[i].Name;
worksheet.Cells[i + 2, 2].Value = employees[i].Department;
worksheet.Cells[i + 2, 3].Value = employees[i].Salary;
worksheet.Cells[i + 2, 4].Value = employees[i].Bonus;
worksheet.Cells[i + 2, 5].Formula = $"=C{i+2}+D{i+2}";
}
// 动态数组公式:筛选销售部员工
worksheet.Cells[8, 1].Value = "销售部员工:";
worksheet.Cells[8, 1].Font.Bold = true;
// 使用FILTER函数(现代Excel)
worksheet.Cells[9, 1].Formula = "=FILTER(A2:E6,B2:B6=\"销售部\")";
// 动态数组公式:排序总收入
worksheet.Cells[8, 7].Value = "按总收入排序:";
worksheet.Cells[8, 7].Font.Bold = true;
// 使用SORT函数
worksheet.Cells[9, 7].Formula = "=SORT(A2:E6,5,-1)"; // 按第5列降序排序
// 动态数组公式:唯一部门列表
worksheet.Cells[8, 12].Value = "唯一部门:";
worksheet.Cells[8, 12].Font.Bold = true;
worksheet.Cells[9, 12].Formula = "=UNIQUE(B2:B6)";
// 设置格式
var headerRange = worksheet.Range("A1:E1");
headerRange.Font.Bold = true;
headerRange.Interior.Color = System.Drawing.Color.LightGray;
worksheet.Range("C2:E7").NumberFormat = "#,##0";
var dynamicHeader = worksheet.Range("A8:A8,G8:G8,L8:L8");
dynamicHeader.Font.Bold = true;
dynamicHeader.Font.Size = 11;
worksheet.Columns["A:M"].AutoFit();
workbook.SaveAs("DynamicArrayFormulas.xlsx");
Console.WriteLine(" ✓ 动态数组公式创建完成");
}
static void MatrixFormulaDemo()
{
Console.WriteLine("\n3. 矩阵运算公式:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "矩阵运算";
// 创建两个矩阵
var matrixA = new double[,]
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
var matrixB = new double[,]
{
{ 9, 8, 7 },
{ 6, 5, 4 },
{ 3, 2, 1 }
};
// 写入矩阵A
worksheet.Cells[1, 1].Value = "矩阵A:";
worksheet.Cells[1, 1].Font.Bold = true;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
worksheet.Cells[row + 2, col + 1].Value = matrixA[row, col];
}
}
// 写入矩阵B
worksheet.Cells[1, 5].Value = "矩阵B:";
worksheet.Cells[1, 5].Font.Bold = true;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
worksheet.Cells[row + 2, col + 5].Value = matrixB[row, col];
}
}
// 矩阵加法
worksheet.Cells[6, 1].Value = "矩阵加法 (A+B):";
worksheet.Cells[6, 1].Font.Bold = true;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
worksheet.Cells[row + 7, col + 1].Formula = $"=A{row+2}+E{row+2}";
}
}
// 矩阵乘法
worksheet.Cells[6, 5].Value = "矩阵乘法 (A*B):";
worksheet.Cells[6, 5].Font.Bold = true;
// 使用MMULT函数进行矩阵乘法
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
// 矩阵乘法公式
worksheet.Cells[row + 7, col + 5].FormulaArray = $"=MMULT(A2:C4,E2:G4)";
}
}
// 矩阵转置
worksheet.Cells[11, 1].Value = "矩阵A转置:";
worksheet.Cells[11, 1].Font.Bold = true;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 3; col++)
{
worksheet.Cells[row + 12, col + 1].FormulaArray = $"=TRANSPOSE(A2:C4)";
}
}
// 矩阵行列式
worksheet.Cells[11, 5].Value = "矩阵A行列式:";
worksheet.Cells[11, 5].Font.Bold = true;
worksheet.Cells[12, 5].FormulaArray = "=MDETERM(A2:C4)";
// 设置格式
var matrixARange = worksheet.Range("A2:C4");
var matrixBRange = worksheet.Range("E2:G4");
matrixARange.Interior.Color = System.Drawing.Color.LightBlue;
matrixBRange.Interior.Color = System.Drawing.Color.LightGreen;
var resultRange1 = worksheet.Range("A7:C9");
var resultRange2 = worksheet.Range("E7:G9");
var resultRange3 = worksheet.Range("A12:C14");
resultRange1.Interior.Color = System.Drawing.Color.LightYellow;
resultRange2.Interior.Color = System.Drawing.Color.LightPink;
resultRange3.Interior.Color = System.Drawing.Color.LightCyan;
worksheet.Columns["A:G"].AutoFit();
workbook.SaveAs("MatrixFormulas.xlsx");
Console.WriteLine(" ✓ 矩阵运算公式创建完成");
}
}
}自定义函数与VBA集成
自定义函数应用
csharp
using System;
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Excel;
namespace CustomFunctionExample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("=== 自定义函数与VBA集成示例 ===");
try
{
// 自定义函数应用
CustomFunctionDemo();
// VBA宏集成
VbaIntegrationDemo();
// 事件处理函数
EventHandlerDemo();
Console.WriteLine("\n✓ 自定义函数示例完成");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 自定义函数示例时出错: {ex.Message}");
}
}
static void CustomFunctionDemo()
{
Console.WriteLine("\n1. 自定义函数应用:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "自定义函数";
// 创建业务数据
var businessData = new[]
{
new { Product = "笔记本电脑", Cost = 4000, Price = 5999, Quantity = 50 },
new { Product = "智能手机", Cost = 2500, Price = 3999, Quantity = 100 },
new { Product = "打印机", Cost = 800, Price = 1299, Quantity = 30 },
new { Product = "办公桌", Cost = 600, Price = 899, Quantity = 20 }
};
// 写入数据
worksheet.Cells[1, 1].Value = "产品名称";
worksheet.Cells[1, 2].Value = "成本";
worksheet.Cells[1, 3].Value = "售价";
worksheet.Cells[1, 4].Value = "数量";
worksheet.Cells[1, 5].Value = "毛利率";
worksheet.Cells[1, 6].Value = "总利润";
worksheet.Cells[1, 7].Value = "利润率";
for (int i = 0; i < businessData.Length; i++)
{
var data = businessData[i];
int row = i + 2;
worksheet.Cells[row, 1].Value = data.Product;
worksheet.Cells[row, 2].Value = data.Cost;
worksheet.Cells[row, 3].Value = data.Price;
worksheet.Cells[row, 4].Value = data.Quantity;
// 使用自定义公式计算业务指标
worksheet.Cells[row, 5].Formula = $"=({data.Price}-{data.Cost})/{data.Price}"; // 毛利率
worksheet.Cells[row, 6].Formula = $"=({data.Price}-{data.Cost})*{data.Quantity}"; // 总利润
worksheet.Cells[row, 7].Formula = $"=({data.Price}-{data.Cost})/{data.Cost}"; // 利润率
}
// 添加汇总行
int lastRow = businessData.Length + 2;
worksheet.Cells[lastRow, 1].Value = "汇总:";
worksheet.Cells[lastRow, 1].Font.Bold = true;
worksheet.Cells[lastRow, 2].Formula = "=SUM(B2:B5)"; // 总成本
worksheet.Cells[lastRow, 3].Formula = "=SUM(C2:C5)"; // 总售价
worksheet.Cells[lastRow, 4].Formula = "=SUM(D2:D5)"; // 总数量
worksheet.Cells[lastRow, 6].Formula = "=SUM(F2:F5)"; // 总利润
// 添加高级业务指标
worksheet.Cells[lastRow + 2, 1].Value = "业务指标:";
worksheet.Cells[lastRow + 2, 1].Font.Bold = true;
worksheet.Cells[lastRow + 3, 1].Value = "平均利润率:";
worksheet.Cells[lastRow + 3, 2].Formula = "=AVERAGE(G2:G5)";
worksheet.Cells[lastRow + 4, 1].Value = "最高利润率产品:";
worksheet.Cells[lastRow + 4, 2].Formula = "=INDEX(A2:A5,MATCH(MAX(G2:G5),G2:G5,0))";
worksheet.Cells[lastRow + 5, 1].Value = "利润贡献率:";
for (int i = 0; i < businessData.Length; i++)
{
worksheet.Cells[lastRow + 5 + i, 1].Value = businessData[i].Product + "贡献率:";
worksheet.Cells[lastRow + 5 + i, 2].Formula = $"=F{i+2}/F{lastRow}";
}
// 设置格式
var headerRange = worksheet.Range("A1:G1");
headerRange.Font.Bold = true;
headerRange.Interior.Color = System.Drawing.Color.SteelBlue;
headerRange.Font.Color = System.Drawing.Color.White;
worksheet.Range("B2:G" + lastRow).NumberFormat = "#,##0.00";
worksheet.Range("E2:G5").NumberFormat = "0.00%"; // 百分比格式
var summaryRange = worksheet.Range($"A{lastRow}:G{lastRow}");
summaryRange.Font.Bold = true;
summaryRange.Interior.Color = System.Drawing.Color.LightGreen;
var metricsRange = worksheet.Range($"A{lastRow+2}:B{lastRow+8}");
metricsRange.Font.Bold = true;
metricsRange.Interior.Color = System.Drawing.Color.LightYellow;
worksheet.Columns["A:G"].AutoFit();
workbook.SaveAs("CustomFunctions.xlsx");
Console.WriteLine(" ✓ 自定义函数应用完成");
}
static void VbaIntegrationDemo()
{
Console.WriteLine("\n2. VBA宏集成:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "VBA集成";
// 创建需要VBA处理的数据
var salesData = new[]
{
new { Region = "华北", Month = "1月", Sales = 120000, Target = 100000 },
new { Region = "华北", Month = "2月", Sales = 135000, Target = 110000 },
new { Region = "华北", Month = "3月", Sales = 150000, Target = 120000 },
new { Region = "华东", Month = "1月", Sales = 180000, Target = 150000 },
new { Region = "华东", Month = "2月", Sales = 165000, Target = 160000 },
new { Region = "华东", Month = "3月", Sales = 195000, Target = 170000 }
};
// 写入数据
worksheet.Cells[1, 1].Value = "区域";
worksheet.Cells[1, 2].Value = "月份";
worksheet.Cells[1, 3].Value = "实际销售额";
worksheet.Cells[1, 4].Value = "目标销售额";
worksheet.Cells[1, 5].Value = "完成率";
worksheet.Cells[1, 6].Value = "超额金额";
for (int i = 0; i < salesData.Length; i++)
{
var data = salesData[i];
int row = i + 2;
worksheet.Cells[row, 1].Value = data.Region;
worksheet.Cells[row, 2].Value = data.Month;
worksheet.Cells[row, 3].Value = data.Sales;
worksheet.Cells[row, 4].Value = data.Target;
worksheet.Cells[row, 5].Formula = $"=C{row}/D{row}"; // 完成率
worksheet.Cells[row, 6].Formula = $"=C{row}-D{row}"; // 超额金额
}
// 添加VBA相关功能
worksheet.Cells[10, 1].Value = "VBA功能演示:";
worksheet.Cells[10, 1].Font.Bold = true;
// 创建按钮调用VBA宏(需要实际VBA代码支持)
var button = worksheet.Buttons.Add(100, 100, 120, 30);
button.Text = "计算汇总";
// button.OnAction = "CalculateSummary"; // 实际应用中需要设置VBA宏名称
// 添加数据验证(需要VBA支持)
var validationRange = worksheet.Range("A2:A7");
// 实际应用中可以使用VBA添加数据验证规则
// 设置条件格式(可以通过VBA增强)
var completionRange = worksheet.Range("E2:E7");
// 完成率低于80% - 红色
var lowCondition = completionRange.FormatConditions.Add(XlFormatConditionType.xlCellValue,
XlFormatConditionOperator.xlLess, 0.8);
lowCondition.Interior.Color = System.Drawing.Color.LightCoral;
// 完成率80%-100% - 黄色
var mediumCondition = completionRange.FormatConditions.Add(XlFormatConditionType.xlCellValue,
XlFormatConditionOperator.xlBetween, 0.8, 1.0);
mediumCondition.Interior.Color = System.Drawing.Color.LightYellow;
// 完成率超过100% - 绿色
var highCondition = completionRange.FormatConditions.Add(XlFormatConditionType.xlCellValue,
XlFormatConditionOperator.xlGreaterEqual, 1.0);
highCondition.Interior.Color = System.Drawing.Color.LightGreen;
// 设置格式
var headerRange = worksheet.Range("A1:F1");
headerRange.Font.Bold = true;
headerRange.Interior.Color = System.Drawing.Color.LightBlue;
worksheet.Range("C2:F7").NumberFormat = "#,##0";
worksheet.Range("E2:E7").NumberFormat = "0.00%";
worksheet.Columns["A:F"].AutoFit();
workbook.SaveAs("VbaIntegration.xlsx");
Console.WriteLine(" ✓ VBA集成演示完成");
}
static void EventHandlerDemo()
{
Console.WriteLine("\n3. 事件处理函数:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "事件处理";
// 创建交互式数据表
worksheet.Cells[1, 1].Value = "动态计算器";
worksheet.Cells[1, 1].Font.Bold = true;
worksheet.Cells[1, 1].Font.Size = 14;
worksheet.Cells[3, 1].Value = "输入数值1:";
worksheet.Cells[3, 2].Value = 100;
worksheet.Cells[4, 1].Value = "输入数值2:";
worksheet.Cells[4, 2].Value = 50;
worksheet.Cells[5, 1].Value = "运算类型:";
worksheet.Cells[5, 2].Value = "加法";
// 创建下拉列表(实际应用中需要数据验证)
worksheet.Cells[6, 1].Value = "选择运算:";
worksheet.Cells[6, 2].Value = "加法";
worksheet.Cells[7, 2].Value = "减法";
worksheet.Cells[8, 2].Value = "乘法";
worksheet.Cells[9, 2].Value = "除法";
// 动态计算结果
worksheet.Cells[11, 1].Value = "计算结果:";
worksheet.Cells[11, 1].Font.Bold = true;
// 使用CHOOSE和MATCH函数实现动态计算
worksheet.Cells[12, 1].Formula = $"=CHOOSE(MATCH(B6,B7:B10,0),B3+B4,B3-B4,B3*B4,B3/B4)";
// 添加解释说明
worksheet.Cells[14, 1].Value = "说明:";
worksheet.Cells[14, 1].Font.Bold = true;
worksheet.Cells[15, 1].Value = "修改B3、B4单元格的值或B6单元格的运算类型,结果将自动更新";
worksheet.Cells[15, 1].Font.Italic = true;
// 创建实时监控区域
worksheet.Cells[17, 1].Value = "实时监控:";
worksheet.Cells[17, 1].Font.Bold = true;
worksheet.Cells[18, 1].Value = "当前时间:";
worksheet.Cells[18, 2].Formula = "=NOW()";
worksheet.Cells[19, 1].Value = "计算次数:";
worksheet.Cells[19, 2].Value = 1;
worksheet.Cells[20, 1].Value = "最后计算时间:";
worksheet.Cells[20, 2].Formula = "=NOW()";
// 设置格式
var inputRange = worksheet.Range("A3:B5");
inputRange.Interior.Color = System.Drawing.Color.LightBlue;
var selectionRange = worksheet.Range("A6:B9");
selectionRange.Interior.Color = System.Drawing.Color.LightGreen;
var resultRange = worksheet.Range("A12:B12");
resultRange.Font.Bold = true;
resultRange.Font.Size = 16;
resultRange.Interior.Color = System.Drawing.Color.Gold;
var monitorRange = worksheet.Range("A18:B20");
monitorRange.Interior.Color = System.Drawing.Color.LightYellow;
worksheet.Range("B18:B18").NumberFormat = "yyyy-mm-dd hh:mm:ss";
worksheet.Range("B20:B20").NumberFormat = "yyyy-mm-dd hh:mm:ss";
worksheet.Columns["A:B"].AutoFit();
workbook.SaveAs("EventHandler.xlsx");
Console.WriteLine(" ✓ 事件处理函数演示完成");
}
}
}