原帖由 hyf3133862 于 2011-12-6 19:38:00 发表
public class CellInfo
{
private int row = 0;
private int column = 0;
这两个值我该给它赋什么?
visibleCellList我遍历了这个集合。然后给上面的赋值、
但是visibleCellList。row的值是一个字符啊?这我该怎么赋啊
哥们,我看到你说的问题了。其实我主要代码在上面写的确实很清楚了,也不知道再如何详细了。感觉没有帮上你太多忙,所以我尽量再详细阐述一下我的想法。希望你能认真看一下,如果再看不懂,我真的帮不上忙了,除非你把你的工作给我干。
你的需求是,将编辑后的Sheet样式保存下来,然后可以在别的地方使用。直接用Farpoint自带的SaveXml是不行的,因为你不需要与显示无关的数据。另外,Farpoint自带的SaveXml貌似是很费资源的,因为Sheet有太多的信息需要存储。
我不知道你想如何存储保存下来的样式,也不知道你想怎么调用这些样式。也许你想暂时存到内存里?
当你问为什么要使用Xml序列化的时候,我就很疑惑。总之,不管你想如何使用这些保存下来的样式,使用CellInfo与AllCellInfo来记录Cell信息,是必须的。Xml序列化,只是为了保存到本地来用的方法,并不是要求你必须这么做。
所以,接着说。思路是这样的:我们既然要保存样式,那么这个所谓的样式,其实是二维平面,再细说,其实是由每一个单独的Cell组成的,就像搭积木一样。而每一个Cell的RowIndex与ColumnIndex,就仿佛是X、Y坐标,RowSpan与ColumnSpan,就像是宽与高。于是,对于任意一个Cell,只要知道RowIndex与ColumnIndex与RowSpan与ColumnSpan,就能重现它所在的位置与所占用的面积了。接下来,就是需要记录每一个Cell的Border。Border有四个属性,即左、上、右、下,当为true的时候,即表示相应的位置有边。
于是,按照C#面相对象编程的思想,新建一个Border类,里面有左上右下四个属性。然后再新建一个CellInfo类,让里面有四个属性记录RowIndex、ColumnIndex、RowSpan、ColumnSpan,再有一个Border类的属性。
然后使用GetVisibleCell的方法,获得所有显示出来的Cell。之所以需要调用GetVisibleCell方法,是因为当你Span一个Cell以后,这个Cell会把其他Cell挡住,这样的话,被挡住的Cell其实对你保存下来的样式没有任何用处,将它的信息保存到CellInfo中没有意义,举一个极端的例子,例如你有一个10*10的数据,这样是100个Cell,然后你把第一个Cell的RowSpan与ColumnSpan都设置成10,那么界面上只显示了一个巨大的Cell。你会怎么保存这个样式呢?显然不需要保存100个Cell的信息,因为有99个Cell被挡住了,其实你只需要记录第一个Cell的RowIndex=0、ColumnIndex=0、RowSpan=10与ColumnSpan=10,就可以了。
visibleCellList中保存的就是所有当前可以看到的Cell。
于是:
List<CellInfo> cellInfoList=new List<CellInfo>();
foreach(Cell cell in visibleCellList)
{
CellInfo cellInfo=new CellInfo();
cellInfo.RowIndex=cell.Row.Index;
cellInfo.ColumnIndex=cell.Column.Index;
cellInfo.RowSpan=cell.RowSpan;
cellInfo.ColumnSpan=cell.ColumnSpan;
Border border=new Border();
border.Left=(cell.Border as LineBorder).Left; //可能是这么写?
border.Top=(cell.Border as LineBorder).Top;
border.Right=(cell.Border as LineBorder).Right;
border.Bottom==(cell.Border as LineBorder).Bottom;
cellInfo.Border=border;
cellInfoList.Add(cellInfo);
}
现在cellInfoList就保存了所有显示出来的Cell的信息。
好了。现在要讲如何复用。
例如你新建了一个Sheet。
foreach(CellInfo cellInfo in cellInfoList)
{
Cell cell= Sheet.Cells[cellInfo.RowIndex,CellInfo.ColumnIndex];
cell.RowSpan=cellInfo.RowSpan;
cell.ColumnSpan=cellInfo.ColumnSpan;
Border border= cellInfo.Border;
LineBorder lineBorder=new LineBorder(Color.Black,1,border.Left,border.Top,border.Right,border.Bottom);
cell.Border=lineBorder;
}
这就是样式的存储与复用。
如果里面还涉及到颜色等东西,你就需要修改Border类,在Border类中添加记录颜色与字体的属性。
最后要说,如果你想将样式保存成为一个文件或者什么,就可以用XML序列化了。
另外需要告诉你,Font属性与Color属性是无法被XML序列化的,推荐你用string 形式存储Font与Color,然后再在程序里将string 转化为Font或者颜色。
如何转换,可以谷歌一下。
哥们,我花了半小时给你写这东西,就是希望你能学到这些,说实话,我是菜鸟,看到你的问题,我觉得你还应该努力。 |