积极答复者
fpSpread 如何实现深度复制?

问题
答案
-
如果他本身没有提供这样的方法,我建议你新建一个对象,把一些属性设置成和原来的对象的属性一样来达到目的!
周雪峰- 已标记为答案 KeFang Chen 2009年5月27日 8:13
-
如果他本身没有提供这样的方法,我建议你新建一个对象,把一些属性设置成和原来的对象的属性一样来达到目的!
你可以参照上面的方法,用产生 fpSpread1 的方法再产生一个不一样名称的变量试试
周雪峰
知识改变命运,奋斗成就人生!- 已标记为答案 KeFang Chen 2009年5月27日 8:13
全部回复
-
class A { public int i1 = 0; public int i2 = 0; public A Copy() { A a = new A(); a.i1 = this.i1; a.i2 = this.i2; return a; } }
大概这样
知识改变命运,奋斗成就人生!- 已编辑 肖小勇Moderator 2009年5月21日 8:31
-
如果他本身没有提供这样的方法,我建议你新建一个对象,把一些属性设置成和原来的对象的属性一样来达到目的!
周雪峰- 已标记为答案 KeFang Chen 2009年5月27日 8:13
-
如果他本身没有提供这样的方法,我建议你新建一个对象,把一些属性设置成和原来的对象的属性一样来达到目的!
你可以参照上面的方法,用产生 fpSpread1 的方法再产生一个不一样名称的变量试试
周雪峰
知识改变命运,奋斗成就人生!- 已标记为答案 KeFang Chen 2009年5月27日 8:13
-
谢谢 各位大侠了
暂时只找到这个方法,明天测试一下性能
private void button1_Click(object sender, EventArgs e)
{
FarPoint.Win.Spread.FpSpread temp = new FarPoint.Win.Spread.FpSpread();string fileName = "..\\..\\bin\\savespreadstream.xml";
System.IO.Stream stream;
stream = System.IO.File.Create(fileName);fpSpread1.Save(stream,false);
stream.Close();
stream = System.IO.File.Open(fileName, System.IO.FileMode.Open);
temp.Open(stream);temp.Sheets[0].Columns.Remove(2, 5);
Controls.Add(temp);
} -
刚才试了一下性能,还是很慢很慢的
实际我的情况是这样的:
数据库中查询出大量数据放到fpSpread中(大约有300列以上,数千行).
现在要把数据导入到Excel中,因为Excel2003最多支持255列,如果直接导入Excel后面的列就不见了.
所以只能把一个sheet拆分成3个Sheet,每个sheet都小于255列,然后导入到Excel中.我想如果能把一个已经有数据的fpSpread的sheet复制三份,
remove()掉不需要的列,然后导出最简单.
但是尝试多次复制的只是一个引用,一 remove 所有的sheet都跟着变.导出的Excel和程序中显示的spread还有一点不同,就是显示的单元格中有'()'的导出时都要去掉.
所以要专门生成一个spread用于导出以前的做法是用for循环,复制每个单元格的文本到一个导出用的spread,然后重新设置格式.
但是这样很慢.一天的数据勉强可以导出,一周的数据就会导致死机.
(原始spread中的数据不是用datasource的,也是for循环生成的)我觉得如果能完全复制的话,然后remove掉不用的列再导出速度会很快.
向上面那样把spread先保存成xml文件,再读出也可以实现,但是仍然很慢,生成的xml文件很大,
最后导出的excel文件却比他小的多. -
我想如果能把一个已经有数据的fpSpread的sheet复制三份,
remove()掉不需要的列,然后导出最简单.
但是尝试多次复制的只是一个引用,一 remove 所有的sheet都跟着变.
这种方法很实用,你可以过样DataTable dt1 = "从数据库获取数据"DataTable dt2 = dt1.Copy(); 获取 dt1 的CopyDataTable dt3 = dt1.Copy();dt1.Columns.Remove()...dt2.Columns.Remove()...dt3.Columns.Remove()...然后分别通过 dt1,2,3 来成生 sheet
知识改变命运,奋斗成就人生! -
...DataTable dt1 = "从数据库获取数据"DataTable dt2 = dt1.Copy(); 获取 dt1 的CopyDataTable dt3 = dt1.Copy();dt1.Columns.Remove()...dt2.Columns.Remove()...dt3.Columns.Remove()...
...
知识改变命运,奋斗成就人生!
不过比较麻烦的是我的原始spread中的数据不是直接从数据库中获取的,
从数据库中获取的实际是第几行第几列是什么值,
然后用循环把所有值放到spread中的对应位置上.
数据比较多,通过循环已经生成好的spread又不能完全复制,
为了导出必须要再生成一个spread所以只能再循环一遍,所以很慢.
不知道如何做才好啊 -
Excel 可以一次给多个单元格赋值哦,你是不是一个单元格赋一次哟?
知识改变命运,奋斗成就人生!
int iRowCnt = fpSpread1.Sheets[0].RowCount;
int iColCnt = fpSpread1.Sheets[0].Columns.Count;
fpSpreadExcel.Sheets[1].Cells[0,0,iRowCnt-1,iColCnt-1].Text = fpSpread1.Sheets[0].Cells[0,0,iRowCnt-1,iColCnt-1].Text;
fpSpreadExcel.Sheets[2].Cells[0,0,iRowCnt-1,iColCnt-1].Text = fpSpread1.Sheets[0].Cells[0,0,iRowCnt-1,iColCnt-1].Text;
唉~ 看来fpSpread还是不支持多个单元格赋值啊 还是 我写的有问题?
这样执行以后,fpSpreadExcel中的所有单元格的text都变成fpSpread1最左上角那个单元格的text了