找回密码
 立即注册

QQ登录

只需一步,快速开始

iceman
社区贡献组   /  发表于:2011-12-2 18:53:00
11#

回复 10# laonawuli 的帖子

你好,DefaultSheetSpanModel 下方法 GetEnumerator 可以获取合并单元格范围,可以从该方法入手,进行逻辑判断。
BTY:请问 laonawuli 同学,通过 “一个一个 Cell 保存” 是怎样实现的呢?
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-3 09:17:00
12#
原帖由 iceman 于 2011-12-2 18:53:00 发表
你好,DefaultSheetSpanModel 下方法 GetEnumerator 可以获取合并单元格范围,可以从该方法入手,进行逻辑判断。
BTY:请问 laonawuli 同学,通过 “一个一个 Cell 保存” 是怎样实现的呢?


iceman同学,前两天不是问了你如何实现动态的Span和设置border吗,按照你提供的思路,我已经实现了自己的工具栏,来直接对sheet进行Span与Border设置。
我现在要实现的功能是,把用户用我的工具栏设计后的sheet保存为XML(假如有10行数据,用户在里面随意Span和设置border),然后,我可以随意将这10行数据复用到其他sheet中的任意一个位置,次数不限。于是就有了这个帖子的第一个问题。
我回头看了一下我的问题,我对问题描述不清,所以导致你给的XML序列化方法不是我想要的解决方案。你的方案最小单位是Sheet,也就是把一个Sheet保存,然后让另外一个sheet等于这个sheet。而我的最小单位是Cell。所以,我想另辟蹊径了。(本来我对XML序列化的性能和资源占用就有疑义)
我的想法是这样的,如果我想保存Range,就是我自己建一个类,例如CellInfo,然后CellInfo里有Span、Border、HValignment等与显示有关的信息,然后序列化保存。然后循环sheet上每一个可以看到的Cell。循环方法就是行循环里面套着列循环,然后rowIndex++、columnIndex++。但是就有一个问题,有些Cell是被其他Span后的Cell挡住的,所以按理说,我不需要保存这种Cell的信息。但是我不知道如何去过滤这些Cell,于是我就有了上面问到的“Cell是否有Visible属性”的问题。
回复 使用道具 举报
laonawuli
银牌会员   /  发表于:2011-12-3 09:59:00
13#
iceman同学,如果FP没有自带的方法来获得当前显示出来的Cell的话,我写了一段代码,测试是可以使用的。

  1.         /// <summary>
  2.         /// 获得当前显示出来的Cell。被其他SpanCell挡住的Cell不被获得。
  3.         /// </summary>
  4.         private void GetVisibleCell()
  5.         {
  6.             //所有当前显示出来的Cell。
  7.             List<Cell> visibleCellList=new List<Cell>();

  8.             //经典的循环。
  9.             int rowCount = fpSpread1_Sheet1.RowCount;
  10.             int columnCount = fpSpread1_Sheet1.ColumnCount;
  11.             for (int rowIndex = 0; rowIndex < rowCount; rowIndex++)
  12.             {
  13.                 for (int columnIndex = 0; columnIndex < columnCount; columnIndex++)
  14.                 {
  15.                     Cell cell = fpSpread1_Sheet1.Cells[rowIndex, columnIndex];
  16.                     FilterCell(visibleCellList, cell);
  17.                 }
  18.             }

  19.             MessageBox.Show(visibleCellList.Count.ToString());
  20.         }

  21.         /// <summary>
  22.         /// 过滤Cell。如果cell没有被visibleCellList中的任何一个Cell挡住,则将cell添加进visibleCellList。
  23.         /// </summary>
  24.         /// <param name="visibleCellList">当前显示出来的Cell。</param>
  25.         /// <param name="cell">被过滤的Cell。</param>
  26.         private void FilterCell(List<Cell> visibleCellList, Cell cell)
  27.         {
  28.             //将Cell的位置转化为Point。
  29.             Point p = new Point(cell.Column.Index, cell.Row.Index);
  30.             foreach (Cell c in visibleCellList)
  31.             {
  32.                 //将目前已经显示出来的Cell的位置与所占用的面积转化为Rectangle。
  33.                 Rectangle r = new Rectangle(c.Column.Index, c.Row.Index, c.ColumnSpan, c.RowSpan);
  34.                 //如果Rectangle包含Point,则说明cell已经被挡住了,则return。
  35.                 if (r.Contains(p))
  36.                 {
  37.                     return;
  38.                 }
  39.             }
  40.             //如果走到这一步了,说明cell没有被visibleCellList中的任何一个Cell挡住,则将cell添加进visibleCellList。
  41.             visibleCellList.Add(cell);
  42.         }
复制代码
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2011-12-5 10:28:00
14#

回复 13# laonawuli 的帖子

laonawuli 大侠,看来你使用 Spread 的功力已经远远在我之上,在下实在是自愧不如,同时再次对长期以来 laonawuli  对我工作的配合表示感谢~:-D
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 立即注册
返回顶部