插入后不会更新UsedRange.RowCount

时间:2014-12-18 13:59:06

标签: c# spreadsheetgear

我正在尝试编写一个扩展方法,将一个通用的Item T添加到工作簿中,因为在调用InsertMethod之后UsedRange.RowCount没有增加,所以我遇到了问题

    public static RowItem<T> AddItem<T>(this SpreadsheetGear.IWorksheet worksheet, T item) where T : class
    {
        int currentRow = worksheet.UsedRange.RowCount;
        //int currentRow = worksheet.UsedRange.RowCount;
        RowItem<T> newItem = new RowItem<T>
        {
            Item = item,
            RowIndex = currentRow
        };

        var reflected = item.GetType().GetProperties();

        for (int i = 0; i < reflected.Length; i++)
        {
            object value = reflected[i].GetValue(item);
            worksheet.Cells[currentRow, i].Value = value;
        }

        worksheet.UsedRange.Insert(SpreadsheetGear.InsertShiftDirection.Down);
        worksheet.WorkbookSet.CalculateFull();

        return newItem;
    }

 public static IEnumerable<RowItem<T>> AddItems<T>(this SpreadsheetGear.IWorksheet worksheet, IEnumerable<T> items) where T : class
    {
        var lst = new List<RowItem<T>>();

        foreach (var item in items)
        {
            var newItem = AddItem<T>(worksheet, item);

            lst.Add(newItem);
        }

        return lst;
    }

总是1 ...我做错了什么?我的假班是

public class Dummy
{
    public string Desciption { get; set; }
    public double Value { get; set; }
    public DateTime Data { get; set; }
}

我添加项目为

  using (var _ = new WorkbookViewLock(workbookView1))
  {
     var worksheet = workbookView1.ActiveSheet.Workbook.Worksheets[0];

     worksheet.AddItem<Dummy>(dummy);
     worksheet.AddItem<Dummy>(dummy2);
  }

1 个答案:

答案 0 :(得分:-1)

如果您开始使用空白工作表(是吗?),那么您在代码中对worksheet.UsedRange.RowCount进行的前两次检查就会有一个值1.

这是因为空白工作表的UsedRange始终为A1,这对应于UsedRange.RowCount值为1.对于您的第一个AddItem(...),该值占1呼叫。

第二个AddItem(...)调用现在正在查看填充了数据的工作表,但仍然只有一行,因为此时您只添加了一个Dummy对象。

如果您要添加第三个Dummy对象,您会看到UsedRange增加到值为2。

仅供参考:您的worksheet.UsedRange.Insert(...)行可能还有其他问题,因为这会插入UsedRange当前包含的行数。在我看来,如果您只使用此扩展方法添加一个Dummy对象,则最多只能插入一行...这取决于您希望每个新Dummy的位置行添加到工作表 - 使用范围的顶部或底部。如果您要在Dummy的顶部插入新的UsedRange对象,则只应在Insert(...)的顶行应用UsedRange。如果您在UsedRange的底部插入新的Dummy对象,则根本不需要Insert(...)调用,因为在UsedRange下面没有任何内容可以向下移动。