第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中的数据类型和格式化功能:
✅ 主要内容
-
数据类型
- 文本、数值、日期、布尔等基本类型
- 数据类型自动识别
-
数字格式化
- 小数位数控制
- 千位分隔符
- 负数显示样式
- 科学计数法
-
货币格式化
- 人民币、美元、欧元等
- 货币符号位置控制
-
日期时间格式化
- 多种日期格式
- 时间格式
- 自定义日期时间模式
-
百分比格式化
- 小数位数控制
- 自动转换显示
-
自定义格式化
- 创建自定义格式化器
- 条件格式化
-
最佳实践
- 性能优化技巧
- 格式化模板
- 通用工具类
📚 下一章预告
第六章将学习样式与外观定制,包括字体、颜色、边框、对齐等视觉效果设置。
继续学习第六章:样式与外观定制!

浙公网安备 33010602011771号