Foxtable(狐表)用户栏目专家坐堂 → 当从EXECL中一次性地复制多列数据到当前表中的时候


  共有17766人关注过本帖树形打印复制链接

主题:当从EXECL中一次性地复制多列数据到当前表中的时候

帅哥哟,离线,有人找我吗?
mr725
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/6/27 22:44:00 [只看该作者]

以下是引用hnaysx在2010-6-27 22:23:00的发言:

最好foxtable的粘贴里有一项排除隐藏列,集成到系统里最好

类似OFFICE的选择性粘贴

[此贴子已经被作者于2010-6-27 22:23:16编辑过]

这样最好了,有个选择的地方~  那就更强了····


 回到顶部
帅哥哟,离线,有人找我吗?
mr725
  12楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/6/27 22:56:00 [只看该作者]

但是还有个问题: 就是当excel本身也有隐藏列时,剪贴板上也就包含了excel其中的隐藏列数据了(假使操作人也不会使用excel的只复制显示列),那么即使foxtable有个这样的选项,也应该给出个提示:请确认复制的内容不包含excel等的隐藏列!   无论如果这样就比较复杂了。。。

 回到顶部
帅哥哟,离线,有人找我吗?
mr725
  13楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/6/27 23:06:00 [只看该作者]

以下是引用yankunhao在2010-6-27 22:42:00的发言:

我也试过想将隐藏了的列统一移到显示列的后面,但这一样一来,当有别的用户进来的时候,而他有权看到一些别人看不到的列,那么这个用户的列顺序就变了。所以希望有一个好一点的方法实现这个想法,我想大家在做数据管理的时候是需要能快速地将EXECL表中的一些数据粘贴到系统中的。

这个问题好解决: 可以恢复原移动的隐藏列回到原来的位置,或者粘贴后执行一下表视图代码即可。


 回到顶部
帅哥哟,离线,有人找我吗?
czy
  14楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33945 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/6/28 2:00:00 [只看该作者]

我来练练手,水平有限代码较啰嗦。

 

Dim s As String = System.Windows.Forms.ClipBoard.GetText() '获取剪贴板中的数据
Dim s1 As String = s.Replace(chr(13) & chr(10),chr(9)) '将换行符和回车符替换为Tab符
Dim t As Table = CurrentTable
Dim Vals(),Vals1(),Vals2() As String
Vals = s1.split(chr(9)) '获取单元格个数
Vals1 = s.split(chr(13) & chr(10)) '获取剪贴板中行的数量
Dim i,c As Integer
For n As Integer = t.Position To t.Position + Vals1.Length - 2 '从焦点所在行开始循环,循环次数为剪贴板中行数减1
    c = 0
    For Each cl As Col In t.Cols
        If cl.Visible Then '排除隐藏列
            c = c + 1
            if c < Vals1(0).split(chr(9)).Length + 1 Then '如果被标记的列小于剪贴板中的列数
                if n < t.Rows.Count Then '如果当前表中还有行可以写入
                    if i <= Vals.Length - 1 Then '如果剪贴板中还有未写完的数据
                        t(n,cl.name) = Vals(i) '则写入数据
                        i = i + 1
                    End If
                End If
            End If
        End If
    Next
Next

 


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/6/28 10:15:00 [只看该作者]

我在C版的基础上改一下

 

粘贴排除隐藏列:

 

Dim t As Table = CurrentTable
Dim s As String = System.Windows.Forms.ClipBoard.GetText()
Dim Lines() As String = s.split(chr(13) & chr(10))
Dim Count As Integer = Math.Min(Lines.Length , t.Rows.Count - t.TopPosition) - 1
For n As Integer = 0 To Count
    Dim Line() As String = Lines(n).Split(chr(9))
    Dim r As Integer = t.TopPosition + n
    Dim vp As Integer = 0
    For c As Integer = t.LeftCol to t.Cols.Count - 1
        If t.Cols(c).Visible Then
            If vp < Line.Length  Then
                t.Rows(r)(c) = Line(vp)
            End If
            vp = vp + 1
        End If
    Next
