2017-02-08 80 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用於此存儲。這些東西沒有尺寸限制(或者很大)。 –