我正在尝试编写一个扩展方法,将一个通用的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);
}
答案 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下面没有任何内容可以向下移动。