/// <summary> /// 处理Excel块粘贴功能 /// </summary> /// <param name="view"></param> /// <param name="e"></param> /// <param name="bAllowAutoNewRows">允许自动新增行</param> /// <param name="bCanPaste">是否允许填充某字段</param> public static void PasteBlockData(this IDynamicFormView view, EntityBlockPastingEventArgs e, bool bAllowAutoNewRows = false, Func <FieldAppearance, int, bool> bCanPaste = null) { if (e.BlockValue.IsNullOrEmptyOrWhiteSpace()) { return; } FieldAppearance startFieldAp = view.LayoutInfo.GetFieldAppearance(e.StartKey); if (startFieldAp == null || (startFieldAp.Field.Entity is EntryEntity) == false) { return; } EntryEntity entryEntity = (EntryEntity)startFieldAp.Field.Entity; int iTotalRows = view.Model.GetEntryRowCount(entryEntity.Key); var copyOperation = view.BillBusinessInfo.GetForm().FormOperations .FirstOrDefault(o => o.OperationId == 31 && string.Equals(o.Parmeter.OperationObjectKey, entryEntity.Key, StringComparison.InvariantCultureIgnoreCase)); bool isCopyLinkEntry = false; //如果表格未配置复制行操作,则不允许自动新增行 if (copyOperation == null) { bAllowAutoNewRows = false; } else { isCopyLinkEntry = GetIsCopyLinkEntryParam(copyOperation.Parmeter); } string[] strBlockDataRows = e.BlockValue.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); int iRow = e.StartRow; foreach (var rowData in strBlockDataRows) { if (iRow >= iTotalRows) { if (bAllowAutoNewRows) { view.Model.CopyEntryRow(entryEntity.Key, iRow - 1, iRow, isCopyLinkEntry); } else { break; } } string[] strItemValues = rowData.Split(new char[] { '\t' }); FieldAppearance fieldAp = startFieldAp; foreach (var value in strItemValues) { if (fieldAp == null) { continue; } object objValue = value; if (typeof(ValueType).IsAssignableFrom(fieldAp.Field.GetPropertyType())) { if (value.IsNullOrEmptyOrWhiteSpace()) { objValue = 0; } else { ValueTypeConverter converter = new ValueTypeConverter(); if (value != null && converter.CanConvertTo(value.GetType())) { objValue = converter.ConvertTo(value, fieldAp.Field.GetPropertyType()); } } } if (bCanPaste == null || bCanPaste(fieldAp, iRow)) { (view as IDynamicFormViewService).UpdateValue(fieldAp.Key, iRow, objValue); } fieldAp = GetNextEditFieldAp(view, fieldAp, iRow); } iRow++; } }