2012-08-16 21 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); 

    }