2011-05-18 4 views
4

Je suis en mesure de créer une feuille de calcul avec succès, et je semble avoir ajouté l'image via le code, le problème est que lorsque j'ouvre la feuille de calcul, il n'y a pas d'image. Voici mon code:Open XML SDK - image ne s'affiche pas dans Excel

public static void CreateSpreadsheetWorkbook(string filepath) 
    { 
     SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook); 

     WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart(); 
     workbookpart.Workbook = new Workbook(); 

     WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>(); 
     worksheetPart.Worksheet = new Worksheet(new SheetData()); 

     Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); 
     Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "mySheet" }; 
     sheets.Append(sheet); 

     string sImagePath = @"C:\temp\install_button.png"; 
     DrawingsPart drawingsPart = worksheetPart.AddNewPart<DrawingsPart>(); 

     ImagePart imagePart = drawingsPart.AddImagePart(ImagePartType.Png, worksheetPart.GetIdOfPart(drawingsPart)); 
     using (FileStream stream = new FileStream(sImagePath, FileMode.Open)) 
     { 
      imagePart.FeedData(stream); 
     } 

     workbookpart.Workbook.Save(); 
     spreadsheetDocument.Close(); 
    } 

Merci

Stu

Répondre

7

Normalement, quand je ne peux pas comprendre pourquoi quelque chose ne fonctionne pas lorsque le traitement avec le SDK Open XML j'utilise le Open XML SDK 2.0 Productivity Tool pour comprendre ce que le code devrait être. Je vais normalement créer une feuille de calcul vierge dans Excel, ajouter une image, puis enregistrer le document. Ensuite, je vais ouvrir ce document dans l'outil Productivité et cliquez sur le bouton Réfléchir le code pour voir comment recréer ce document. Je l'ai fait pour voir comment répondre à votre question et a obtenu le code suivant pour créer une partie de feuille de calcul:

 // Adds child parts and generates content of the specified part. 
     public void CreateWorksheetPart(WorksheetPart part) 
     { 
      DrawingsPart drawingsPart1 = part.AddNewPart<DrawingsPart>("rId2"); 
      GenerateDrawingsPart1Content(drawingsPart1); 

      ImagePart imagePart1 = drawingsPart1.AddNewPart<ImagePart>("image/png", "rId1"); 
      GenerateImagePart1Content(imagePart1); 

      SpreadsheetPrinterSettingsPart spreadsheetPrinterSettingsPart1 = part.AddNewPart<SpreadsheetPrinterSettingsPart>("rId1"); 
      GenerateSpreadsheetPrinterSettingsPart1Content(spreadsheetPrinterSettingsPart1); 

      GeneratePartContent(part); 
     } 

     // Generates content of drawingsPart1. 
     private void GenerateDrawingsPart1Content(DrawingsPart drawingsPart1) 
     { 
      Xdr.WorksheetDrawing worksheetDrawing1 = new Xdr.WorksheetDrawing(); 
      worksheetDrawing1.AddNamespaceDeclaration("xdr", "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"); 
      worksheetDrawing1.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main"); 

      Xdr.TwoCellAnchor twoCellAnchor1 = new Xdr.TwoCellAnchor(){ EditAs = Xdr.EditAsValues.OneCell }; 

      Xdr.FromMarker fromMarker1 = new Xdr.FromMarker(); 
      Xdr.ColumnId columnId1 = new Xdr.ColumnId(); 
      columnId1.Text = "0"; 
      Xdr.ColumnOffset columnOffset1 = new Xdr.ColumnOffset(); 
      columnOffset1.Text = "0"; 
      Xdr.RowId rowId1 = new Xdr.RowId(); 
      rowId1.Text = "0"; 
      Xdr.RowOffset rowOffset1 = new Xdr.RowOffset(); 
      rowOffset1.Text = "0"; 

      fromMarker1.Append(columnId1); 
      fromMarker1.Append(columnOffset1); 
      fromMarker1.Append(rowId1); 
      fromMarker1.Append(rowOffset1); 

      Xdr.ToMarker toMarker1 = new Xdr.ToMarker(); 
      Xdr.ColumnId columnId2 = new Xdr.ColumnId(); 
      columnId2.Text = "0"; 
      Xdr.ColumnOffset columnOffset2 = new Xdr.ColumnOffset(); 
      columnOffset2.Text = "171429"; 
      Xdr.RowId rowId2 = new Xdr.RowId(); 
      rowId2.Text = "0"; 
      Xdr.RowOffset rowOffset2 = new Xdr.RowOffset(); 
      rowOffset2.Text = "171429"; 

      toMarker1.Append(columnId2); 
      toMarker1.Append(columnOffset2); 
      toMarker1.Append(rowId2); 
      toMarker1.Append(rowOffset2); 

      Xdr.Picture picture1 = new Xdr.Picture(); 

      Xdr.NonVisualPictureProperties nonVisualPictureProperties1 = new Xdr.NonVisualPictureProperties(); 
      Xdr.NonVisualDrawingProperties nonVisualDrawingProperties1 = new Xdr.NonVisualDrawingProperties(){ Id = (UInt32Value)2U, Name = "Picture 1", Description = "eprs_reports_arrow.png" }; 

      Xdr.NonVisualPictureDrawingProperties nonVisualPictureDrawingProperties1 = new Xdr.NonVisualPictureDrawingProperties(); 
      A.PictureLocks pictureLocks1 = new A.PictureLocks(){ NoChangeAspect = true }; 

      nonVisualPictureDrawingProperties1.Append(pictureLocks1); 

      nonVisualPictureProperties1.Append(nonVisualDrawingProperties1); 
      nonVisualPictureProperties1.Append(nonVisualPictureDrawingProperties1); 

      Xdr.BlipFill blipFill1 = new Xdr.BlipFill(); 

      A.Blip blip1 = new A.Blip(){ Embed = "rId1", CompressionState = A.BlipCompressionValues.Print }; 
      blip1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); 

      A.Stretch stretch1 = new A.Stretch(); 
      A.FillRectangle fillRectangle1 = new A.FillRectangle(); 

      stretch1.Append(fillRectangle1); 

      blipFill1.Append(blip1); 
      blipFill1.Append(stretch1); 

      Xdr.ShapeProperties shapeProperties1 = new Xdr.ShapeProperties(); 

      A.Transform2D transform2D1 = new A.Transform2D(); 
      A.Offset offset1 = new A.Offset(){ X = 0L, Y = 0L }; 
      A.Extents extents1 = new A.Extents(){ Cx = 171429L, Cy = 171429L }; 

      transform2D1.Append(offset1); 
      transform2D1.Append(extents1); 

      A.PresetGeometry presetGeometry1 = new A.PresetGeometry(){ Preset = A.ShapeTypeValues.Rectangle }; 
      A.AdjustValueList adjustValueList1 = new A.AdjustValueList(); 

      presetGeometry1.Append(adjustValueList1); 

      shapeProperties1.Append(transform2D1); 
      shapeProperties1.Append(presetGeometry1); 

      picture1.Append(nonVisualPictureProperties1); 
      picture1.Append(blipFill1); 
      picture1.Append(shapeProperties1); 
      Xdr.ClientData clientData1 = new Xdr.ClientData(); 

      twoCellAnchor1.Append(fromMarker1); 
      twoCellAnchor1.Append(toMarker1); 
      twoCellAnchor1.Append(picture1); 
      twoCellAnchor1.Append(clientData1); 

      worksheetDrawing1.Append(twoCellAnchor1); 

      drawingsPart1.WorksheetDrawing = worksheetDrawing1; 
     } 

     // Generates content of imagePart1. 
     private void GenerateImagePart1Content(ImagePart imagePart1) 
     { 
      System.IO.Stream data = GetBinaryDataStream(imagePart1Data); 
      imagePart1.FeedData(data); 
      data.Close(); 
     } 

     // Generates content of spreadsheetPrinterSettingsPart1. 
     private void GenerateSpreadsheetPrinterSettingsPart1Content(SpreadsheetPrinterSettingsPart spreadsheetPrinterSettingsPart1) 
     { 
      System.IO.Stream data = GetBinaryDataStream(spreadsheetPrinterSettingsPart1Data); 
      spreadsheetPrinterSettingsPart1.FeedData(data); 
      data.Close(); 
     } 

     // Generates content of part. 
     private void GeneratePartContent(WorksheetPart part) 
     { 
      Worksheet worksheet1 = new Worksheet(); 
      worksheet1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); 
      SheetDimension sheetDimension1 = new SheetDimension(){ Reference = "A1" }; 

      SheetViews sheetViews1 = new SheetViews(); 
      SheetView sheetView1 = new SheetView(){ TabSelected = true, WorkbookViewId = (UInt32Value)0U }; 

      sheetViews1.Append(sheetView1); 
      SheetFormatProperties sheetFormatProperties1 = new SheetFormatProperties(){ DefaultRowHeight = 15D }; 
      SheetData sheetData1 = new SheetData(); 
      PageMargins pageMargins1 = new PageMargins(){ Left = 0.7D, Right = 0.7D, Top = 0.75D, Bottom = 0.75D, Header = 0.3D, Footer = 0.3D }; 
      PageSetup pageSetup1 = new PageSetup(){ Orientation = OrientationValues.Portrait, Id = "rId1" }; 
      Drawing drawing1 = new Drawing(){ Id = "rId2" }; 

      worksheet1.Append(sheetDimension1); 
      worksheet1.Append(sheetViews1); 
      worksheet1.Append(sheetFormatProperties1); 
      worksheet1.Append(sheetData1); 
      worksheet1.Append(pageMargins1); 
      worksheet1.Append(pageSetup1); 
      worksheet1.Append(drawing1); 

      part.Worksheet = worksheet1; 
     } 

     #region Binary Data 
     private string imagePart1Data ="lots of binary data here"; 

     private System.IO.Stream GetBinaryDataStream(string base64String) 
     { 
      return new System.IO.MemoryStream(System.Convert.FromBase64String(base64String)); 
     } 

     #endregion 

Je vous recommande de faire la même chose avec votre image et jouer avec le code généré afin d'obtenir à travailler depuis, comme vous pouvez le voir, il suffit d'ajouter une image à une nouvelle diapositive, c'est beaucoup de code.

+0

Merci amurra. C'était vraiment utile! – hoakey

+0

Incroyable ne savait pas à propos de l'outil de productivité, merci! – timi2shoes

Questions connexes