开发人员面临的最常见的用户场景之一是剪切板中的(support)支持/复制/剪切 功能。从 Excel 中粘贴数据到 Spread for COM 中是很容易的。但是,一次性粘帖500行以上的数据是受到限制的。
这是 Spread for COM 的一个限制,不允许用户一次性粘帖500行(Spread for COM 的 MaxRows 属性)以上的数据。如果默认设置允许500行以上的粘帖,一般会影响性能,因此建议不增加默认的粘帖最大值。即使在设计时 MaxRows 值被设定,也不意味着复制/粘帖行的数量就一定要在这个设定值以下。因此,要克服这个限制,需要操作这个属性,同时需要设置在剪切板中的数据的数量...
解决这个问题的方法,取得剪切板中数据的长度(从 Excel 文件中复制的行数),在粘帖之前,设定 MaxRows 属性的值,然后粘帖。一旦粘帖完成,重新把这个属性设定成原始值。
下面的代码(Visual Basic 6)将展示如何利用剪切板 API 去实现期待的效果。
首先,在代码中声明剪切板的 API,然后创建获取剪切板中数据行/列数的函数。这个函数的返回值是数组,第一个元素为剪切板中数据的行数,第一个元素是剪切板中数据的列数。- Option Explicit
- Const CF_SYLK = 4
- Const CF_DSPTEXT = &H81
- Declare Function OpenClipboard Lib "user32" (ByVal Hwnd As Long) As Long
- Declare Function CloseClipboard Lib "user32" () As Long
- Declare Function IsClipboardFormatAvailable Lib "user32" (ByVal wFormat As Long) As Long
- Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
- Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
- Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
- Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
- Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
- Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As String) As Long
- Function ClipBoard_RangeSize()
- Dim lhCB&, lpCB&, lRet&, lSize&, sText$
- Dim aTmp, sTmp$, nRow&, nCol&
- If IsClipboardFormatAvailable(CF_SYLK) Then
- If OpenClipboard(0&) <> 0 Then
- lhCB = GetClipboardData(CF_DSPTEXT)
- If lhCB <> 0 Then
- lpCB = GlobalLock(lhCB)
- If lpCB <> 0 Then
- lSize = GlobalSize(lpCB)
- sText = Space$(lSize)
- lRet = lstrcpy(sText, lpCB)
- lRet = GlobalUnlock(lhCB)
- sText = Left(sText, InStr(1, sText, Chr$(0), 0) - 1)
- End If
- End If
- CloseClipboard
- End If
- aTmp = Split(sText, " ")
- If UBound(aTmp) > 2 Then
- sTmp = aTmp(UBound(aTmp) - 2)
- nRow = Left(sTmp, Len(sTmp) - 1)
- sTmp = aTmp(UBound(aTmp))
- nCol = Left(sTmp, Len(sTmp) - 1)
- End If
- End If
- ClipBoard_RangeSize = Array(nRow, nCol)
- End Function
复制代码 同时,要在设计时或 Form_Load 事件中把 Spread 的 AutoClipBoard 属性设置为 true,这样 Spread 表单才能接受剪切板中的数据。
通过代码设置:
- Private Sub Form_Load()
- fpSpread1.AutoClipboard = True
- End Sub
复制代码 Spread for COM 中捕获 Ctrl+V(粘帖)最好的方法是 KeyPress 事件。在这个事件中,通过 ClipBoard_RangeSize() 方法取得剪切板中的行数,这个数值也是我们将要设置的 MaxRows 属性的值。- Private Sub fpSpread1_KeyPress(KeyAscii As Integer)
- If KeyAscii = 22 Then 'paste(ctrl+ v)
- numRows = ClipBoard_RangeSize(0)
- fpSpread1.MaxRows = numRows
- fpSpread1.ClipboardPaste
- End If
- End Sub
复制代码 通过上述做法,可以完成从 Excel 中复制任意数量的行在 Spread for COM 中粘帖的操作。 |
|