找回密码
 立即注册

QQ登录

只需一步,快速开始

lrjnew

注册会员

10

主题

27

帖子

87

积分

注册会员

积分
87

活字格认证

lrjnew
注册会员   /  发表于:2015-3-30 13:26  /   查看:9243  /  回复:9
如题,一个spread中有两个工作表SHEETVIEW,数据行的数量一样,数据行以一个唯一编号作为标识(除了标识以外,其他列的数据不一样),如何在第一个工作表中进行排序,第二个工作表按照第一个工作表的排序变化进行相应的排序 。

9 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2015-3-30 17:52:00
沙发
回复 1楼lrjnew的帖子

Spread本身不支持同步排序。
这需要根据SortInfo自己设置同步。
代码参考:
  1. FarPoint.Win.Spread.SortInfo[] sort = new FarPoint.Win.Spread.SortInfo[1];
  2. sort[0] = new FarPoint.Win.Spread.SortInfo(0, false, System.Collections.Comparer.Default);
  3. fpSpread1.ActiveSheet.SetValue(0, 0, "S");
  4. fpSpread1.ActiveSheet.SetValue(0, 1, "E");
  5. fpSpread1.ActiveSheet.SetValue(0, 2, "A");
  6. fpSpread1.ActiveSheet.SetValue(0, 3, "K");
  7. fpSpread1.ActiveSheet.SetValue(1, 0, "W");
  8. fpSpread1.ActiveSheet.SetValue(1, 1, "G");
  9. fpSpread1.ActiveSheet.SetValue(1, 2, "P");
  10. fpSpread1.ActiveSheet.SetValue(1, 3, "V");
  11. fpSpread1.ActiveSheet.SetValue(2, 0, "O");
  12. fpSpread1.ActiveSheet.SetValue(2, 1, "L");
  13. fpSpread1.ActiveSheet.SetValue(2, 2, "Q");
  14. fpSpread1.ActiveSheet.SetValue(2, 3, "H");
  15. fpSpread1.ActiveSheet.SortColumns(0, 2, sort);
复制代码
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
lrjnew
注册会员   /  发表于:2015-3-31 14:01:00
板凳
回复 2楼Alice的帖子

你的示例只能实现一个表的排序,请问有没有可以让另一个工作表也进行相应的排序的方法呢?
例如:下面的两个数据表,如果表要按列A排序了之后,编号列会按一定的顺序排好,然后工作表2的编号列会按照工作表1的编号列的顺序进行排序

工作表1

编号        列A        列B
1007        A        5
1002        c        3
1001        f        5
1005        e        2
1009        d        8



工作表2

编号        列AA        列BB
1007        gg        43
1002        d        24
1001        f        37
1005        ef        64
1009        a        18
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-3-31 16:28:00
地板
回复 3楼lrjnew的帖子

另一个表也是使用同样的SortInfo进行排序。
这个需要自己根据需求去写代码实现。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
lrjnew
注册会员   /  发表于:2015-4-3 11:45:00
5#
回复 4楼Alice的帖子

不知道是我说得不太清楚还是你不太明白呢?请再看看下图:
请问如何实现呢?工作表的排序是根据工作表1的排序结果进行排序的,两个表的编号列的顺序要一样的。
那SORTINFO要如何写呢?因为工作表1的编号列是无序的。

飞信截图20150403114338.png
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-4-3 17:39:00
6#
回复 5楼lrjnew的帖子

从你的图来看,你使用的不是自动的排序。
你需要自己的排序方式,那么你就不能使用Spread的默认排序。

如2楼的代码所示,你设置一个SortInfo,可以设置成如下:
  1. sort[0] = new FarPoint.Win.Spread.SortInfo(3, true,new MyComparer());
复制代码

MyComparer继承自System.Collections.IComparer接口,这部分的具体实现就是你需要根据需求自己去实现。

这样子表1的排序就可以按照2楼完成。

最后表2和表1使用同一个SortInfo,就可以保持一致的排序。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
lrjnew
注册会员   /  发表于:2015-4-7 12:34:00
7#
回复 6楼Alice的帖子

是的,我使用的不是自动排序。

如图所示,工作表1是根据“列A”进行有序排序,工作表1排序完后,编号那一列是乱序的,没有规律的,我想工作表2的数据排序后,两个表编号那一列的顺序是一样的,请问如何才能实现呢?
请教如何使用相同的SORTINFO?两个工作除了编号一列的数据是一样的,其他列的数据都是不一样的。如何使用相同的SORTINFO,图中工作表2的排序结果应该是1002、1009、1005这样排的吧,因为工作表2的A列顺序是12、4h、6c,这样就会造成工作表2的编号那一列跟工作表1的编号那一列的顺序不一样了

其实我的数据就是一些人员的相关数据,第一个工作表排序了之后,第二个工作表根据人员编号作出相同的排序,方便同时查看两个表中的同一个人的数据,因为第二个表根据第一个表的编号排序后,同一个人在两个表里面的数据行的行号是一样的。
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-4-7 18:46:00
8#
回复 7楼lrjnew的帖子

根据你的描述,你并不知道“列A”的SortInfo。但你却需要对表格2按照列A的方式排序,不知道我理解的是否有误。

很抱歉,这样的方式没有办法支持。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
lrjnew
注册会员   /  发表于:2015-4-8 09:01:00
9#
回复 8楼Alice的帖子

SORTINFO是应该是整个工作表的SORTINFO吧,只是工作表1是按列A进行正序排序。

  1. Dim ISortInfo As New FarPoint.Win.Spread.SortInfo(1, true, New SortSheetRowsComparer())
  2. Me.Fps.Sheets(0).SortRows(1, Me.Fps.Sheets(0).RowCount - 1, New FarPoint.Win.Spread.SortInfo() {ISortInfo})
复制代码

工作表2不是按列A的方式排序,而是说工作表1排序完后,编号那一列的顺序是1009、1002、1005,我想达到的效果是工作表2的编号那一列的顺序和工作表1的编号那一列的顺序一致。
当然工作表2的其他列也跟着编号那一列排序,而不是单单只是编号那一列有变化。

辅助办法也没有吗?其实我现在已经实现了,只是效果不是很好,因为两个表的数据量是一样的,编号那一列也是一样的,所以我循环工作表1的编号列,然后每次循环都工作表2的编号列找到相同的编号,并把那一行移动上来,最后就会两个工作表在编号那一列看来是一样的。但是因为使用MoveRow比较卡,数据稍多就有明显卡顿。代码如下,请问有更好的办法吗?


  1.                For i As Integer = 1 To Me.CurrentFps.Sheets(0).RowCount - 2
  2.                     For k As Integer = i To Me.CurrentFps.Sheets(1).Rows.Count - 1
  3.                         If Me.CurrentFps.Sheets(SheetIndex).Cells(k, 0).Text = Me.CurrentFps.Sheets(0).Cells(i, 0).Text Then
  4.                             If k <> i Then
  5.                                 Me.CurrentFps.Sheets(SheetIndex).MoveRow(k, i, True)
  6.                             End If
  7.                             Exit For
  8.                         End If
  9.                     Next
  10.                 Next
复制代码
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-4-8 14:58:00
10#
回复 9楼lrjnew的帖子

谢谢你的反馈。

我看了你是自己从sheets中读取,然后通过MoveRow的方法。
Spread没有接口去实现同步,目前来说,只能自己写代码实现。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部