第17章-性能优化与最佳实践

第十七章:性能优化与最佳实践

17.1 性能优化原则

17.1.1 批量操作优化

public class BatchOperations
{
    // ❌ 不推荐:逐个单元格操作
    public void SlowWay(Worksheet sheet)
    {
        for (int i = 0; i < 1000; i++)
        {
            sheet[i, 0] = i;
            sheet.SetCellStyle(i, 0, new WorksheetRangeStyle { Bold = true });
        }
    }
    
    // ✅ 推荐:批量操作
    public void FastWay(Worksheet sheet)
    {
        // 使用BeginUpdate和EndUpdate包裹批量操作
        sheet.BeginUpdate();
        try
        {
            for (int i = 0; i < 1000; i++)
            {
                sheet[i, 0] = i;
            }
            
            // 一次性设置样式
            sheet.SetRangeStyles("A1:A1000", new WorksheetRangeStyle { Bold = true });
        }
        finally
        {
            sheet.EndUpdate();
        }
    }
}

17.1.2 禁用自动计算

public class CalculationOptimization
{
    public void OptimizeCalculation(ReoGridControl grid, Worksheet sheet)
    {
        // 大量数据操作时禁用自动计算
        grid.SetSettings(WorkbookSettings.Formula_AutoCalculate, false);
        
        // 执行数据操作
        for (int i = 0; i < 10000; i++)
        {
            sheet[i, 0] = i;
            sheet[i, 1] = $"=A{i+1}*2";
        }
        
        // 手动触发一次计算
        sheet.RecalculateAll();
        
        // 重新启用自动计算
        grid.SetSettings(WorkbookSettings.Formula_AutoCalculate, true);
    }
}

17.2 内存管理

17.2.1 大数据集处理

public class LargeDataHandling
{
    public void LoadLargeData(Worksheet sheet, DataTable dataTable)
    {
        sheet.BeginUpdate();
        try
        {
            // 关闭不必要的功能
            var grid = sheet.Workbook.ControlAdapter as ReoGridControl;
            grid.SetSettings(WorkbookSettings.View_ShowGridLine, false);
            
            // 批量加载数据
            int row = 0;
            foreach (DataRow dataRow in dataTable.Rows)
            {
                for (int col = 0; col < dataTable.Columns.Count; col++)
                {
                    sheet[row, col] = dataRow[col];
                }
                row++;
            }
        }
        finally
        {
            sheet.EndUpdate();
        }
    }
}

17.2.2 资源释放

public class ResourceManagement
{
    public void ProperDisposal()
    {
        ReoGridControl grid = null;
        try
        {
            grid = new ReoGridControl();
            // 使用grid
        }
        finally
        {
            grid?.Dispose();
        }
    }
}

17.3 最佳实践

17.3.1 代码组织

// ✅ 推荐:使用辅助类封装常用操作
public static class ReoGridExtensions
{
    public static void FastSetData<T>(this Worksheet sheet, int startRow, int startCol, T[,] data)
    {
        sheet.BeginUpdate();
        try
        {
            int rows = data.GetLength(0);
            int cols = data.GetLength(1);
            
            for (int r = 0; r < rows; r++)
            {
                for (int c = 0; c < cols; c++)
                {
                    sheet[startRow + r, startCol + c] = data[r, c];
                }
            }
        }
        finally
        {
            sheet.EndUpdate();
        }
    }
}

17.3.2 错误处理

public class ErrorHandlingBestPractices
{
    public bool SafeSetCellValue(Worksheet sheet, string address, object value)
    {
        try
        {
            sheet[address] = value;
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"设置单元格 {address} 失败: {ex.Message}");
            return false;
        }
    }
}

17.3.3 性能监控

using System.Diagnostics;

public class PerformanceMonitoring
{
    public void MeasurePerformance(Action operation, string operationName)
    {
        var sw = Stopwatch.StartNew();
        
        operation();
        
        sw.Stop();
        Console.WriteLine($"{operationName} 耗时: {sw.ElapsedMilliseconds}ms");
    }
}

17.4 常见性能问题

17.4.1 避免频繁重绘

public class AvoidFrequentRedraw
{
    // ❌ 不推荐
    public void BadPractice(Worksheet sheet)
    {
        for (int i = 0; i < 100; i++)
        {
            sheet[i, 0] = i;
            // 每次都会触发重绘
        }
    }
    
    // ✅ 推荐
    public void GoodPractice(Worksheet sheet)
    {
        sheet.BeginUpdate();  // 暂停重绘
        for (int i = 0; i < 100; i++)
        {
            sheet[i, 0] = i;
        }
        sheet.EndUpdate();  // 一次性重绘
    }
}

17.5 本章小结

本章介绍了ReoGrid的性能优化技巧和最佳实践。

📚 下一章预告

第十八章将学习WPF平台集成。

posted @ 2025-12-31 14:07  我才是银古  阅读(7)  评论(0)    收藏  举报