Skip to content

公式调试、性能优化与实战 ​

本页是公式与函数应用的续篇,可结合前文一起阅读。

公式错误处理与调试 ​

公式错误处理 ​

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库在公式与函数应用方面的强大功能。通过学习本章内容,您可以:

  1. 掌握基础公式操作:包括算术运算、统计函数、逻辑函数和文本函数
  2. 了解高级公式应用:特别是数组公式和动态数组公式的使用
  3. 学会自定义函数与VBA集成:实现复杂的业务逻辑
  4. 掌握公式错误处理与调试:确保公式的稳定性和正确性
  5. 了解公式性能优化:提升大型数据处理的效率
  6. 学习实际应用案例:财务报表分析等实际业务场景

这些功能在企业级Excel自动化应用中至关重要,可以帮助您构建复杂的数据处理和分析系统。通过本章的学习,您将能够:

  • 熟练使用Excel公式进行各种数学运算和统计分析
  • 掌握数组公式和动态数组公式的高级应用技巧
  • 实现自定义业务逻辑和复杂的财务分析功能
  • 优化公式性能,处理大规模数据集
  • 构建完整的财务报表分析系统

MudTools.OfficeInterop.Excel库提供了强大的API支持,使得在.NET环境中进行Excel公式操作变得简单高效。无论是基础的单元格计算还是复杂的财务分析,该库都能提供完整的解决方案。