qd98zhq 发表于 2015-2-7 08:18:00

保存样式和公式

问题如下:
1.现在我使用spreadsheet控件进行了绑定数据,而且使用了spread内部的公式功能,我想问这些公式是存储在哪些地方的,因为我保存数据后,再次打开该表,原来设置的公式我要提取进行还原。或是有什么好的方式进行这样情况的操作。
2.后面可能还会有其它方式对该spreadsheet界面其它编辑(字体,颜色,公式,函数等),反正总的说关于编辑speadsheet控件的设置参数是如何进行还原的,难道要重新保存整个工作簿?。
以上问题请赐教。谢谢。

iceman 发表于 2015-2-9 15:03:00

回复 1楼qd98zhq的帖子

StyleInfo 可以通过内置序列化方法保存:

            StyleInfo si = new StyleInfo();
            (si as IXmlSerializable).WriteXml()


公式目前无法单独保存,你可以在编辑的时候自主维护一个 XML 文件记录公式信息:公式、单元格行列索引。

qd98zhq 发表于 2015-2-9 17:02:00

以上的样式 StyleInfo 如何使用呢,能不能快速获取当前工作表ActiveSheet的所有设置样式,然后如休还原回来。

iceman 发表于 2015-2-10 14:26:00

回复 3楼qd98zhq的帖子

代码是遍历Spread中样式并且存储的代码:


