找回密码
 立即注册

QQ登录

只需一步,快速开始

qd98zhq

论坛元老

12

主题

61

帖子

1万

积分

论坛元老

积分
15632

活字格认证

[已处理] 保存样式和公式

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

12 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2015-2-9 15:03:00
沙发
回复 1楼qd98zhq的帖子

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

  1.             StyleInfo si = new StyleInfo();
  2.             (si as IXmlSerializable).WriteXml()
复制代码


公式目前无法单独保存,你可以在编辑的时候自主维护一个 XML 文件记录公式信息:公式、单元格行列索引。
回复 使用道具 举报
qd98zhq
论坛元老   /  发表于:2015-2-9 17:02:00
板凳
以上的样式 StyleInfo 如何使用呢,能不能快速获取当前工作表ActiveSheet的所有设置样式,然后如休还原回来。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-2-10 14:26:00
地板
回复 3楼qd98zhq的帖子

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


  1. public partial class MainWindow : Window
  2.     {
  3.         public MainWindow()
  4.         {
  5.             InitializeComponent();

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

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

  12.             gcSpreadSheet1.ActiveSheet.NamedStyles.Add(style0);
  13.             gcSpreadSheet1.ActiveSheet.NamedStyles.Add(style1);
  14.             gcSpreadSheet1.ActiveSheet.Cells[0, 0].StyleName = "spstyle0";
  15.             gcSpreadSheet1.ActiveSheet.Cells[1, 0].StyleName = "spstyle1";

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

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

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

  32.                     XmlSerializer xs = new XmlSerializer(typeof(GrapeCity.Windows.SpreadSheet.Data.StyleInfo));
  33.                     xs.Serialize(writer, s as IXmlSerializable);
  34.                     fs.Close();
  35.                 }
  36.             }
  37.             
  38.         }
复制代码


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

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

谢谢
回复 使用道具 举报
qd98zhq
论坛元老   /  发表于:2015-2-11 09:17:00
5#
感谢.我试一下,回头有什么问题再请教。先祝新年愉快 。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-2-11 11:14:00
6#
回复 5楼qd98zhq的帖子

好的,也祝您新春快乐。
回复 使用道具 举报
qd98zhq
论坛元老   /  发表于:2015-2-12 16:08:00
7#
你好,关于保存spreadsheet 表格样式格式与还原样式格式问题,现在我的想法是这样,我先把所有数据绑定列表的数据保存到数据库,然后清空所有数据,再把整个表格的所有样式保存成一个XML格式的文件,我的问题是能否直接快速通过之前保存的XML格式的文件把样式还原回来,如果可以,代码方面如何编写,能否给个DEMO,谢谢支持。
另外, GcSpreadSheet的API中文说明文档有没有呢,在哪里有下载。
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2015-2-12 17:46:00
8#
回复 7楼qd98zhq的帖子

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

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

谢谢
回复 使用道具 举报
qd98zhq
论坛元老   /  发表于:2015-2-13 12:03:00
9#
我现在把数据保存为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
10#
回复 9楼qd98zhq的帖子

当前调查进度:

  1.             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;;
  2.             var data = Convert.FromBase64String(base64);
  3.             var str = Encoding.UTF8.GetString(data);
  4.             Console.WriteLine(str);
复制代码


目前展示出来为乱码,应该是中文编码问题。
可以尝试在这个基础上解决,下周会继续进行调查。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部