请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

laonawuli

银牌会员

39

主题

146

帖子

3383

积分

银牌会员

积分
3383

活字格认证

laonawuli
银牌会员   /  发表于:2011-12-1 16:23  /   查看:9354  /  回复:13
我现在需要将指定区域的Cells的Sapn、Border、Text、Font、HAligement、VAligemnt等只跟显示有关(与显示无关的信息不需要保存)的信息保存为XML。
然后将此信息,解读出来以后,任意复制给另外一个sheet。
例如,我设计了一份表头,然后保存下来。
然后在别的sheet中读取出来,然后复用。

我知道FP可能有一套自己的XML序列化的东西,但是我不知道会不会很卡,因为我怕FP会把跟显示无关的东西也转化进XML。请问有什么好的、快速的办法吗?(如果我对FP自带的XML序列化的东西理解有误,请指出

我能想到的最笨的方法,就是老老实实的一个Cell一个Cell的对它们的Sapn、Border等等等等一堆属性赋值给实体,然后再将实体XML序列化。但是这个很笨的,而且我也没有想到如何处理乱七八糟的Span、横七竖八的Border等复杂情况。而且,就算我保存为我自己的格式了,到时候在别的Sheet中读取出来再复用,就又是麻烦事儿了。

望iceman给出一个更快更简单的方法,能实现快速、简短的保存为XML,并正确的读取到Sheet上。(FP上自带的序列化方法也行,但是希望iceman提供一个优化方案,不序列化跟显示无关的属性)

13 个回复

倒序浏览
laonawuli
银牌会员   /  发表于:2011-12-1 18:09:00
沙发
另外一个问题,就不开新帖问了。。

在新建一个FP后,默认设置下,是可以通过点住鼠标左键然后拖动,便可以多选一堆Cell。第一个选中的Cell是白色的,周围是有虚线的,其他的Cell,背景色都是FP经典的淡蓝色。
请问如何让第一个选中的Cell的背景色也是淡蓝色,并且不要出现周围一圈虚线呢?
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-1 18:46:00
板凳
原帖由 laonawuli 于 2011-12-1 16:23:00 发表
我现在需要将指定区域的Cells的Sapn、Border、Text、Font、HAligement、VAligemnt等只跟显示有关(与显示无关的信息不需要保存)的信息保存为XML。
然后将此信息,解读出来以后,任意复制给另外一个sheet。
例如,我设计了一份表头,然后保存下来。
然后在别的sheet中读取出来,然后复用。

我知道FP可能有一套自己的XML序列化的东西,但是我不知道会


iceman,其实,让我自己一个Cell一个Cell的保存信息,也可以,但问题是,我现在不知道如何取当前界面中显示出来的Cell,比如,一个10行10列的数据,我通过Span,让前4行Span成一个大Cell,然后后4行Span成一个大Cell,中间还有两行正常的Cell。这样,实际上界面上应该可以看到1+1+2*10 = 22个Cell,于是,我只需保存这22个Cell的信息便可以了,但问题是我不知道怎么获取这22个Cell,因为假如Cell[i,j] 实际上是被第一个大Cell挡住的,但在10行10列的循环取Cell的过程中,Cell[i,j]还是会被选中,这样的话,10*10=100,也就是说这100个Cell的信息我都要转换成XML。如果Cell[i,j]有个一个Visible属性就好了,这样当它被别的大SpanCell挡住的时候,就可以不去管它了。
相信iceman大侠肯定看明白我的意思了。。。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-1 19:24:00
地板

回复 2# laonawuli 的帖子

laonawuli 你好,
1. 第一个问题我已经接收,正在处理中,稍后回复。
2.  Spread 提供 fpSpread1_SelectionChanging 事件可以取得选择 CellRange 的第一个单元格的行列索引,从而可以进行 border 和 背景色设置。
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-2 11:59:00
5#
原帖由 iceman 于 2011-12-1 19:24:00 发表
laonawuli 你好,
1. 第一个问题我已经接收,正在处理中,稍后回复。
2.  Spread 提供 fpSpread1_SelectionChanging 事件可以取得选择 CellRange 的第一个单元格的行列索引,从而可以进行 border 和 背景色设置。

1.非常期待iceman对第一个问题的回复

2.第二个问题,坦率的说,这种看似简单的问题,我确实不想麻烦你。。。我现在就在做客户维护,客户一问超级简单的问题,我就特别想摔电脑...

我用这个代码测试了:
        private void fpSpread1_SelectionChanging(object sender, SelectionChangingEventArgs e)
        {
            fpSpread1_Sheet1.Cells[e.Range.Row, e.Range.Column].Border = null;
}
那个虚线还在。
实际上,让border=null,是我做的一种测试。我想实现的效果,其实直接让border=null 是不行的。
打个比方:
上面2个Cell 下面2个Cell,然后他们的border设置为 看起来像个“田”字。
然后我鼠标选中第1个Cell(也就是“田”字左上角的那个“口”),然后将整个“田”字选中,于是,被选中的那个“口”的border看不到了,取而代之的是一个虚线的边框,而且背景色是白色的。
其他三个口都是正常的淡蓝色。
我要实现的效果就是,从第一个“口”开始,选中整个“田”字后,每一个口的border都是原来那样可以被看到,而且每一个口都是FP自带的淡蓝色。。。
就没有针对第一个选中的Cell设置的属性吗?如果实在没有,我真的不知道如何从SelectionChanging这件事中搞定了。。。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-2 12:30:00
6#

回复 5# laonawuli 的帖子

laonawuli 你好,第一个问题可以通过序列化 SpreadSkin 到 XML 文件实现:

  1.              //创建 skin XML 文件
  2.             string path = Application.StartupPath + "skin.xml";
  3.             XmlTextWriter skinXMLWriter = new XmlTextWriter(path, null);

  4.             //创建 SpreadSkin 并且序列化到 XML 文件
  5.             FarPoint.Win.Spread.SpreadSkin skin = new FarPoint.Win.Spread.SpreadSkin();
  6.             FarPoint.Win.Spread.NamedStyle nameStyleWriter = new FarPoint.Win.Spread.NamedStyle();
  7.             nameStyleWriter.BackColor = Color.Red;
  8.             skin.DefaultStyle = nameStyleWriter;
  9.             skin.Serialize(skinXMLWriter);
  10.             skinXMLWriter.Close();

  11.             //读取  XML 文件并且付给 Spread
  12.             XmlDocument skinXmlreader = new XmlDocument();
  13.             skinXmlreader.Load(path);
  14.             XmlNodeReader skinNodereader = new XmlNodeReader(skinXmlreader);
  15.             FarPoint.Win.Spread.SpreadSkin skinReader = new FarPoint.Win.Spread.SpreadSkin();
  16.             skinReader.Deserialize(skinNodereader);

  17.             this.fpSpread1.Skin = skinReader;
复制代码
关于保存其他格式信息,可以参见帮助文档 SpreadSkin ,方法类似。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-2 14:07:00
7#

回复 6# iceman 的帖子

laonawuli ,你的心情我能够理解,没有什么麻烦的,和你这样配合的朋友合作,是一件很愉快的事。
关于 5# 的第二个问题 border 解决方法是:

  1. FarPoint.Win.Spread.CustomFocusIndicatorRenderer cfi = new FarPoint.Win.Spread.CustomFocusIndicatorRenderer(0);
  2.             fpSpread1.FocusRenderer = cfi;
复制代码
关于 5# 的第二个问题 BackColor 解决方法是(颜色可能要你自己取) :
  1. private void fpSpread1_SelectionChanging(object sender, FarPoint.Win.Spread.SelectionChangingEventArgs e)
  2.         {
  3.             this.fpSpread1.ActiveSheet.Cells[e.Range.Row, e.Range.Column].BackColor = Color.LightBlue;
  4.         }
复制代码
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-2 15:50:00
8#
原帖由 iceman 于 2011-12-2 14:07:00 发表
laonawuli ,你的心情我能够理解,没有什么麻烦的,和你这样配合的朋友合作,是一件很愉快的事。
关于 6# 的第二个问题 border 解决方法是:[code]
FarPoint.Win.Spread.CustomFocusIndicatorRenderer cfi = new FarPoint.Win.Spread.CustomFocusIndicatorRenderer(0);
  


多谢iceman!

请问如何获取当前能看到的所有Cell呢?
比如,一个10行10列的数据,我通过Span,让前4行Span成一个大Cell,然后后4行Span成一个大Cell,中间还有两行正常的Cell。这样,实际上界面上应该可以看到1+1+2*10 = 22个Cell,怎么获取这22个Cell呢?不知道Cell有没有一个Visible属性,就是当被别的SpanCell挡住时,Visible属性为false?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-2 16:28:00
9#

回复 8# laonawuli 的帖子

laonawuli 你好,
1. 不好意思,我想确认下 6# 提到的 序列化 Skin 的方法可以满足需求吗?这种方法只会保存你自己设置的格式信息,不会浪费资源。这 22 个 cell 是要保存 数据 还是 格式呢?
2. 目前没有你所说的 “Visible” 属性,但是如果想取这 22 cell ,可以通过循环判断该单元格是否被合并。
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-2 16:35:00
10#
原帖由 iceman 于 2011-12-2 16:28:00 发表
laonawuli 你好,
1. 不好意思,我想确认下 6# 提到的 序列化 Skin 的方法可以满足需求吗?这种方法只会保存你自己设置的格式信息,不会浪费资源。这 22 个 cell 是要保存 数据 还是 格式呢?
2. 目前没有你所说的 “Visible” 属性,但是如果想取这 22 cell ,可以通过循环判断该单元格是否被合并。


iceman,我很感谢你提供的序列化方法,但确实没有完成我想要的效果,想到你也想了很久解决办法,实在不好意思否定。但是,你提供的方法,确实让我学到了知识,多谢。我决定第一个问题,由我自己一个一个Cell的保存来完成,但是,前提是,我需要找到那22个显示出来的Cell。
我用的是Fp2.5,如何确定Cell有没有被合并呢?Cell的哪个属性?这也许是目前最好的办法了。如果能解决这个问题,6#的问题也就解决了。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部