2017-02-08 48 views
1

我需要将长文档(特定于文档)字符串保存到Excel文档。 由于Office.Core.CustomDocumentProperty.value的长度限制只有255个字符,因此请告知如何克服此限制,或建议其他方式将数据存储在Excel文档中。如何克服自定义文档属性大小限制

(根据我的记忆,一个单元格公式只能存储255字符,所以这不是一个可行的解决方案。)

+0

您正在使用什么版本的互操作的(我高度建议更改名称空间"urn:custom-storage:XXX"独特和专有的东西,免得你相抵触运行使用同样的技术编写其他软件)。旧版本用于Excel 2003,其限制为255个字符。 – jdweng

+0

VSTO for Excel 2010.似乎只有前255个字符被存储... – Carson

+0

您绝对可以在Excel 2010中的单元格中存储**超过255个字符**文本。[Excel规范和限制文档](https:/ /support.office.com/en-us/article/Excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3#ID0EBABAAA=Excel_2010)指出:*“单元格可包含的字符总数:32,767字符“* –

回答

2

只是分裂你的价值为多个属性。像这样的东西会奏效。

private static void WriteCustomDocumentProperty(Workbook workbook, string name, string value) 
{ 
    dynamic customDocumentProperties = workbook.CustomDocumentProperties; 
    var numParts = value.Length/255 + (value.Length%255 != 0 ? 1 : 0); 
    for (var i = 0; i < numParts; ++i) 
    { 
     var part = value.Substring(i*255, Math.Min(255, value.Length - i*255)); 
     customDocumentProperties.Add(name + "." + i, false, MsoDocProperties.msoPropertyTypeString, part); 
    } 
    customDocumentProperties.Add(name + ".Count", false, MsoDocProperties.msoPropertyTypeNumber, numParts); 
} 

private static string ReadCustomDocumentProperty(Workbook workbook, string name) 
{ 
    dynamic customDocumentProperties = workbook.CustomDocumentProperties; 
    var numParts = Convert.ToInt32(customDocumentProperties[name + ".Count"].Value); 
    var value = new StringBuilder(); 
    for (var i = 0; i < numParts; ++i) 
     value.Append(customDocumentProperties[name + "." + i].Value); 
    return value.ToString(); 
} 

根据字符串的大小,这可能会很慢。更好的选择可能是使用自定义XML部件。

private static void WriteCustomDocumentProperty(Workbook workbook, string name, string value) 
{ 
    var ns = "urn:custom-storage:" + name; 
    var document = new XDocument(new XElement(XName.Get("custom-storage", ns), value)); 
    var xmlValue = document.ToString(); 
    workbook.CustomXMLParts.Add(xmlValue); 
} 

private static string ReadCustomDocumentProperty(Workbook workbook, string name) 
{ 
    var ns = "urn:custom-storage:" + name; 
    var parts = workbook.CustomXMLParts.SelectByNamespace(ns); 
    switch (parts.Count) 
    { 
     case 0: 
      return null; 
     case 1: 
      return XDocument.Parse(parts[1].XML).Root.Value; 
     default: 
      throw new ApplicationException("Duplicate part in workbook."); 
    } 
} 
+0

请指出自定义文档属性的数量是否有大小限制。 – Carson

+0

我不知道答案是什么,但测试(花了我1分钟写完,你自己可以做的)表明我可以安全地写出10,000条长度为255的字符串。如果你需要存储比这更长的东西,我会留给你进一步测试。 –

+0

仅供参考:您也可以将CustomXMLPart用于此存储。这些东西没有尺寸限制(或者很大)。 –