2017-10-12 5 views
0

Open Xml SDKを使用してDrawingsPartWorksheetPartに追加してから、DrawingsPartWorksheetPartから参照しようとしましたが、ArgumentOutOfRangeExceptionが届きました。ここでDrawingsPartがWorksheetPartに追加されていません。指定された引数が有効な値の範囲外です

はコードの関連するスニペットです:

// Add a new drawings part to the worksheet 
var drawingsPart = worksheetPart.AddNewPart<DrawingsPart>(); 

// make a drawing DOM 
var drawingRootElement = new WorksheetDrawing(); 

// add to the drawing DOM 
... 

// and then... 
// associate the drawing DOM to the drawings part 
drawingsPart.WorksheetDrawing = drawingRootElement; 

// save the drawing DOM back to the drawings part 
drawingsPart.WorksheetDrawing.Save(); 

// and finally... 
// here is where it throws the ArgumentOutOfRangeException 
// whether I supply the drawingsPart as the argument 
// or the value worksheet.DrawingsPart 
// it reports the same exception 
// I looked up the source of OpenXmlPartContainer.GetIdOfPart 
// and it looks like the DrawingsPart is not yet added to the 
// PartDictionary of the WorksheetPart. I wonder why? 
var relationshipIdOfDrawingsPart = drawingsPart 
          .GetIdOfPart(worksheetPart.DrawingsPart /* drawingsPart */); 


// Create a new drawing element and add it to the Worksheet DOM 
var drawingElement = new DocumentFormat.OpenXml.Spreadsheet.Drawing { Id = relationshipIdOfDrawingsPart }; 
worksheetPart.Worksheet.Append(drawingElement); 

例外の詳細:

System.ArgumentOutOfRangeExceptionがのHRESULT = 0x80131502
メッセージ=指定された引数が有効なの範囲外だった起こりました値。
ソース= DocumentFormat.OpenXmlのStackTrace: DocumentFormat.OpenXml.Packaging.OpenXmlPartContainer.GetIdOfPart(OpenXmlPart 部分)で...私のコード

で私は(以下に再現)OpenXmlPartContainer.GetIdOfPartのソースを見上げ:

// DocumentFormat.OpenXml.Packaging.OpenXmlPartContainer 
/// <summary> 
/// Gets the relationship ID of the part. 
/// </summary> 
/// <param name="part">The part.</param> 
/// <returns>The relationship ID of the part.</returns> 
/// <exception cref="T:System.ArgumentNullException">Thrown when "part" is null reference.</exception> 
/// <exception cref="T:System.ArgumentOutOfRangeException">Thrown when the part does not exist.</exception> 
public string GetIdOfPart(OpenXmlPart part) 
{ 
    this.ThrowIfObjectDisposed(); 
    if (part == null) 
    { 
     throw new ArgumentNullException("part"); 
    } 
    if (this.PartDictionary.ContainsValue(part)) 
    { 
     foreach (KeyValuePair<string, OpenXmlPart> current in this.PartDictionary) 
     { 
      if (part == current.Value) 
      { 
       return current.Key; 
      } 
     } 
    } 
    throw new ArgumentOutOfRangeException("part"); 
} 

DrawingsPartWorksheetPartPartDictionaryに追加されていないように見えます。なぜだろう?

+0

@mjwills私は 'worksheetPart.DrawingsPart'がコードの最初の行、つまり' worksheetPart.AddNewPart () 'の呼び出しによって読み込まれると思いますか?私のプログラムで生成された出力ファイルを解凍し、図面部分は 'sheet1.xml.rels'ファイルにあります。 –

+0

@mjwills 'drawingsPart'の人口は、上のリストのコードの3行目に示されています。' drawingsPart.WorksheetDrawing = drawingRootElement; ' –

+0

@mjwills同じコード行で宣言され、割り当てられています。 –

答えて

1

worksheetPart.DrawingsPartdrawingsPartが同じオブジェクトであることを考えると、このコードは意味がありません。

// and finally... 
// here is where it throws the ArgumentOutOfRangeException 
// whether I supply the drawingsPart as the argument 
// or the value worksheet.DrawingsPart 
// it reports the same exception 
// I looked up the source of OpenXmlPartContainer.GetIdOfPart 
// and it looks like the DrawingsPart is not yet added to the 
// PartDictionary of the WorksheetPart. I wonder why? 
var relationshipIdOfDrawingsPart = drawingsPart 
          .GetIdOfPart(worksheetPart.DrawingsPart /* drawingsPart */); 

オブジェクトのPartDictionary自体への参照が含まれている場合、それがのみ動作するからです。

このように、親オブジェクトでdrawingsPartではなくGetIdOfPartを呼び出す必要があります。

関連する問題