公式调试、性能优化与实战
本页是公式与函数应用的续篇,可结合前文一起阅读。
公式错误处理与调试
公式错误处理
csharp
using System;
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Excel;
namespace FormulaErrorHandlingExample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("=== 公式错误处理与调试示例 ===");
try
{
// 公式错误检测
FormulaErrorDetection();
// 公式调试技巧
FormulaDebuggingDemo();
// 错误处理策略
ErrorHandlingStrategies();
Console.WriteLine("\n✓ 公式错误处理示例完成");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 公式错误处理示例时出错: {ex.Message}");
}
}
static void FormulaErrorDetection()
{
Console.WriteLine("\n1. 公式错误检测:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "错误检测";
// 创建包含各种错误的公式
worksheet.Cells[1, 1].Value = "错误类型";
worksheet.Cells[1, 2].Value = "公式示例";
worksheet.Cells[1, 3].Value = "错误值";
worksheet.Cells[1, 4].Value = "错误说明";
// #DIV/0! 错误
worksheet.Cells[2, 1].Value = "除零错误";
worksheet.Cells[2, 2].Formula = "=1/0";
worksheet.Cells[2, 3].Formula = "=ISERROR(B2)";
worksheet.Cells[2, 4].Value = "除数为零";
// #N/A 错误
worksheet.Cells[3, 1].Value = "值不可用";
worksheet.Cells[3, 2].Formula = "=NA()";
worksheet.Cells[3, 3].Formula = "=ISNA(B3)";
worksheet.Cells[3, 4].Value = "数值不可用";
// #VALUE! 错误
worksheet.Cells[4, 1].Value = "值错误";
worksheet.Cells[4, 2].Formula = "=\"文本\"+1";
worksheet.Cells[4, 3].Formula = "=ISERROR(B4)";
worksheet.Cells[4, 4].Value = "数据类型不匹配";
// #REF! 错误
worksheet.Cells[5, 1].Value = "引用错误";
worksheet.Cells[5, 2].Formula = "=A100"; // 引用不存在的单元格
worksheet.Cells[5, 3].Formula = "=ISERROR(B5)";
worksheet.Cells[5, 4].Value = "无效的单元格引用";
// #NAME? 错误
worksheet.Cells[6, 1].Value = "名称错误";
worksheet.Cells[6, 2].Formula = "=UNKNOWNFUNCTION()";
worksheet.Cells[6, 3].Formula = "=ISERROR(B6)";
worksheet.Cells[6, 4].Value = "未知的函数名称";
// #NUM! 错误
worksheet.Cells[7, 1].Value = "数字错误";
worksheet.Cells[7, 2].Formula = "=SQRT(-1)";
worksheet.Cells[7, 3].Formula = "=ISERROR(B7)";
worksheet.Cells[7, 4].Value = "无效的数学运算";
// #NULL! 错误
worksheet.Cells[8, 1].Value = "空值错误";
worksheet.Cells[8, 2].Formula = "=A1 A2"; // 缺少运算符
worksheet.Cells[8, 3].Formula = "=ISERROR(B8)";
worksheet.Cells[8, 4].Value = "区域交集为空";
// 错误处理函数演示
worksheet.Cells[10, 1].Value = "错误处理函数:";
worksheet.Cells[10, 1].Font.Bold = true;
worksheet.Cells[11, 1].Value = "IFERROR示例:";
worksheet.Cells[11, 2].Formula = "=IFERROR(1/0,\"计算错误\")";
worksheet.Cells[12, 1].Value = "IFNA示例:";
worksheet.Cells[12, 2].Formula = "=IFNA(NA(),\"值不可用\")";
worksheet.Cells[13, 1].Value = "AGGREGATE示例:";
worksheet.Cells[13, 2].Formula = "=AGGREGATE(9,6,B2:B8)"; // 忽略错误值的求和
// 设置格式
var headerRange = worksheet.Range("A1:D1");
headerRange.Font.Bold = true;
headerRange.Interior.Color = System.Drawing.Color.LightGray;
var errorRange = worksheet.Range("A2:D8");
errorRange.Interior.Color = System.Drawing.Color.LightCoral;
var handlingRange = worksheet.Range("A10:B13");
handlingRange.Interior.Color = System.Drawing.Color.LightGreen;
worksheet.Columns["A:D"].AutoFit();
workbook.SaveAs("FormulaErrorDetection.xlsx");
Console.WriteLine(" ✓ 公式错误检测完成");
}
static void FormulaDebuggingDemo()
{
Console.WriteLine("\n2. 公式调试技巧:");
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;
// 创建测试数据
var salesData = new[]
{
new { Product = "A产品", Q1 = 100, Q2 = 120, Q3 = 90, Q4 = 110 },
new { Product = "B产品", Q1 = 80, Q2 = 95, Q3 = 105, Q4 = 120 },
new { Product = "C产品", Q1 = 150, Q2 = 140, Q3 = 160, Q4 = 170 }
};
// 写入数据
worksheet.Cells[3, 1].Value = "产品";
worksheet.Cells[3, 2].Value = "Q1";
worksheet.Cells[3, 3].Value = "Q2";
worksheet.Cells[3, 4].Value = "Q3";
worksheet.Cells[3, 5].Value = "Q4";
worksheet.Cells[3, 6].Value = "年度总和";
worksheet.Cells[3, 7].Value = "季度平均";
worksheet.Cells[3, 8].Value = "增长率";
for (int i = 0; i < salesData.Length; i++)
{
var data = salesData[i];
int row = i + 4;
worksheet.Cells[row, 1].Value = data.Product;
worksheet.Cells[row, 2].Value = data.Q1;
worksheet.Cells[row, 3].Value = data.Q2;
worksheet.Cells[row, 4].Value = data.Q3;
worksheet.Cells[row, 5].Value = data.Q4;
// 复杂公式:年度总和
worksheet.Cells[row, 6].Formula = $"=SUM(B{row}:E{row})";
// 复杂公式:季度平均
worksheet.Cells[row, 7].Formula = $"=AVERAGE(B{row}:E{row})";
// 复杂公式:增长率((Q4-Q1)/Q1)
worksheet.Cells[row, 8].Formula = $"=(E{row}-B{row})/B{row}";
}
// 添加公式分解调试区域
worksheet.Cells[8, 10].Value = "公式分解调试:";
worksheet.Cells[8, 10].Font.Bold = true;
// 分解复杂公式进行调试
worksheet.Cells[9, 10].Value = "原始公式:";
worksheet.Cells[9, 11].Value = "=(E4-B4)/B4";
worksheet.Cells[10, 10].Value = "E4值:";
worksheet.Cells[10, 11].Formula = "=E4";
worksheet.Cells[11, 10].Value = "B4值:";
worksheet.Cells[11, 11].Formula = "=B4";
worksheet.Cells[12, 10].Value = "E4-B4:";
worksheet.Cells[12, 11].Formula = "=E4-B4";
worksheet.Cells[13, 10].Value = "最终结果:";
worksheet.Cells[13, 11].Formula = "=H4";
// 使用公式求值功能(模拟)
worksheet.Cells[15, 10].Value = "公式求值步骤:";
worksheet.Cells[15, 10].Font.Bold = true;
worksheet.Cells[16, 10].Value = "步骤1: E4 = 110";
worksheet.Cells[17, 10].Value = "步骤2: B4 = 100";
worksheet.Cells[18, 10].Value = "步骤3: 110-100 = 10";
worksheet.Cells[19, 10].Value = "步骤4: 10/100 = 0.1";
worksheet.Cells[20, 10].Value = "最终结果: 10%";
// 设置格式
var headerRange = worksheet.Range("A3:H3");
headerRange.Font.Bold = true;
headerRange.Interior.Color = System.Drawing.Color.LightBlue;
var dataRange = worksheet.Range("A4:H6");
dataRange.Interior.Color = System.Drawing.Color.WhiteSmoke;
var debugRange = worksheet.Range("J8:L20");
debugRange.Interior.Color = System.Drawing.Color.LightYellow;
worksheet.Range("H4:H6").NumberFormat = "0.00%";
worksheet.Range("G4:G6").NumberFormat = "#,##0.00";
worksheet.Columns["A:L"].AutoFit();
workbook.SaveAs("FormulaDebugging.xlsx");
Console.WriteLine(" ✓ 公式调试技巧演示完成");
}
static void ErrorHandlingStrategies()
{
Console.WriteLine("\n3. 错误处理策略:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "错误处理策略";
// 创建包含潜在错误的数据
var problematicData = new[]
{
new { Description = "正常数值", Value = "100" },
new { Description = "文本数值", Value = "一百" },
new { Description = "空值", Value = "" },
new { Description = "零值", Value = "0" },
new { Description = "负数", Value = "-50" },
new { Description = "小数", Value = "12.5" }
};
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 < problematicData.Length; i++)
{
var data = problematicData[i];
int row = i + 2;
worksheet.Cells[row, 1].Value = data.Description;
worksheet.Cells[row, 2].Value = data.Value;
// 策略1:安全数值转换
worksheet.Cells[row, 3].Formula = $"=IFERROR(VALUE(B{row}),0)";
// 策略2:错误处理
worksheet.Cells[row, 4].Formula = $"=IF(ISERROR(VALUE(B{row})),\"转换失败\",VALUE(B{row}))";
// 策略3:数据验证
worksheet.Cells[row, 5].Formula = $"=IF(AND(ISNUMBER(C{row}),C{row}>=0),\"有效\",\"无效\")";
}
// 高级错误处理策略
worksheet.Cells[9, 1].Value = "高级错误处理策略:";
worksheet.Cells[9, 1].Font.Bold = true;
worksheet.Cells[10, 1].Value = "策略1:嵌套IFERROR";
worksheet.Cells[10, 2].Formula = "=IFERROR(1/0,IFERROR(NA(),\"所有错误处理\"))"";
worksheet.Cells[11, 1].Value = "策略2:条件错误处理";
worksheet.Cells[11, 2].Formula = "=IF(ISNA(B3),\"N/A错误\",IF(ISERROR(B2),\"其他错误\",\"正常\"))"";
worksheet.Cells[12, 1].Value = "策略3:AGGREGATE函数";
worksheet.Cells[12, 2].Formula = "=AGGREGATE(1,6,B2:B7)"; // 平均值,忽略错误
worksheet.Cells[13, 1].Value = "策略4:自定义错误消息";
worksheet.Cells[13, 2].Formula = "=IF(B2=0,\"除零错误\",1/B2)";
// 设置格式
var headerRange = worksheet.Range("A1:E1");
headerRange.Font.Bold = true;
headerRange.Interior.Color = System.Drawing.Color.LightBlue;
var dataRange = worksheet.Range("A2:E7");
dataRange.Interior.Color = System.Drawing.Color.WhiteSmoke;
var strategyRange = worksheet.Range("A9:B13");
strategyRange.Interior.Color = System.Drawing.Color.LightGreen;
worksheet.Columns["A:E"].AutoFit();
workbook.SaveAs("ErrorHandlingStrategies.xlsx");
Console.WriteLine(" ✓ 错误处理策略演示完成");
}
}
}公式性能优化
公式计算优化策略
csharp
using System;
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Excel;
namespace FormulaPerformanceExample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("=== 公式性能优化示例 ===");
try
{
// 公式计算模式优化
CalculationModeOptimization();
// 公式引用优化
FormulaReferenceOptimization();
// 数组公式优化
ArrayFormulaOptimization();
Console.WriteLine("
✓ 公式性能优化示例完成");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 公式性能优化示例时出错: {ex.Message}");
}
}
static void CalculationModeOptimization()
{
Console.WriteLine("
1. 公式计算模式优化:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
// 获取当前计算模式
var currentMode = excelApp.Calculation;
Console.WriteLine($"当前计算模式: {currentMode}");
// 设置手动计算模式以提高性能
excelApp.Calculation = XlCalculation.xlCalculationManual;
Console.WriteLine("已切换到手动计算模式");
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "性能优化";
// 创建大量公式数据
Console.WriteLine("正在创建大量公式数据...");
var random = new Random();
int rowCount = 1000;
int colCount = 10;
// 写入基础数据
for (int row = 1; row <= rowCount; row++)
{
for (int col = 1; col <= colCount; col++)
{
worksheet.Cells[row, col].Value = random.Next(1, 1000);
}
}
// 批量添加公式(在手动计算模式下更快)
for (int row = 1; row <= rowCount; row++)
{
// 汇总列
worksheet.Cells[row, colCount + 1].Formula = $"=SUM(A{row}:J{row})";
// 平均值列
worksheet.Cells[row, colCount + 2].Formula = $"=AVERAGE(A{row}:J{row})";
// 最大值列
worksheet.Cells[row, colCount + 3].Formula = $"=MAX(A{row}:J{row})";
// 最小值列
worksheet.Cells[row, colCount + 4].Formula = $"=MIN(A{row}:J{row})";
// 标准差列
worksheet.Cells[row, colCount + 5].Formula = $"=STDEV.S(A{row}:J{row})";
}
Console.WriteLine("公式创建完成,开始手动计算...");
// 手动触发计算
var startTime = DateTime.Now;
excelApp.Calculate();
var endTime = DateTime.Now;
Console.WriteLine($"计算完成,耗时: {(endTime - startTime).TotalMilliseconds} 毫秒");
// 恢复自动计算模式
excelApp.Calculation = XlCalculation.xlCalculationAutomatic;
Console.WriteLine("已恢复自动计算模式");
workbook.SaveAs("PerformanceOptimization.xlsx");
Console.WriteLine(" ✓ 计算模式优化完成");
}
static void FormulaReferenceOptimization()
{
Console.WriteLine("
2. 公式引用优化:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "引用优化";
// 创建大型数据集
var dataSize = 500;
var data = new double[dataSize];
var random = new Random();
for (int i = 0; i < dataSize; i++)
{
data[i] = random.NextDouble() * 1000;
worksheet.Cells[i + 1, 1].Value = data[i];
}
// 优化前:重复计算相同范围
worksheet.Cells[dataSize + 2, 1].Value = "优化前 - 重复引用:";
worksheet.Cells[dataSize + 2, 1].Font.Bold = true;
worksheet.Cells[dataSize + 3, 1].Value = "总和:";
worksheet.Cells[dataSize + 3, 2].Formula = "=SUM(A1:A500)";
worksheet.Cells[dataSize + 4, 1].Value = "平均值:";
worksheet.Cells[dataSize + 4, 2].Formula = "=AVERAGE(A1:A500)";
worksheet.Cells[dataSize + 5, 1].Value = "最大值:";
worksheet.Cells[dataSize + 5, 2].Formula = "=MAX(A1:A500)";
worksheet.Cells[dataSize + 6, 1].Value = "最小值:";
worksheet.Cells[dataSize + 6, 2].Formula = "=MIN(A1:A500)";
// 优化后:使用命名范围
var dataRange = worksheet.Range("A1:A500");
dataRange.Name = "DataRange";
worksheet.Cells[dataSize + 8, 1].Value = "优化后 - 命名引用:";
worksheet.Cells[dataSize + 8, 1].Font.Bold = true;
worksheet.Cells[dataSize + 9, 1].Value = "总和:";
worksheet.Cells[dataSize + 9, 2].Formula = "=SUM(DataRange)";
worksheet.Cells[dataSize + 10, 1].Value = "平均值:";
worksheet.Cells[dataSize + 10, 2].Formula = "=AVERAGE(DataRange)";
worksheet.Cells[dataSize + 11, 1].Value = "最大值:";
worksheet.Cells[dataSize + 11, 2].Formula = "=MAX(DataRange)";
worksheet.Cells[dataSize + 12, 1].Value = "最小值:";
worksheet.Cells[dataSize + 12, 2].Formula = "=MIN(DataRange)";
// 进一步优化:使用表结构
worksheet.Cells[dataSize + 14, 1].Value = "表结构优化:";
worksheet.Cells[dataSize + 14, 1].Font.Bold = true;
// 将数据转换为表(实际应用中需要VBA支持)
var tableRange = worksheet.Range("A1:A500");
// 表结构公式示例
worksheet.Cells[dataSize + 15, 1].Value = "表总和:";
worksheet.Cells[dataSize + 15, 2].Formula = "=SUM(Table1[Column1])"; // 假设表名为Table1
// 设置格式
var optimizationHeader = worksheet.Range($"A{dataSize+2}:A{dataSize+2}");
optimizationHeader.Font.Bold = true;
optimizationHeader.Font.Size = 12;
var optimizedHeader = worksheet.Range($"A{dataSize+8}:A{dataSize+8}");
optimizedHeader.Font.Bold = true;
optimizedHeader.Font.Size = 12;
var tableHeader = worksheet.Range($"A{dataSize+14}:A{dataSize+14}");
tableHeader.Font.Bold = true;
tableHeader.Font.Size = 12;
worksheet.Columns["A:B"].AutoFit();
workbook.SaveAs("ReferenceOptimization.xlsx");
Console.WriteLine(" ✓ 引用优化完成");
}
static void ArrayFormulaOptimization()
{
Console.WriteLine("
3. 数组公式优化:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "数组优化";
// 创建大型矩阵数据
int matrixSize = 50;
var random = new Random();
// 矩阵A
for (int row = 1; row <= matrixSize; row++)
{
for (int col = 1; col <= matrixSize; col++)
{
worksheet.Cells[row, col].Value = random.NextDouble() * 100;
}
}
// 矩阵B
for (int row = 1; row <= matrixSize; row++)
{
for (int col = 1; col <= matrixSize; col++)
{
worksheet.Cells[row, col + matrixSize + 2].Value = random.NextDouble() * 100;
}
}
// 传统方法:逐个单元格计算
worksheet.Cells[matrixSize + 2, 1].Value = "传统方法 - 逐个计算:";
worksheet.Cells[matrixSize + 2, 1].Font.Bold = true;
var startTime = DateTime.Now;
for (int row = 1; row <= matrixSize; row++)
{
for (int col = 1; col <= matrixSize; col++)
{
// 矩阵加法(逐个单元格)
worksheet.Cells[row, col + (matrixSize + 2) * 2].Formula = $"=A{row}+{Convert.ToChar(64 + matrixSize + 2 + col)}{row}";
}
}
var endTime = DateTime.Now;
Console.WriteLine($"传统方法耗时: {(endTime - startTime).TotalMilliseconds} 毫秒");
// 数组公式方法:批量计算
worksheet.Cells[matrixSize + 4, 1].Value = "数组公式方法 - 批量计算:";
worksheet.Cells[matrixSize + 4, 1].Font.Bold = true;
startTime = DateTime.Now;
// 使用数组公式进行矩阵加法
var resultRange = worksheet.Range(
worksheet.Cells[1, (matrixSize + 2) * 3],
worksheet.Cells[matrixSize, (matrixSize + 2) * 3 + matrixSize - 1]
);
// 数组公式赋值(批量操作)
resultRange.FormulaArray = $"=A1:{Convert.ToChar(64 + matrixSize)}{matrixSize}+{Convert.ToChar(64 + matrixSize + 2)}{1}:{Convert.ToChar(64 + (matrixSize + 2) + matrixSize - 1)}{matrixSize}";
endTime = DateTime.Now;
Console.WriteLine($"数组公式方法耗时: {(endTime - startTime).TotalMilliseconds} 毫秒");
// 设置格式
var traditionalHeader = worksheet.Range($"A{matrixSize+2}:A{matrixSize+2}");
traditionalHeader.Font.Bold = true;
traditionalHeader.Interior.Color = System.Drawing.Color.LightCoral;
var arrayHeader = worksheet.Range($"A{matrixSize+4}:A{matrixSize+4}");
arrayHeader.Font.Bold = true;
arrayHeader.Interior.Color = System.Drawing.Color.LightGreen;
worksheet.Columns.AutoFit();
workbook.SaveAs("ArrayFormulaOptimization.xlsx");
Console.WriteLine(" ✓ 数组公式优化完成");
}
}
}实际应用案例
财务报表分析系统
csharp
using System;
using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Excel;
namespace FinancialReportExample
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("=== 财务报表分析系统示例 ===");
try
{
// 创建财务报表
CreateFinancialReport();
// 财务比率分析
FinancialRatioAnalysis();
// 趋势分析
TrendAnalysis();
Console.WriteLine("
✓ 财务报表分析系统完成");
}
catch (Exception ex)
{
Console.WriteLine($"✗ 财务报表分析时出错: {ex.Message}");
}
}
static void CreateFinancialReport()
{
Console.WriteLine("
1. 创建财务报表:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
var worksheet = workbook.ActiveSheetWrap;
worksheet.Name = "利润表";
// 创建利润表结构
worksheet.Cells[1, 1].Value = "XX公司利润表";
worksheet.Cells[1, 1].Font.Bold = true;
worksheet.Cells[1, 1].Font.Size = 16;
worksheet.Cells[3, 1].Value = "项目";
worksheet.Cells[3, 2].Value = "2023年";
worksheet.Cells[3, 3].Value = "2022年";
worksheet.Cells[3, 4].Value = "增减额";
worksheet.Cells[3, 5].Value = "增减率";
// 营业收入部分
worksheet.Cells[5, 1].Value = "一、营业收入";
worksheet.Cells[5, 1].Font.Bold = true;
worksheet.Cells[6, 1].Value = " 其中:主营业务收入";
worksheet.Cells[7, 1].Value = " 其他业务收入";
// 营业成本部分
worksheet.Cells[9, 1].Value = "二、营业成本";
worksheet.Cells[9, 1].Font.Bold = true;
worksheet.Cells[10, 1].Value = " 其中:主营业务成本";
worksheet.Cells[11, 1].Value = " 其他业务成本";
// 税金及附加
worksheet.Cells[13, 1].Value = "三、税金及附加";
// 期间费用
worksheet.Cells[15, 1].Value = "四、期间费用";
worksheet.Cells[15, 1].Font.Bold = true;
worksheet.Cells[16, 1].Value = " 销售费用";
worksheet.Cells[17, 1].Value = " 管理费用";
worksheet.Cells[18, 1].Value = " 财务费用";
// 营业利润
worksheet.Cells[20, 1].Value = "五、营业利润";
worksheet.Cells[20, 1].Font.Bold = true;
// 利润总额
worksheet.Cells[22, 1].Value = "六、利润总额";
worksheet.Cells[22, 1].Font.Bold = true;
// 净利润
worksheet.Cells[24, 1].Value = "七、净利润";
worksheet.Cells[24, 1].Font.Bold = true;
// 输入示例数据
var financialData = new[]
{
// 营业收入
new { Item = "营业收入", Year2023 = 10000000, Year2022 = 8500000 },
new { Item = "主营业务收入", Year2023 = 9500000, Year2022 = 8000000 },
new { Item = "其他业务收入", Year2023 = 500000, Year2022 = 500000 },
// 营业成本
new { Item = "营业成本", Year2023 = 6000000, Year2022 = 5200000 },
new { Item = "主营业务成本", Year2023 = 5700000, Year2022 = 4900000 },
new { Item = "其他业务成本", Year2023 = 300000, Year2022 = 300000 },
// 税金及附加
new { Item = "税金及附加", Year2023 = 300000, Year2022 = 250000 },
// 期间费用
new { Item = "销售费用", Year2023 = 800000, Year2022 = 700000 },
new { Item = "管理费用", Year2023 = 600000, Year2022 = 550000 },
new { Item = "财务费用", Year2023 = 200000, Year2022 = 180000 }
};
// 填入数据并计算
int currentRow = 5;
foreach (var item in financialData)
{
worksheet.Cells[currentRow, 2].Value = item.Year2023;
worksheet.Cells[currentRow, 3].Value = item.Year2022;
// 计算增减额
worksheet.Cells[currentRow, 4].Formula = $"=B{currentRow}-C{currentRow}";
// 计算增减率
worksheet.Cells[currentRow, 5].Formula = $"=D{currentRow}/C{currentRow}";
currentRow++;
}
// 计算营业利润
worksheet.Cells[20, 2].Formula = "=B5-B9-B13-SUM(B16:B18)";
worksheet.Cells[20, 3].Formula = "=C5-C9-C13-SUM(C16:C18)";
worksheet.Cells[20, 4].Formula = "=B20-C20";
worksheet.Cells[20, 5].Formula = "=D20/C20";
// 计算利润总额(假设营业外收支为0)
worksheet.Cells[22, 2].Formula = "=B20";
worksheet.Cells[22, 3].Formula = "=C20";
worksheet.Cells[22, 4].Formula = "=B22-C22";
worksheet.Cells[22, 5].Formula = "=D22/C22";
// 计算净利润(假设所得税率为25%)
worksheet.Cells[24, 2].Formula = "=B22*0.75";
worksheet.Cells[24, 3].Formula = "=C22*0.75";
worksheet.Cells[24, 4].Formula = "=B24-C24";
worksheet.Cells[24, 5].Formula = "=D24/C24";
// 设置格式
var titleRange = worksheet.Range("A1:E1");
titleRange.Merge();
titleRange.HorizontalAlignment = XlHAlign.xlHAlignCenter;
var headerRange = worksheet.Range("A3:E3");
headerRange.Font.Bold = true;
headerRange.Interior.Color = System.Drawing.Color.LightBlue;
var mainItemRange = worksheet.Range("A5:A5,A9:A9,A15:A15,A20:A20,A22:A22,A24:A24");
mainItemRange.Font.Bold = true;
mainItemRange.Interior.Color = System.Drawing.Color.LightYellow;
worksheet.Range("B4:E24").NumberFormat = "#,##0";
worksheet.Range("E5:E24").NumberFormat = "0.00%";
worksheet.Columns["A:E"].AutoFit();
workbook.SaveAs("FinancialReport.xlsx");
Console.WriteLine(" ✓ 财务报表创建完成");
}
static void FinancialRatioAnalysis()
{
Console.WriteLine("
2. 财务比率分析:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
// 创建财务比率分析工作表
var ratioWorksheet = workbook.Worksheets.Add();
ratioWorksheet.Name = "财务比率分析";
// 比率分析结构
ratioWorksheet.Cells[1, 1].Value = "财务比率分析";
ratioWorksheet.Cells[1, 1].Font.Bold = true;
ratioWorksheet.Cells[1, 1].Font.Size = 16;
ratioWorksheet.Cells[3, 1].Value = "比率类别";
ratioWorksheet.Cells[3, 2].Value = "比率名称";
ratioWorksheet.Cells[3, 3].Value = "计算公式";
ratioWorksheet.Cells[3, 4].Value = "2023年";
ratioWorksheet.Cells[3, 5].Value = "2022年";
ratioWorksheet.Cells[3, 6].Value = "行业标准";
ratioWorksheet.Cells[3, 7].Value = "评价";
// 盈利能力比率
ratioWorksheet.Cells[5, 1].Value = "盈利能力比率";
ratioWorksheet.Cells[5, 1].Font.Bold = true;
ratioWorksheet.Cells[6, 2].Value = "销售净利率";
ratioWorksheet.Cells[6, 3].Value = "净利润/营业收入";
ratioWorksheet.Cells[6, 4].Formula = "=利润表!B24/利润表!B5";
ratioWorksheet.Cells[6, 5].Formula = "=利润表!C24/利润表!C5";
ratioWorksheet.Cells[6, 6].Value = "0.08"; // 行业标准8%
ratioWorksheet.Cells[7, 2].Value = "资产收益率(ROA)";
ratioWorksheet.Cells[7, 3].Value = "净利润/平均总资产";
ratioWorksheet.Cells[7, 4].Formula = "=利润表!B24/5000000"; // 假设平均总资产500万
ratioWorksheet.Cells[7, 5].Formula = "=利润表!C24/4500000"; // 假设平均总资产450万
ratioWorksheet.Cells[7, 6].Value = "0.06"; // 行业标准6%
ratioWorksheet.Cells[8, 2].Value = "净资产收益率(ROE)";
ratioWorksheet.Cells[8, 3].Value = "净利润/平均净资产";
ratioWorksheet.Cells[8, 4].Formula = "=利润表!B24/3000000"; // 假设平均净资产300万
ratioWorksheet.Cells[8, 5].Formula = "=利润表!C24/2800000"; // 假设平均净资产280万
ratioWorksheet.Cells[8, 6].Value = "0.12"; // 行业标准12%
// 偿债能力比率
ratioWorksheet.Cells[10, 1].Value = "偿债能力比率";
ratioWorksheet.Cells[10, 1].Font.Bold = true;
ratioWorksheet.Cells[11, 2].Value = "流动比率";
ratioWorksheet.Cells[11, 3].Value = "流动资产/流动负债";
ratioWorksheet.Cells[11, 4].Formula = "=2000000/800000"; // 假设数据
ratioWorksheet.Cells[11, 5].Formula = "=1800000/750000"; // 假设数据
ratioWorksheet.Cells[11, 6].Value = "2.0"; // 行业标准2.0
ratioWorksheet.Cells[12, 2].Value = "速动比率";
ratioWorksheet.Cells[12, 3].Value = "(流动资产-存货)/流动负债";
ratioWorksheet.Cells[12, 4].Formula = "=(2000000-500000)/800000"; // 假设数据
ratioWorksheet.Cells[12, 5].Formula = "=(1800000-450000)/750000"; // 假设数据
ratioWorksheet.Cells[12, 6].Value = "1.0"; // 行业标准1.0
ratioWorksheet.Cells[13, 2].Value = "资产负债率";
ratioWorksheet.Cells[13, 3].Value = "总负债/总资产";
ratioWorksheet.Cells[13, 4].Formula = "=1500000/5000000"; // 假设数据
ratioWorksheet.Cells[13, 5].Formula = "=1400000/4500000"; // 假设数据
ratioWorksheet.Cells[13, 6].Value = "0.5"; // 行业标准50%
// 营运能力比率
ratioWorksheet.Cells[15, 1].Value = "营运能力比率";
ratioWorksheet.Cells[15, 1].Font.Bold = true;
ratioWorksheet.Cells[16, 2].Value = "应收账款周转率";
ratioWorksheet.Cells[16, 3].Value = "营业收入/平均应收账款";
ratioWorksheet.Cells[16, 4].Formula = "=利润表!B5/600000"; // 假设平均应收账款60万
ratioWorksheet.Cells[16, 5].Formula = "=利润表!C5/550000"; // 假设平均应收账款55万
ratioWorksheet.Cells[16, 6].Value = "8"; // 行业标准8次
ratioWorksheet.Cells[17, 2].Value = "存货周转率";
ratioWorksheet.Cells[17, 3].Value = "营业成本/平均存货";
ratioWorksheet.Cells[17, 4].Formula = "=利润表!B9/800000"; // 假设平均存货80万
ratioWorksheet.Cells[17, 5].Formula = "=利润表!C9/750000"; // 假设平均存货75万
ratioWorksheet.Cells[17, 6].Value = "6"; // 行业标准6次
// 评价公式
for (int row = 6; row <= 17; row++)
{
if (row == 5 || row == 10 || row == 15) continue;
ratioWorksheet.Cells[row, 7].Formula = $"=IF(D{row}>=F{row},\"良好\",IF(D{row}>=F{row}*0.8,\"一般\",\"较差\"))\";
}
// 设置格式
var ratioHeader = ratioWorksheet.Range("A3:G3");
ratioHeader.Font.Bold = true;
ratioHeader.Interior.Color = System.Drawing.Color.LightGray;
var categoryRange = ratioWorksheet.Range("A5:A5,A10:A10,A15:A15");
categoryRange.Font.Bold = true;
categoryRange.Interior.Color = System.Drawing.Color.LightBlue;
ratioWorksheet.Range("D4:G17").NumberFormat = "0.00";
ratioWorksheet.Columns["A:G"].AutoFit();
workbook.SaveAs("FinancialRatioAnalysis.xlsx");
Console.WriteLine(" ✓ 财务比率分析完成");
}
static void TrendAnalysis()
{
Console.WriteLine("
3. 趋势分析:");
using var excelApp = ExcelFactory.BlankWorkbook();
var workbook = excelApp.ActiveWorkbook;
// 创建趋势分析工作表
var trendWorksheet = workbook.Worksheets.Add();
trendWorksheet.Name = "趋势分析";
// 趋势分析结构
trendWorksheet.Cells[1, 1].Value = "财务趋势分析";
trendWorksheet.Cells[1, 1].Font.Bold = true;
trendWorksheet.Cells[1, 1].Font.Size = 16;
// 创建5年历史数据
var years = new[] { "2019", "2020", "2021", "2022", "2023" };
var revenueData = new[] { 6000000, 6500000, 7500000, 8500000, 10000000 };
var profitData = new[] { 400000, 450000, 550000, 650000, 750000 };
var assetData = new[] { 3500000, 3800000, 4200000, 4500000, 5000000 };
// 写入历史数据
trendWorksheet.Cells[3, 1].Value = "年份";
for (int i = 0; i < years.Length; i++)
{
trendWorksheet.Cells[3, i + 2].Value = years[i];
}
trendWorksheet.Cells[4, 1].Value = "营业收入";
trendWorksheet.Cells[5, 1].Value = "净利润";
trendWorksheet.Cells[6, 1].Value = "总资产";
for (int i = 0; i < years.Length; i++)
{
trendWorksheet.Cells[4, i + 2].Value = revenueData[i];
trendWorksheet.Cells[5, i + 2].Value = profitData[i];
trendWorksheet.Cells[6, i + 2].Value = assetData[i];
}
// 计算增长率
trendWorksheet.Cells[8, 1].Value = "营业收入增长率";
trendWorksheet.Cells[9, 1].Value = "净利润增长率";
trendWorksheet.Cells[10, 1].Value = "资产增长率";
for (int i = 1; i < years.Length; i++)
{
trendWorksheet.Cells[8, i + 2].Formula = $"=(D4-C4)/C4";
trendWorksheet.Cells[9, i + 2].Formula = $"=(D5-C5)/C5";
trendWorksheet.Cells[10, i + 2].Formula = $"=(D6-C6)/C6";
}
// 复合增长率计算
trendWorksheet.Cells[12, 1].Value = "复合增长率(CAGR)";
trendWorksheet.Cells[12, 1].Font.Bold = true;
trendWorksheet.Cells[13, 1].Value = "营业收入CAGR";
trendWorksheet.Cells[13, 2].Formula = "=(F4/B4)^(1/4)-1"; // 4年复合增长
trendWorksheet.Cells[14, 1].Value = "净利润CAGR";
trendWorksheet.Cells[14, 2].Formula = "=(F5/B5)^(1/4)-1";
trendWorksheet.Cells[15, 1].Value = "资产CAGR";
trendWorksheet.Cells[15, 2].Formula = "=(F6/B6)^(1/4)-1";
// 趋势预测
trendWorksheet.Cells[17, 1].Value = "趋势预测(线性回归)";
trendWorksheet.Cells[17, 1].Font.Bold = true;
// 使用FORECAST.LINEAR函数进行预测
trendWorksheet.Cells[18, 1].Value = "2024年营业收入预测";
trendWorksheet.Cells[18, 2].Formula = "=FORECAST.LINEAR(6,B4:F4,{1,2,3,4,5})";
trendWorksheet.Cells[19, 1].Value = "2024年净利润预测";
trendWorksheet.Cells[19, 2].Formula = "=FORECAST.LINEAR(6,B5:F5,{1,2,3,4,5})";
// 设置格式
var headerRange = trendWorksheet.Range("A3:F3");
headerRange.Font.Bold = true;
headerRange.Interior.Color = System.Drawing.Color.LightBlue;
var dataRange = trendWorksheet.Range("A4:F6");
dataRange.Interior.Color = System.Drawing.Color.WhiteSmoke;
var growthRange = trendWorksheet.Range("A8:F10");
growthRange.Interior.Color = System.Drawing.Color.LightYellow;
var cagrRange = trendWorksheet.Range("A12:B15");
cagrRange.Interior.Color = System.Drawing.Color.LightGreen;
var forecastRange = trendWorksheet.Range("A17:B19");
forecastRange.Interior.Color = System.Drawing.Color.LightPink;
trendWorksheet.Range("B4:F6").NumberFormat = "#,##0";
trendWorksheet.Range("C8:F10").NumberFormat = "0.00%";
trendWorksheet.Range("B13:B15").NumberFormat = "0.00%";
trendWorksheet.Range("B18:B19").NumberFormat = "#,##0";
trendWorksheet.Columns["A:F"].AutoFit();
workbook.SaveAs("TrendAnalysis.xlsx");
Console.WriteLine(" ✓ 趋势分析完成");
}
}
}本章总结
本章详细介绍了MudTools.OfficeInterop.Excel库在公式与函数应用方面的强大功能。通过学习本章内容,您可以:
- 掌握基础公式操作:包括算术运算、统计函数、逻辑函数和文本函数
- 了解高级公式应用:特别是数组公式和动态数组公式的使用
- 学会自定义函数与VBA集成:实现复杂的业务逻辑
- 掌握公式错误处理与调试:确保公式的稳定性和正确性
- 了解公式性能优化:提升大型数据处理的效率
- 学习实际应用案例:财务报表分析等实际业务场景
这些功能在企业级Excel自动化应用中至关重要,可以帮助您构建复杂的数据处理和分析系统。通过本章的学习,您将能够:
- 熟练使用Excel公式进行各种数学运算和统计分析
- 掌握数组公式和动态数组公式的高级应用技巧
- 实现自定义业务逻辑和复杂的财务分析功能
- 优化公式性能,处理大规模数据集
- 构建完整的财务报表分析系统
MudTools.OfficeInterop.Excel库提供了强大的API支持,使得在.NET环境中进行Excel公式操作变得简单高效。无论是基础的单元格计算还是复杂的财务分析,该库都能提供完整的解决方案。