第05章-数据类型与格式化

第五章:数据类型与格式化

5.1 数据类型概述

5.1.1 ReoGrid支持的数据类型

ReoGrid支持多种数据类型,可以自动识别和处理不同类型的数据:

using unvell.ReoGrid;
using unvell.ReoGrid.Data;

public class DataTypeExample
{
    private Worksheet sheet;
    
    public void DemonstrateDataTypes()
    {
        // 文本类型
        sheet["A1"] = "Hello ReoGrid";
        
        // 数值类型
        sheet["A2"] = 123.456;
        
        // 日期时间类型
        sheet["A3"] = DateTime.Now;
        
        // 布尔类型
        sheet["A4"] = true;
        
        // 公式类型
        sheet["A5"] = "=SUM(A2:A4)";
        
        // null值
        sheet["A6"] = null;
    }
}

5.1.2 数据类型自动识别

public class DataTypeDetection
{
    public void AutoDetection(Worksheet sheet)
    {
        // ReoGrid会自动检测数据类型
        sheet["B1"] = "123";        // 识别为文本
        sheet["B2"] = 123;          // 识别为数字
        sheet["B3"] = "2024-01-01"; // 可能识别为日期
        
        // 获取单元格的数据格式
        var cell = sheet.GetCell("B2");
        Console.WriteLine($"数据格式: {cell.DataFormat}");
    }
}

5.2 数字格式化

5.2.1 基本数字格式

using unvell.ReoGrid.DataFormat;

public class NumberFormatting
{
    private Worksheet sheet;
    
    /// <summary>
    /// 设置基本数字格式
    /// </summary>
    public void SetBasicNumberFormat()
    {
        // 显示2位小数
        sheet.SetRangeDataFormat("A1:A10", CellDataFormatFlag.Number,
            new NumberDataFormatter.NumberFormatArgs
            {
                DecimalPlaces = 2,
                UseSeparator = true
            });
        
        sheet["A1"] = 12345.6789;  // 显示为: 12,345.68
    }
    
    /// <summary>
    /// 负数显示样式
    /// </summary>
    public void SetNegativeNumberStyle()
    {
        sheet.SetRangeDataFormat("B1:B10", CellDataFormatFlag.Number,
            new NumberDataFormatter.NumberFormatArgs
            {
                DecimalPlaces = 2,
                UseSeparator = true,
                NegativeStyle = NumberDataFormatter.NumberNegativeStyle.RedBrackets
            });
        
        sheet["B1"] = -1234.56;  // 显示为: (1,234.56) 红色
    }
    
    /// <summary>
    /// 自定义数字格式
    /// </summary>
    public void SetCustomNumberFormat()
    {
        // 使用自定义格式模式
        sheet.SetRangeDataFormat("C1:C10", CellDataFormatFlag.Number,
            new NumberDataFormatter.NumberFormatArgs
            {
                Pattern = "#,##0.00"  // 千位分隔符,两位小数
            });
    }
}

5.2.2 科学计数法

public class ScientificNotation
{
    public void SetScientificFormat(Worksheet sheet)
    {
        sheet.SetRangeDataFormat("D1:D10", CellDataFormatFlag.Number,
            new NumberDataFormatter.NumberFormatArgs
            {
                Pattern = "0.00E+00"  // 科学计数法格式
            });
        
        sheet["D1"] = 123456789;  // 显示为: 1.23E+08
    }
}

5.3 货币格式化

5.3.1 基本货币格式

using unvell.ReoGrid.DataFormat;

public class CurrencyFormatting
{
    private Worksheet sheet;
    
    /// <summary>
    /// 设置货币格式
    /// </summary>
    public void SetCurrencyFormat()
    {
        sheet.SetRangeDataFormat("E1:E10", CellDataFormatFlag.Currency,
            new CurrencyDataFormatter.CurrencyFormatArgs
            {
                DecimalPlaces = 2,
                UseSeparator = true,
                Symbol = "¥",
                SymbolPosition = CurrencyDataFormatter.CurrencySymbolPosition.Left
            });
        
        sheet["E1"] = 10500.50;  // 显示为: ¥10,500.50
    }
    
    /// <summary>
    /// 美元格式
    /// </summary>
    public void SetDollarFormat()
    {
        sheet.SetRangeDataFormat("F1:F10", CellDataFormatFlag.Currency,
            new CurrencyDataFormatter.CurrencyFormatArgs
            {
                DecimalPlaces = 2,
                UseSeparator = true,
                Symbol = "$",
                SymbolPosition = CurrencyDataFormatter.CurrencySymbolPosition.Left,
                NegativeStyle = NumberDataFormatter.NumberNegativeStyle.Minus
            });
        
        sheet["F1"] = -75.88;  // 显示为: -$75.88
    }
    
