第04章-工作表与单元格操作

第四章:工作表与单元格操作

4.1 单元格数据读写

4.1.1 基本读写操作

using unvell.ReoGrid;

public class CellBasicOperations
{
    private Worksheet sheet;
    
    public CellBasicOperations(ReoGridControl grid)
    {
        sheet = grid.CurrentWorksheet;
    }
    
    /// <summary>
    /// 写入数据的多种方式
    /// </summary>
    public void WriteDataExamples()
    {
        // 方式1:使用字符串地址
        sheet["A1"] = "Hello ReoGrid";
        
        // 方式2:使用数字索引 [row, col]
        sheet[0, 1] = 12345;
        
        // 方式3:使用CellPosition
        sheet.SetCellData(new CellPosition("C1"), DateTime.Now);
        
        // 方式4:使用行列索引
        sheet.SetCellData(0, 3, true);
        
        // 方式5:指定数据格式
        sheet.SetCellData(0, 4, "123.45", CellDataFormatFlag.Number);
    }
    
    /// <summary>
    /// 读取数据的多种方式
    /// </summary>
    public void ReadDataExamples()
    {
        // 方式1:使用字符串地址
        object value1 = sheet["A1"];
        
        // 方式2:使用数字索引
        object value2 = sheet[0, 1];
        
        // 方式3:使用GetCellData
        object value3 = sheet.GetCellData(0, 2);
        
        // 方式4:获取Cell对象
        var cell = sheet.GetCell(0, 3);
        if (cell != null)
        {
            object data = cell.Data;
            string text = cell.DisplayText;
        }
    }
}

4.1.2 类型转换与处理

using System;
using unvell.ReoGrid;

public class CellDataTypeOperations
{
    private Worksheet sheet;
    
    public CellDataTypeOperations(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 获取字符串类型数据
    /// </summary>
    public string GetStringValue(string address)
    {
        var cell = sheet.GetCell(new CellPosition(address));
        return cell?.Data?.ToString() ?? string.Empty;
    }
    
    /// <summary>
    /// 获取数值类型数据
    /// </summary>
    public double? GetNumericValue(string address)
    {
        var cell = sheet.GetCell(new CellPosition(address));
        if (cell != null && cell.Data != null)
        {
            if (double.TryParse(cell.Data.ToString(), out double result))
            {
                return result;
            }
        }
        return null;
    }
    
    /// <summary>
    /// 获取日期类型数据
    /// </summary>
    public DateTime? GetDateTimeValue(string address)
    {
        var cell = sheet.GetCell(new CellPosition(address));
        if (cell != null && cell.Data is DateTime dt)
        {
            return dt;
        }
        return null;
    }
    
    /// <summary>
    /// 获取布尔类型数据
    /// </summary>
    public bool? GetBooleanValue(string address)
    {
        var cell = sheet.GetCell(new CellPosition(address));
        if (cell != null && cell.Data is bool b)
        {
            return b;
        }
        return null;
    }
}

4.1.3 批量数据操作

using System.Collections.Generic;
using unvell.ReoGrid;

public class BatchDataOperations
{
    private Worksheet sheet;
    
