2014-02-17 1 views
0

통합 문서의 차트 위치를 기반으로 Excel 차트를 삭제할 수 있습니까? 예를 들어, 현재 차트 이름을 삭제하려면 아래 코드를 사용하고 있습니다. 하지만 내가 쳤던 올가미는 때로는 차트의 이름이 다릅니다. 유일하게 일관된 것은 그들이 같은 위치에 있다는 것입니다. 또는 누군가가 그것을 기반으로 위치 삭제합니다 어디에 내 코드를 조정할 수있는이 같은위치를 기반으로 차트를 삭제 하시겠습니까?

foreach (Microsoft.Office.Interop.Excel.Shape shp in oXL.Sheets["Sheet 1"].Shapes) 
if (shp.Type == MsoShapeType.msoChart) 
{ 
    if (shp.Name == "Chart 233" || shp.Name == "Chart 111") { shp.Delete(); } 
} 
+0

모양 셰이프의 왼쪽 위 모서리 아래에 셀을 반환하는 TopLeftCell 속성을가집니다. 이를 사용하여 워크 시트의 모양을 결정할 수 있습니다. 또는 셰이프'Top'과'Left' 속성을 사용하여 플롯이 위치 할 것으로 예상되는 셀의'Top'과'Left'와 비교할 수 있습니다. –

+0

Shape.TopLeftCell을 사용하면 맨 위 왼쪽 셀을 얻을 수 있지만 일단 정보를 얻으면 실제로 Shape.TopLeftCell 값을 기반으로 해당 셰이프를 삭제할 수 있습니까? – MasterOfStupidQuestions

+0

Shp.Delete는 원하는 차트인지 확인한 후에도 작동합니다. –

답변

1

뭔가 - 왼쪽 위 모서리 범위 B4 내에있는 경우 차트를 삭제합니다 : D8

//... 
    using Office = Microsoft.Office.Core; 
    using Excel = Microsoft.Office.Interop.Excel; 
    using ios = System.Runtime.InteropServices; 
    //... 

    private void btnDeleteChart_Click(object sender, EventArgs e) 
    { 
     Excel.Application xl = GetExcel(); 
     if (xl == null) return; 

     Excel.Workbook wb = xl.ActiveWorkbook; 
     Excel.Worksheet sht = wb.ActiveSheet; 
     Excel.Range rSrch = sht.Range["B4:D8"]; 

     Excel.Range rShp; 

     foreach (Excel.Shape shp in sht.Shapes) 
     if (shp.Type == Office.MsoShapeType.msoChart) 
     { 
      rShp = shp.TopLeftCell; 
      if(xl.Intersect(rShp,rSrch)!=null)shp.Delete(); 
     } 
    } 

    private Excel.Application GetExcel() 
    { 
     Excel.Application xl = 
      (Excel.Application)ios.Marshal.GetActiveObject("Excel.Application"); 
     if (xl == null) MessageBox.Show("No Excel !!"); 
     return xl; 
    } 
관련 문제