2012-08-16 29 views
2

可能重複:
How to check if a cell has a picture?
OpenXML: Excel, extracting Cell text and Image/Picture dataOPENXML:Excel中確定圖像中一個細胞

我有4個圖像,每個小區中的A1,A2的Excel文檔,A3,A4

我可以遍歷工作表中的所有圖像,但我需要能夠編輯此函數以給我例如「A1」和「A2」中的圖像

[Test] 
    public void IterateThruImages() 
    { 
     WorkbookPart wbPart = document.WorkbookPart; 
     var workSheet = wbPart.WorksheetParts.FirstOrDefault(); 

     foreach(ImagePart i in workSheet.DrawingsPart.GetPartsOfType<ImagePart>()) 
     { 
      Stream stream = i.GetStream(); 
      long length = stream.Length; 
      byte[] byteStream = new byte[length]; 
      stream.Read(byteStream, 0, (int)length); 

      var imageAsString = Convert.ToBase64String(byteStream); 
     } 
    } 
+0

糟糕,關閉這裏的錯誤信息。抱歉。 – GSerg 2012-08-16 19:40:31

+0

Excel中的圖像從來不是「in」單元格,而是「超過」它們。檢查圖像的位置將爲您提供底層細胞。在VBA中,圖像/形狀具有'TopLeftCell'屬性:我不熟悉OpenXml,所以我不知道它是否暴露出來...... – 2012-08-16 19:55:50

回答

1

訣竅是獲得圖像的關係ID「rId」。你可以通過獲取有問題的行/列的TwoCellAnchor來獲得。然後獲取Embed。用它來獲取圖像。

[Test] 
    public void GetImageRelationshipIdAndImageOfThatId() 
    { 
     string row = "1"; 
     string col = "0"; 

     WorkbookPart wbPart = document.WorkbookPart; 
     var workSheet = wbPart.WorksheetParts.FirstOrDefault(); 

     TwoCellAnchor cellHoldingPicture = workSheet.DrawingsPart.WorksheetDrawing.OfType<TwoCellAnchor>() 
      .Where(c => c.FromMarker.RowId.Text == row && 
        c.FromMarker.ColumnId.Text == col).FirstOrDefault(); 

     var picture = cellHoldingPicture.OfType<DocumentFormat.OpenXml.Drawing.Spreadsheet.Picture>().FirstOrDefault(); 
     string rIdofPicture = picture.BlipFill.Blip.Embed; 

     Console.WriteLine("The rID of this Anchor's [{0},{1}] Picture is '{2}'" ,row,col, rIdofPicture); 

     ImagePart imageInThisCell = (ImagePart)workSheet.DrawingsPart.GetPartById(rIdofPicture); 

    }