    public BatchDataOperations(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 批量写入二维数组数据
    /// </summary>
    public void WriteBatch2DArray(int startRow, int startCol, object[,] data)
    {
        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];
            }
        }
    }
    
    /// <summary>
    /// 批量写入列表数据
    /// </summary>
    public void WriteListData<T>(int startRow, int startCol, List<T> dataList)
    {
        var properties = typeof(T).GetProperties();
        
        // 写入表头
        for (int i = 0; i < properties.Length; i++)
        {
            sheet[startRow, startCol + i] = properties[i].Name;
        }
        
        // 写入数据
        for (int row = 0; row < dataList.Count; row++)
        {
            var item = dataList[row];
            for (int col = 0; col < properties.Length; col++)
            {
                var value = properties[col].GetValue(item);
                sheet[startRow + row + 1, startCol + col] = value;
            }
        }
    }
    
    /// <summary>
    /// 批量读取区域数据
    /// </summary>
    public object[,] ReadRangeData(string range)
    {
        var rangePos = new RangePosition(range);
        object[,] data = new object[rangePos.Rows, rangePos.Cols];
        
        for (int r = 0; r < rangePos.Rows; r++)
        {
            for (int c = 0; c < rangePos.Cols; c++)
            {
                data[r, c] = sheet[rangePos.Row + r, rangePos.Col + c];
            }
        }
        
        return data;
    }
    
    /// <summary>
    /// 从对象列表读取数据
    /// </summary>
    public List<T> ReadToList<T>(int startRow, int startCol, int rowCount) where T : new()
    {
        var list = new List<T>();
        var properties = typeof(T).GetProperties();
        
        for (int r = 0; r < rowCount; r++)
        {
            var item = new T();
            for (int c = 0; c < properties.Length; c++)
            {
                var cell = sheet.GetCell(startRow + r, startCol + c);
                if (cell != null)
                {
                    var prop = properties[c];
                    object value = Convert.ChangeType(cell.Data, prop.PropertyType);
                    prop.SetValue(item, value);
                }
            }
            list.Add(item);
        }
        
        return list;
    }
}

4.2 数据格式化

4.2.1 内置格式

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

public class DataFormatting
{
    private Worksheet sheet;
    
    public DataFormatting(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 设置数字格式
    /// </summary>
    public void SetNumberFormat(string range)
    {
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.Number);
    }
    
    /// <summary>
    /// 设置货币格式
    /// </summary>
    public void SetCurrencyFormat(string range)
    {
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.Currency);
    }
    
    /// <summary>
    /// 设置百分比格式
    /// </summary>
    public void SetPercentFormat(string range)
    {
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.Percent);
    }
    
    /// <summary>
    /// 设置日期格式
    /// </summary>
    public void SetDateFormat(string range)
    {
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.DateTime);
    }
    
    /// <summary>
    /// 设置时间格式
    /// </summary>
    public void SetTimeFormat(string range)
    {
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.DateTime, 
            new DateTimeDataFormatter.DateTimeFormatArgs
            {
                Format = "HH:mm:ss"
            });
    }
}

4.2.2 自定义格式

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

public class CustomFormatting
{
    private Worksheet sheet;
    
    public CustomFormatting(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 自定义数字格式
    /// </summary>
    public void SetCustomNumberFormat(string range, string pattern)
    {
        // 例如: "#,##0.00" 表示千位分隔符和两位小数
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.Number,
            new NumberDataFormatter.NumberFormatArgs
            {
                Pattern = pattern
            });
    }
    
    /// <summary>
    /// 自定义日期格式
    /// </summary>
    public void SetCustomDateFormat(string range, string format)
    {
        // 例如: "yyyy-MM-dd HH:mm:ss"
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.DateTime,
            new DateTimeDataFormatter.DateTimeFormatArgs
            {
                Format = format
            });
    }
    
    /// <summary>
    /// 电话号码格式
    /// </summary>
    public void SetPhoneFormat(string range)
    {
        sheet.SetRangeDataFormat(range, CellDataFormatFlag.Text,
            new TextDataFormatter.FormatArgs
            {
                Pattern = "(000) 000-0000"
            });
    }
}

4.3 单元格样式

4.3.1 字体样式

using System.Drawing;
using unvell.ReoGrid.Data;

public class FontStyling
{
    private Worksheet sheet;
    