    /// <summary>
    /// 欧元格式
    /// </summary>
    public void SetEuroFormat()
    {
        sheet.SetRangeDataFormat("G1:G10", CellDataFormatFlag.Currency,
            new CurrencyDataFormatter.CurrencyFormatArgs
            {
                DecimalPlaces = 2,
                UseSeparator = true,
                Symbol = "€",
                SymbolPosition = CurrencyDataFormatter.CurrencySymbolPosition.Right
            });
        
        sheet["G1"] = 1234.56;  // 显示为: 1,234.56€
    }
}

5.4 日期时间格式化

5.4.1 日期格式

using unvell.ReoGrid.DataFormat;

public class DateTimeFormatting
{
    private Worksheet sheet;
    
    /// <summary>
    /// 标准日期格式
    /// </summary>
    public void SetDateFormat()
    {
        sheet.SetRangeDataFormat("H1:H10", CellDataFormatFlag.DateTime,
            new DateTimeDataFormatter.DateTimeFormatArgs
            {
                Format = "yyyy-MM-dd",
                CultureName = "zh-CN"
            });
        
        sheet["H1"] = DateTime.Now;  // 显示为: 2024-12-31
    }
    
    /// <summary>
    /// 中文日期格式
    /// </summary>
    public void SetChineseDateFormat()
    {
        sheet.SetRangeDataFormat("I1:I10", CellDataFormatFlag.DateTime,
            new DateTimeDataFormatter.DateTimeFormatArgs
            {
                Format = "yyyy年MM月dd日",
                CultureName = "zh-CN"
            });
        
        sheet["I1"] = DateTime.Now;  // 显示为: 2024年12月31日
    }
    
    /// <summary>
    /// 时间格式
    /// </summary>
    public void SetTimeFormat()
    {
        sheet.SetRangeDataFormat("J1:J10", CellDataFormatFlag.DateTime,
            new DateTimeDataFormatter.DateTimeFormatArgs
            {
                Format = "HH:mm:ss",
                CultureName = "zh-CN"
            });
        
        sheet["J1"] = DateTime.Now;  // 显示为: 14:30:45
    }
    
    /// <summary>
    /// 完整日期时间格式
    /// </summary>
    public void SetFullDateTimeFormat()
    {
        sheet.SetRangeDataFormat("K1:K10", CellDataFormatFlag.DateTime,
            new DateTimeDataFormatter.DateTimeFormatArgs
            {
                Format = "yyyy-MM-dd HH:mm:ss",
                CultureName = "zh-CN"
            });
        
        sheet["K1"] = DateTime.Now;  // 显示为: 2024-12-31 14:30:45
    }
}

5.4.2 常用日期格式模式

public class DateFormatPatterns
{
    public Dictionary<string, string> GetCommonDateFormats()
    {
        return new Dictionary<string, string>
        {
            { "yyyy-MM-dd", "2024-12-31" },
            { "yyyy/MM/dd", "2024/12/31" },
            { "dd-MM-yyyy", "31-12-2024" },
            { "MM/dd/yyyy", "12/31/2024" },
            { "yyyy年MM月dd日", "2024年12月31日" },
            { "MMMM dd, yyyy", "December 31, 2024" },
            { "dddd, MMMM dd, yyyy", "Tuesday, December 31, 2024" },
            { "HH:mm", "14:30" },
            { "HH:mm:ss", "14:30:45" },
            { "hh:mm tt", "02:30 PM" },
            { "yyyy-MM-dd HH:mm:ss", "2024-12-31 14:30:45" },
            { "yyyy-MM-ddTHH:mm:ss", "2024-12-31T14:30:45" }
        };
    }
}

5.5 百分比格式化

5.5.1 基本百分比格式

public class PercentFormatting
{
    private Worksheet sheet;
    
    /// <summary>
    /// 设置百分比格式
    /// </summary>
    public void SetPercentFormat()
    {
        sheet.SetRangeDataFormat("L1:L10", CellDataFormatFlag.Percent,
            new NumberDataFormatter.NumberFormatArgs
            {
                DecimalPlaces = 2
            });
        
        sheet["L1"] = 0.1234;  // 显示为: 12.34%
        sheet["L2"] = 0.5;     // 显示为: 50.00%
        sheet["L3"] = 1.0;     // 显示为: 100.00%
    }
    
