none
fpSpread 如何实现深度复制? RRS feed

  • 问题

  • 大家有使用fpSpread的吗?
    无论我怎么复制都只是复制了一个引用,就是修改对象副本,原对象也会跟着变,
    如何才能实现复制值而不是引用啊?
    2009年5月21日 8:26

答案

  • 如果他本身没有提供这样的方法,我建议你新建一个对象,把一些属性设置成和原来的对象的属性一样来达到目的!
    周雪峰
    2009年5月21日 10:43
    版主
  • 如果他本身没有提供这样的方法,我建议你新建一个对象,把一些属性设置成和原来的对象的属性一样来达到目的!
    周雪峰
    你可以参照上面的方法,用产生 fpSpread1 的方法再产生一个不一样名称的变量试试
    知识改变命运,奋斗成就人生!
    2009年5月21日 11:56
    版主

全部回复

  • 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;
        }
    }


    大概这样

    知识改变命运,奋斗成就人生!
    2009年5月21日 8:29
    版主
  • FarPoint.Win.Spread.FpSpread temp = new FarPoint.Win.Spread.FpSpread();
    temp.Sheets = fpSpread1.Sheets; 

    我这样试了下,第二句出错了,提示无法赋值啊
    "无法对属性或索引器“FarPoint.Win.Spread.FpSpread.Sheets”赋值 -- 它是只读的"
    2009年5月21日 9:01
  • temp.Sheets 是只读的嘛, 你看看构造函数有没有重载,能够设置他
    知识改变命运,奋斗成就人生!
    2009年5月21日 9:05
    版主
  • 你好!
         Sheets是只读属性,不能直接赋值的!
    周雪峰
    2009年5月21日 10:06
    版主
  • temp.Sheets 是只读的嘛, 你看看构造函数有没有重载,能够设置他
    知识改变命运,奋斗成就人生!

    你好 大侠能不能具体点啊
    2009年5月21日 10:35
  • 你好!
         Sheets是只读属性,不能直接赋值的!
    周雪峰

    你好大侠 那如何才能深度复制一个fpSpread啊?
    2009年5月21日 10:35
  • 如果他本身没有提供这样的方法,我建议你新建一个对象,把一些属性设置成和原来的对象的属性一样来达到目的!
    周雪峰
    2009年5月21日 10:43
    版主
  • 如果他本身没有提供这样的方法,我建议你新建一个对象,把一些属性设置成和原来的对象的属性一样来达到目的!
    周雪峰
    你可以参照上面的方法,用产生 fpSpread1 的方法再产生一个不一样名称的变量试试
    知识改变命运,奋斗成就人生!
    2009年5月21日 11:56
    版主
  • 谢谢 各位大侠了
    暂时只找到这个方法,明天测试一下性能

            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);
            }

    2009年5月21日 15:02
  • 刚才试了一下性能,还是很慢很慢的

    实际我的情况是这样的:

    数据库中查询出大量数据放到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文件却比他小的多.

    2009年5月22日 4:58
  • 我想如果能把一个已经有数据的fpSpread的sheet复制三份,
    remove()掉不需要的列,然后导出最简单.
    但是尝试多次复制的只是一个引用,一 remove 所有的sheet都跟着变.
    这种方法很实用,你可以过样

    DataTable dt1 = "从数据库获取数据"
    DataTable dt2 = dt1.Copy(); 获取 dt1 的Copy
    DataTable dt3 = dt1.Copy();

    dt1.Columns.Remove()...
    dt2.Columns.Remove()...
    dt3.Columns.Remove()...

    然后分别通过 dt1,2,3 来成生 sheet




    知识改变命运,奋斗成就人生!
    2009年5月22日 5:03
    版主
  • ...
    DataTable dt1 = "从数据库获取数据"
    DataTable dt2 = dt1.Copy(); 获取 dt1 的Copy
    DataTable dt3 = dt1.Copy();

    dt1.Columns.Remove()...
    dt2.Columns.Remove()...
    dt3.Columns.Remove()...
    ...
    知识改变命运,奋斗成就人生!

    不过比较麻烦的是我的原始spread中的数据不是直接从数据库中获取的,
    从数据库中获取的实际是第几行第几列是什么值,
    然后用循环把所有值放到spread中的对应位置上.

    数据比较多,通过循环已经生成好的spread又不能完全复制,
    为了导出必须要再生成一个spread所以只能再循环一遍,所以很慢.

    不知道如何做才好啊
    2009年5月22日 6:40
  • Excel 可以一次给多个单元格赋值哦,你是不是一个单元格赋一次哟?


    知识改变命运,奋斗成就人生!
    2009年5月22日 6:59
    版主
  • 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了

    2009年5月22日 7:48
  • 那了解一个这个组件是否支持这样的功能,如果每个单元格都要赋值一次的话,数据越多效率越低
    知识改变命运,奋斗成就人生!
    2009年5月22日 8:05
    版主