    public FontStyling(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 设置字体基本属性
    /// </summary>
    public void SetFontStyle(string range)
    {
        sheet.SetRangeStyles(range, new WorksheetRangeStyle
        {
            Flag = PlainStyleFlag.FontName | 
                   PlainStyleFlag.FontSize | 
                   PlainStyleFlag.FontColor,
            FontName = "微软雅黑",
            FontSize = 12,
            FontColor = Color.Blue
        });
    }
    
    /// <summary>
    /// 设置粗体
    /// </summary>
    public void SetBold(string range, bool bold = true)
    {
        sheet.SetRangeStyles(range, new WorksheetRangeStyle
        {
            Flag = PlainStyleFlag.FontBold,
            Bold = bold
        });
    }
    
    /// <summary>
    /// 设置斜体
    /// </summary>
    public void SetItalic(string range, bool italic = true)
    {
        sheet.SetRangeStyles(range, new WorksheetRangeStyle
        {
            Flag = PlainStyleFlag.FontItalic,
            Italic = italic
        });
    }
    
    /// <summary>
    /// 设置下划线
    /// </summary>
    public void SetUnderline(string range, bool underline = true)
    {
        sheet.SetRangeStyles(range, new WorksheetRangeStyle
        {
            Flag = PlainStyleFlag.FontUnderline,
            Underline = underline
        });
    }
    
    /// <summary>
    /// 设置删除线
    /// </summary>
    public void SetStrikethrough(string range, bool strikethrough = true)
    {
        sheet.SetRangeStyles(range, new WorksheetRangeStyle
        {
            Flag = PlainStyleFlag.FontStrikethrough,
            Strikethrough = strikethrough
        });
    }
}

4.3.2 对齐方式

using unvell.ReoGrid.Data;

public class AlignmentStyling
{
    private Worksheet sheet;
    
    public AlignmentStyling(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 设置水平对齐
    /// </summary>
    public void SetHorizontalAlign(string range, ReoGridHorAlign align)
    {
        sheet.SetRangeStyles(range, new WorksheetRangeStyle
        {
            Flag = PlainStyleFlag.HorizontalAlign,
            HAlign = align
        });
    }
    
    /// <summary>
    /// 设置垂直对齐
    /// </summary>
    public void SetVerticalAlign(string range, ReoGridVerAlign align)
    {
        sheet.SetRangeStyles(range, new WorksheetRangeStyle
        {
            Flag = PlainStyleFlag.VerticalAlign,
            VAlign = align
        });
    }
    
    /// <summary>
    /// 设置文本换行
    /// </summary>
    public void SetTextWrap(string range, bool wrap = true)
    {
        sheet.SetRangeStyles(range, new WorksheetRangeStyle
        {
            Flag = PlainStyleFlag.TextWrap,
            TextWrap = wrap ? TextWrapMode.WordBreak : TextWrapMode.NoWrap
        });
    }
}

4.3.3 背景和边框

using System.Drawing;
using unvell.ReoGrid.Data;
using unvell.ReoGrid.Graphics;

public class BackgroundAndBorderStyling
{
    private Worksheet sheet;
    
    public BackgroundAndBorderStyling(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 设置背景色
    /// </summary>
    public void SetBackgroundColor(string range, Color color)
    {
        sheet.SetRangeStyles(range, new WorksheetRangeStyle
        {
            Flag = PlainStyleFlag.BackColor,
            BackColor = color
        });
    }
    
    /// <summary>
    /// 设置全边框
    /// </summary>
    public void SetBorder(string range, Color color, BorderLineStyle style)
    {
        sheet.SetRangeStyles(range, new WorksheetRangeStyle
        {
            Flag = PlainStyleFlag.Border,
            Border = new RangeBorderStyle
            {
                Left = new BorderStyle { Color = color, Style = style },
                Top = new BorderStyle { Color = color, Style = style },
                Right = new BorderStyle { Color = color, Style = style },
                Bottom = new BorderStyle { Color = color, Style = style }
            }
        });
    }
    
    /// <summary>
    /// 设置外边框
    /// </summary>
    public void SetOutsideBorder(string range, Color color, BorderLineStyle style)
    {
        sheet.SetRangeBorders(new RangePosition(range), BorderPositions.Outside,
            new BorderStyle { Color = color, Style = style });
    }
    
    /// <summary>
    /// 设置内边框
    /// </summary>
    public void SetInsideBorder(string range, Color color, BorderLineStyle style)
    {
        sheet.SetRangeBorders(new RangePosition(range), BorderPositions.Inside,
            new BorderStyle { Color = color, Style = style });
    }
}

4.4 单元格合并

4.4.1 合并操作

using unvell.ReoGrid;

public class CellMerging
{
    private Worksheet sheet;
    