    /// <summary>
    /// 不同小数位数的百分比
    /// </summary>
    public void SetPercentWithDifferentDecimals()
    {
        // 0位小数
        sheet.SetRangeDataFormat("M1", CellDataFormatFlag.Percent,
            new NumberDataFormatter.NumberFormatArgs { DecimalPlaces = 0 });
        sheet["M1"] = 0.456;  // 显示为: 46%
        
        // 1位小数
        sheet.SetRangeDataFormat("M2", CellDataFormatFlag.Percent,
            new NumberDataFormatter.NumberFormatArgs { DecimalPlaces = 1 });
        sheet["M2"] = 0.456;  // 显示为: 45.6%
        
        // 3位小数
        sheet.SetRangeDataFormat("M3", CellDataFormatFlag.Percent,
            new NumberDataFormatter.NumberFormatArgs { DecimalPlaces = 3 });
        sheet["M3"] = 0.456;  // 显示为: 45.600%
    }
}

5.6 文本格式化

5.6.1 文本格式

public class TextFormatting
{
    private Worksheet sheet;
    
    /// <summary>
    /// 设置文本格式
    /// </summary>
    public void SetTextFormat()
    {
        sheet.SetRangeDataFormat("N1:N10", CellDataFormatFlag.Text);
        
        sheet["N1"] = "Plain text";
        sheet["N2"] = "123";      // 作为文本显示,不是数字
        sheet["N3"] = "01234";    // 保留前导零
    }
    
    /// <summary>
    /// 电话号码格式
    /// </summary>
    public void SetPhoneFormat()
    {
        sheet.SetRangeDataFormat("O1:O10", CellDataFormatFlag.Text,
            new TextDataFormatter.FormatArgs
            {
                Pattern = "(000) 000-0000"
            });
        
        sheet["O1"] = "13812345678";  // 显示为: (138) 123-45678
    }
}

5.7 自定义格式化

5.7.1 创建自定义格式化器

using unvell.ReoGrid.DataFormat;

public class CustomFormatter : IDataFormatter
{
    public string FormatCell(Cell cell)
    {
        if (cell.Data == null) return string.Empty;
        
        double value = Convert.ToDouble(cell.Data);
        
        // 自定义格式:负数用方括号,正数用加号
        if (value < 0)
        {
            return $"[{Math.Abs(value):###,###,##0.00}]";
        }
        else if (value > 0)
        {
            return $"+{value:###,###,##0.00}";
        }
        else
        {
            return "0.00";
        }
    }
    
    public bool PerformTestFormat()
    {
        return true;
    }
}

// 使用自定义格式化器
public class UseCustomFormatter
{
    public void ApplyCustomFormatter(Worksheet sheet)
    {
        // 注册自定义格式化器
        var formatter = new CustomFormatter();
        
        // 应用到单元格
        sheet.SetCellDataFormat("P1", CellDataFormatFlag.Custom, formatter);
        
        sheet["P1"] = 1000.5;   // 显示为: +1,000.50
        sheet["P2"] = -500.25;  // 显示为: [500.25]
        sheet["P3"] = 0;        // 显示为: 0.00
    }
}

5.7.2 条件格式化器

public class ConditionalFormatter : IDataFormatter
{
    public string FormatCell(Cell cell)
    {
        if (cell.Data == null) return string.Empty;
        
        double value = Convert.ToDouble(cell.Data);
        
        // 根据值的大小使用不同格式
        if (value >= 1000000)
        {
            return $"{value / 1000000:0.00}M";  // 百万
        }
        else if (value >= 1000)
        {
            return $"{value / 1000:0.00}K";     // 千
        }
        else
        {
            return value.ToString("0.00");
        }
    }
    
    public bool PerformTestFormat()
    {
        return true;
    }
}

5.8 格式化最佳实践

5.8.1 性能优化

public class FormatPerformance
{
    /// <summary>
    /// 批量设置格式(推荐)
    /// </summary>
    public void BatchFormatting(Worksheet sheet)
    {
        // 一次性设置整个区域的格式
        sheet.SetRangeDataFormat("A1:Z100", CellDataFormatFlag.Number,
            new NumberDataFormatter.NumberFormatArgs
            {
                DecimalPlaces = 2,
                UseSeparator = true
            });
    }
    
    /// <summary>
    /// 避免逐个单元格设置(不推荐)
    /// </summary>
    public void IndividualFormatting(Worksheet sheet)
    {
        // 性能较差的方式
        for (int i = 0; i < 100; i++)
        {
            sheet.SetCellDataFormat(i, 0, CellDataFormatFlag.Number);
        }
    }
}

