2017-02-08 5 views
1

長い(ドキュメント固有の)文字列をExcelドキュメントに保存する必要があります。 Office.Core.CustomDocumentProperty.valueの長さの制限は255文字であるため、この制限を解決する方法や、Excelドキュメントにデータを格納する他の方法を提案する方法についてアドバイスしてください。カスタムドキュメントプロパティのサイズ制限を克服する方法

(私の記憶には、セルの数式のみ255文字を格納することができますので、これは実行可能なソリューションではありません。)

+0

使用している相互運用のどのバージョン。古いバージョンは255文字の制限を持つExcel 2003用です。 – 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パーツを使用することです。 (あなたは抵触これと同じ手法を使って書かれた別のソフトウェアの実行なかれI 非常には、ユニークで独自のものに名前空間"urn:custom-storage:XXX"を変更することをお勧めします。)

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分かかっていました。自分でできたことがあります)は、長さ255の10,000文字列を安全に書き込むことができることを示しています。それ以上のテストのためにあなたに残しておきます。 –

+0

FYI:このストレージにはCustomXMLPartを使用することもできます。これらのものはサイズ制限がありません(またはそれは巨大です)。 –

関連する問題