    public CellMerging(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 合并单元格
    /// </summary>
    public void MergeCells(string range)
    {
        sheet.MergeRange(range);
    }
    
    /// <summary>
    /// 取消合并
    /// </summary>
    public void UnmergeCells(string range)
    {
        sheet.UnmergeRange(range);
    }
    
    /// <summary>
    /// 检查是否已合并
    /// </summary>
    public bool IsMerged(string address)
    {
        var pos = new CellPosition(address);
        var cell = sheet.GetCell(pos);
        return cell != null && cell.IsMergedCell;
    }
    
    /// <summary>
    /// 获取合并区域
    /// </summary>
    public RangePosition GetMergedRange(string address)
    {
        var pos = new CellPosition(address);
        var cell = sheet.GetCell(pos);
        
        if (cell != null && cell.IsMergedCell)
        {
            return cell.MergeRange;
        }
        
        return RangePosition.Empty;
    }
}

4.5 行列操作

4.5.1 插入和删除

using unvell.ReoGrid;

public class RowColumnOperations
{
    private Worksheet sheet;
    
    public RowColumnOperations(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 插入行
    /// </summary>
    public void InsertRow(int row, int count = 1)
    {
        sheet.InsertRows(row, count);
    }
    
    /// <summary>
    /// 删除行
    /// </summary>
    public void DeleteRow(int row, int count = 1)
    {
        sheet.DeleteRows(row, count);
    }
    
    /// <summary>
    /// 插入列
    /// </summary>
    public void InsertColumn(int col, int count = 1)
    {
        sheet.InsertColumns(col, count);
    }
    
    /// <summary>
    /// 删除列
    /// </summary>
    public void DeleteColumn(int col, int count = 1)
    {
        sheet.DeleteColumns(col, count);
    }
}

4.5.2 隐藏和显示

using unvell.ReoGrid;

public class RowColumnVisibility
{
    private Worksheet sheet;
    
    public RowColumnVisibility(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 隐藏行
    /// </summary>
    public void HideRows(int row, int count = 1)
    {
        sheet.HideRows(row, count);
    }
    
    /// <summary>
    /// 显示行
    /// </summary>
    public void ShowRows(int row, int count = 1)
    {
        sheet.ShowRows(row, count);
    }
    
    /// <summary>
    /// 隐藏列
    /// </summary>
    public void HideColumns(int col, int count = 1)
    {
        sheet.HideColumns(col, count);
    }
    
    /// <summary>
    /// 显示列
    /// </summary>
    public void ShowColumns(int col, int count = 1)
    {
        sheet.ShowColumns(col, count);
    }
}

4.5.3 尺寸调整

using unvell.ReoGrid;

public class RowColumnSizing
{
    private Worksheet sheet;
    
    public RowColumnSizing(Worksheet worksheet)
    {
        sheet = worksheet;
    }
    
    /// <summary>
    /// 设置行高
    /// </summary>
    public void SetRowHeight(int row, ushort height, int count = 1)
    {
        sheet.SetRowsHeight(row, count, height);
    }
    
    /// <summary>
    /// 设置列宽
    /// </summary>
    public void SetColumnWidth(int col, ushort width, int count = 1)
    {
        sheet.SetColumnsWidth(col, count, width);
    }
    
    /// <summary>
    /// 自动调整行高
    /// </summary>
    public void AutoFitRow(int row)
    {
        sheet.AutoFitRowHeight(row);
    }
    
    /// <summary>
    /// 自动调整列宽
    /// </summary>
    public void AutoFitColumn(int col)
    {
        sheet.AutoFitColumnWidth(col);
    }
    
    /// <summary>
    /// 自动调整所有列宽
    /// </summary>
    public void AutoFitAllColumns()
    {
        for (int col = 0; col < sheet.ColumnCount; col++)
        {
            sheet.AutoFitColumnWidth(col);
        }
    }
}

4.6 本章小结

本章详细介绍了ReoGrid中工作表和单元格的各种操作,包括数据读写、格式化、样式设置、单元格合并以及行列操作等核心功能。

📚 下一章预告

第五章将学习数据类型与格式化的高级应用。


继续学习第五章!

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