5.8.2 格式化模板

public class FormatTemplates
{
    private Worksheet sheet;
    
    /// <summary>
    /// 创建标准报表格式模板
    /// </summary>
    public void CreateReportTemplate()
    {
        // 标题行 - 文本
        sheet.SetRangeDataFormat("A1:E1", CellDataFormatFlag.Text);
        
        // 日期列
        sheet.SetRangeDataFormat("A2:A100", CellDataFormatFlag.DateTime,
            new DateTimeDataFormatter.DateTimeFormatArgs
            {
                Format = "yyyy-MM-dd"
            });
        
        // 名称列 - 文本
        sheet.SetRangeDataFormat("B2:B100", CellDataFormatFlag.Text);
        
        // 数量列 - 整数
        sheet.SetRangeDataFormat("C2:C100", CellDataFormatFlag.Number,
            new NumberDataFormatter.NumberFormatArgs
            {
                DecimalPlaces = 0,
                UseSeparator = true
            });
        
        // 单价列 - 货币
        sheet.SetRangeDataFormat("D2:D100", CellDataFormatFlag.Currency,
            new CurrencyDataFormatter.CurrencyFormatArgs
            {
                DecimalPlaces = 2,
                Symbol = "¥",
                SymbolPosition = CurrencyDataFormatter.CurrencySymbolPosition.Left
            });
        
        // 总计列 - 货币
        sheet.SetRangeDataFormat("E2:E100", CellDataFormatFlag.Currency,
            new CurrencyDataFormatter.CurrencyFormatArgs
            {
                DecimalPlaces = 2,
                Symbol = "¥",
                SymbolPosition = CurrencyDataFormatter.CurrencySymbolPosition.Left
            });
    }
}

5.9 格式化工具类

5.9.1 通用格式化助手

using unvell.ReoGrid;
using unvell.ReoGrid.DataFormat;

public static class FormatHelper
{
    /// <summary>
    /// 快速设置货币格式(人民币)
    /// </summary>
    public static void SetRMBFormat(this Worksheet sheet, string range)
    {
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.Currency,
            new CurrencyDataFormatter.CurrencyFormatArgs
            {
                DecimalPlaces = 2,
                UseSeparator = true,
                Symbol = "¥",
                SymbolPosition = CurrencyDataFormatter.CurrencySymbolPosition.Left
            });
    }
    
    /// <summary>
    /// 快速设置日期格式
    /// </summary>
    public static void SetStandardDateFormat(this Worksheet sheet, string range)
    {
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.DateTime,
            new DateTimeDataFormatter.DateTimeFormatArgs
            {
                Format = "yyyy-MM-dd",
                CultureName = "zh-CN"
            });
    }
    
    /// <summary>
    /// 快速设置百分比格式
    /// </summary>
    public static void SetPercentFormat(this Worksheet sheet, string range, int decimals = 2)
    {
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.Percent,
            new NumberDataFormatter.NumberFormatArgs
            {
                DecimalPlaces = decimals
            });
    }
    
    /// <summary>
    /// 清除格式
    /// </summary>
    public static void ClearFormat(this Worksheet sheet, string range)
    {
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.General);
    }
}

// 使用示例
public class UseFormatHelper
{
    public void Example(Worksheet sheet)
    {
        // 使用扩展方法快速设置格式
        sheet.SetRMBFormat("D2:D100");
        sheet.SetStandardDateFormat("A2:A100");
        sheet.SetPercentFormat("E2:E100", 1);
    }
}

5.10 本章小结

本章详细介绍了ReoGrid中的数据类型和格式化功能:

✅ 主要内容

  1. 数据类型

    • 文本、数值、日期、布尔等基本类型
    • 数据类型自动识别
  2. 数字格式化

    • 小数位数控制
    • 千位分隔符
    • 负数显示样式
    • 科学计数法
  3. 货币格式化

    • 人民币、美元、欧元等
    • 货币符号位置控制
  4. 日期时间格式化

    • 多种日期格式
    • 时间格式
    • 自定义日期时间模式
  5. 百分比格式化

    • 小数位数控制
    • 自动转换显示
  6. 自定义格式化

    • 创建自定义格式化器
    • 条件格式化
  7. 最佳实践

    • 性能优化技巧
    • 格式化模板
    • 通用工具类

📚 下一章预告

第六章将学习样式与外观定制,包括字体、颜色、边框、对齐等视觉效果设置。


继续学习第六章:样式与外观定制!

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