Open Xml SDKを使用してDrawingsPart
をWorksheetPart
に追加してから、DrawingsPart
をWorksheetPart
から参照しようとしましたが、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");
}
DrawingsPart
がWorksheetPart
のPartDictionary
に追加されていないように見えます。なぜだろう?
@mjwills私は 'worksheetPart.DrawingsPart'がコードの最初の行、つまり' worksheetPart.AddNewPart() 'の呼び出しによって読み込まれると思いますか?私のプログラムで生成された出力ファイルを解凍し、図面部分は 'sheet1.xml.rels'ファイルにあります。 –
@mjwills 'drawingsPart'の人口は、上のリストのコードの3行目に示されています。' drawingsPart.WorksheetDrawing = drawingRootElement; ' –
@mjwills同じコード行で宣言され、割り当てられています。 –