public partial class MainWindow : Window
    {
      public MainWindow()
      {
            InitializeComponent();

            var style0 = new GrapeCity.Windows.SpreadSheet.Data.StyleInfo();
            style0.Background = new SolidColorBrush(Colors.Blue);
            style0.Name = "spstyle0";

            var style1 = new GrapeCity.Windows.SpreadSheet.Data.StyleInfo();
            style1.Background = new SolidColorBrush(Colors.Red);
            style1.Name = "spstyle1";

            gcSpreadSheet1.ActiveSheet.NamedStyles.Add(style0);
            gcSpreadSheet1.ActiveSheet.NamedStyles.Add(style1);
            gcSpreadSheet1.ActiveSheet.Cells.StyleName = "spstyle0";
            gcSpreadSheet1.ActiveSheet.Cells.StyleName = "spstyle1";

            gcSpreadSheet1.Invalidate();
            string filename = "..\\..\\3.xml";

            foreach (StyleInfo s in gcSpreadSheet1.ActiveSheet.NamedStyles)
            {
                if (File.Exists(filename))
                {
                  Stream fs = new FileStream(filename, FileMode.Append);
                  XmlWriter writer = new XmlTextWriter(fs, Encoding.Unicode);

                  XmlSerializer xs = new XmlSerializer(typeof(GrapeCity.Windows.SpreadSheet.Data.StyleInfo));
                  xs.Serialize(writer, s as IXmlSerializable);
                  fs.Close();
                }
                else
                {
                  Stream fs = new FileStream(filename, FileMode.Append);
                  XmlWriter writer = new XmlTextWriter(fs, Encoding.Unicode);

                  XmlSerializer xs = new XmlSerializer(typeof(GrapeCity.Windows.SpreadSheet.Data.StyleInfo));
                  xs.Serialize(writer, s as IXmlSerializable);
                  fs.Close();
                }
            }
            
      }

你可以在此基础上添加 单元格设置情况,也就是把引用StyleInfo 的单元格索引写入 xml 文件中。

再读取这个文件即可。由于 Spread 没有内置这种方法,我们提供了以上 Work Around,剩下的代码需要您自主实现。

谢谢

qd98zhq 发表于 2015-2-11 09:17:00

感谢.我试一下,回头有什么问题再请教。先祝新年愉快 。

iceman 发表于 2015-2-11 11:14:00

回复 5楼qd98zhq的帖子

好的,也祝您新春快乐。

qd98zhq 发表于 2015-2-12 16:08:00

你好,关于保存spreadsheet 表格样式格式与还原样式格式问题,现在我的想法是这样,我先把所有数据绑定列表的数据保存到数据库,然后清空所有数据,再把整个表格的所有样式保存成一个XML格式的文件,我的问题是能否直接快速通过之前保存的XML格式的文件把样式还原回来,如果可以,代码方面如何编写,能否给个DEMO,谢谢支持。
另外, GcSpreadSheet的API中文说明文档有没有呢,在哪里有下载。

iceman 发表于 2015-2-12 17:46:00

回复 7楼qd98zhq的帖子

4# 中即为保存的样式方法,目前需要做的是存储对应的 Cell 索引。
获取方法可以通过StyleInfo 的 ReadXml 方法来获取。

我可以提供 XML 文件的读取方法,明天会尝试编辑。
自定义节点添加Cell索引等部分还需要您自主完成。

谢谢

qd98zhq 发表于 2015-2-13 12:03:00

我现在把数据保存为XML格式,其中数据的部分看到某些单元格文字比较多时,好像是用数据流的方式存储起来了(Base64value 的部分),如下所示,我想问的是这些数据流是加了一定的算法吗,如果我要单独提取出来显示正常的文字格式,然后进行额外保存的话我要怎么操作,代码如何写,请赐教,或是我要用什么样的方式进行还原显示出来。
          <CellBlock rc="10" cc="3">
            <Data>
            <C pos="0,0" type="0" value="程序改造工程" />
            <C pos="3,2" type="0" Base64value="True" value="MgAwADEANAAtADAANwAtADIANgDbj1VcxWC1URr/GpDHjyROKk4fZh9nhHZEjZllNmXGlgz/7nZNUhR4dnqEdtuPVVw6Tu9T5U6KYkkAVgALeo9ehHbokAZSn1L9gD5lMFJJAEUAT23IiWhWLU7Qj0yIDP8KAEZP0I9MiMePC3otThpPCWcATptOD2HzYA1OMFKEdu6VmJj6UbBzAjAKADIAMAAxADQALQAwADgALQAwADIA249VXMVgtVEa/7BzKFfvU+VOimJJAFYA404Leo9ehHZ7dlVfRmhMdWKXPmUwUkkARQAtTtCPTIgM/wlnhV+MW4RV248ATmVrjFuEVQIwCgAyADAAMQA0AC0AMAA4AC0AMAA5ANuPVVzFYLVRGv+wcyhXdGUqTpReKHULeo9e71PlTlNiBVOEdrllD18+ZTBSSQBFAC1O0I9MiAz/Rk8xdY5O11MwUnBlbmOTXr+L7pVCXIR2AF/RUyFqD19QljZSDP+wcyhX6lP9gNCPTIgoV0Bc31dRf4R2T23IiWhWLU4M/w1O/YDQj0yIKFeSTlSAUX+Edq9zg1gtTgz/f08odS1O2I8aT/pRsHMATptODU4OZoR2xWC1UQz/2I8JZ4VfjFuEVduPAE5lawOMdGWMW4RVAjAKADIAMAAxADQALQAwADgALQAxADYA249VXMVgtVEa/+52TVL9gIpiSQBWAAt6j174dnNRhHaoUgFgk15EAEwATAAM/1NiBVMQYkMAQQBCAIR2uWUPX9CPTIgoV0kARQBPbciJLU4M/wyAFE6hixJSU2KXewZcQwBBAEIABVPokHJ/MFJJAEkAUwANZ6FSaFYtTgz/2Y83aKJbN2Lvev2AuWW/T7+L7pUwUtFTA176UWVnhHYLeo9eDP9TYpd7C04qTh9mH2eEdgtOSlNoVNFTA17Zfktt1YvokH9PKHUATgtOAjAKAAoAMgAwADEANAAtADAAOQAtADIAMADbj1VcxWC1URr/jFuEVS1OLgAuAC4ACgA=" />
            <C pos="4,0" type="1" value="3" />
            </Data>
          </CellBlock>

iceman 发表于 2015-2-13 17:57:00

回复 9楼qd98zhq的帖子

当前调查进度:

            var base64 = &quot;MgAwADEANAAtADAANwAtADIANgDbj1VcxWC1URr/GpDHjyROKk4fZh9nhHZEjZllNmXGlgz/7nZNUhR4dnqEdtuPVVw6Tu9T5U6KYkkAVgALeo9ehHbokAZSn1L9gD5lMFJJAEUAT23IiWhWLU7Qj0yIDP8KAEZP0I9MiMePC3otThpPCWcATptOD2HzYA1OMFKEdu6VmJj6UbBzAjAKADIAMAAxADQALQAwADgALQAwADIA249VXMVgtVEa/7BzKFfvU+VOimJJAFYA404Leo9ehHZ7dlVfRmhMdWKXPmUwUkkARQAtTtCPTIgM/wlnhV+MW4RV248ATmVrjFuEVQIwCgAyADAAMQA0AC0AMAA4AC0AMAA5ANuPVVzFYLVRGv+wcyhXdGUqTpReKHULeo9e71PlTlNiBVOEdrllD18+ZTBSSQBFAC1O0I9MiAz/Rk8xdY5O11MwUnBlbmOTXr+L7pVCXIR2AF/RUyFqD19QljZSDP+wcyhX6lP9gNCPTIgoV0Bc31dRf4R2T23IiWhWLU4M/w1O/YDQj0yIKFeSTlSAUX+Edq9zg1gtTgz/f08odS1O2I8aT/pRsHMATptODU4OZoR2xWC1UQz/2I8JZ4VfjFuEVduPAE5lawOMdGWMW4RVAjAKADIAMAAxADQALQAwADgALQAxADYA249VXMVgtVEa/+52TVL9gIpiSQBWAAt6j174dnNRhHaoUgFgk15EAEwATAAM/1NiBVMQYkMAQQBCAIR2uWUPX9CPTIgoV0kARQBPbciJLU4M/wyAFE6hixJSU2KXewZcQwBBAEIABVPokHJ/MFJJAEkAUwANZ6FSaFYtTgz/2Y83aKJbN2Lvev2AuWW/T7+L7pUwUtFTA176UWVnhHYLeo9eDP9TYpd7C04qTh9mH2eEdgtOSlNoVNFTA17Zfktt1YvokH9PKHUATgtOAjAKAAoAMgAwADEANAAtADAAOQAtADIAMADbj1VcxWC1URr/jFuEVS1OLgAuAC4ACgA=&quot;;
            var data = Convert.FromBase64String(base64);
            var str = Encoding.UTF8.GetString(data);
            Console.WriteLine(str);


目前展示出来为乱码,应该是中文编码问题。
可以尝试在这个基础上解决,下周会继续进行调查。
页: [1] 2
查看完整版本: 保存样式和公式