Next

 

粘贴考虑隐藏列:

 

Dim t As Table = CurrentTable
Dim s As String = System.Windows.Forms.ClipBoard.GetText()
Dim Lines() As String = s.split(chr(13) & chr(10))
Dim Count As Integer = Math.Min(Lines.Length,t.Rows.Count - t.TopPosition) - 1
For n As Integer = 0 To Count
    Dim Line() As String = Lines(n).Split(chr(9))
    Dim r As Integer = t.TopPosition + n
    Dim vp As Integer = 0
    For c As Integer = t.LeftCol to t.Cols.Count - 1
        If vp < Line.Length  Then
            t.Rows(r)(c) = Line(vp)
        End If
        vp = vp + 1
    Next
Next

[此贴子已经被作者于2010-6-28 10:20:23编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
mr725
  16楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/6/28 12:18:00 [只看该作者]

C版的可以,只是都从第一列开始粘贴········

 

老大的也有问题,看下图:

 
图片点击可在新窗口打开查看此主题相关图片如下:未命名.jpg
图片点击可在新窗口打开查看

[此贴子已经被作者于2010-6-28 12:19:58编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  17楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2010/6/28 12:33:00 [只看该作者]

这个没有撤销和反撤销的

 回到顶部
帅哥哟,离线,有人找我吗?
czy
  18楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33945 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2010/6/28 12:35:00 [只看该作者]

以下是引用mr725在2010-6-28 12:18:00的发言:

C版的可以,只是都从第一列开始粘贴········

 

嗯,我只考虑了从焦点行开始,还真没考虑到从指定列开始粘贴。


 回到顶部
帅哥哟,离线,有人找我吗?
mr725
  19楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:5154 积分:31434 威望:0 精华:8 注册:2008/9/8 12:27:00
  发帖心情 Post By:2010/6/28 12:48:00 [只看该作者]

以下是引用狐狸爸爸在2010-6-28 12:33:00的发言:
这个没有撤销和反撤销的

您的代码我测试后,直接的结果是17楼的第一个图,经过撤销和反撤销(即恢复)后,就得到第二个图。。。。。

所以,在你代码后面加上:

Syscmd.Edit.Undo()
Syscmd.Edit.Redo()
for d as integer = 0 to currenttable.count-1
    currenttable(d,0) = currenttable(d,0).trim(" ")
next

后,才能得到正确的结果: 


此主题相关图片如下:未命名0.jpg
按此在新窗口浏览图片

上面的 for......next 是从第一列开始粘贴的,要从任何单元格开始粘贴就要改为:

For c1 As Integer = t.toprow to t.Cols.Count - 1       ‘或t.bottomrow -1
    currenttable(c1,t.LeftCol ) = currenttable(c1,t.LeftCol ).trim(" ")
next

[此贴子已经被作者于2010-6-28 12:58:17编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
yankunhao
  20楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1019 积分:7155 威望:0 精华:0 注册:2008/9/1 22:34:00
  发帖心情 Post By:2010/6/29 18:05:00 [只看该作者]

以下是引用mr725在2010-6-28 12:48:00的发言:

您的代码我测试后,直接的结果是17楼的第一个图,经过撤销和反撤销(即恢复)后,就得到第二个图。。。。。

所以,在你代码后面加上:

Syscmd.Edit.Undo()
Syscmd.Edit.Redo()
for d as integer = 0 to currenttable.count-1
    currenttable(d,0) = currenttable(d,0).trim(" ")
next

后,才能得到正确的结果: 


此主题相关图片如下:未命名0.jpg
按此在新窗口浏览图片

上面的 for......next 是从第一列开始粘贴的,要从任何单元格开始粘贴就要改为:

For c1 As Integer = t.toprow to t.Cols.Count - 1       ‘或t.bottomrow -1
    currenttable(c1,t.LeftCol ) = currenttable(c1,t.LeftCol ).trim(" ")
next

[此贴子已经被作者于2010-6-28 12:58:17编辑过]

经测试这个也有问题!


 回到顶部
总数 24 上一页 1 2 3 下一页