2016-12-06 1 views
0

존재해야하는 페이지 나누기 항목을 검색 할 때 잘못된 인덱스 COM 예외이 발생합니다.C에서 Excel Interop을 사용하는 '잘못된 인덱스'

Excel.Worksheet.HPageBreaks 목록에서 세 번째 이상의 항목에 액세스하려고 할 때마다 잘못된 인덱스 오류가 반환됩니다. 항목 1 또는 2 인 경우 항목을 검색하는 데 문제가 없으며 필요한 매개 변수를 제공합니다. (각 페이지에서 페이지 나누기 행을 검색하여 입력중인 데이터가 특정 지점에서 분리되지 않는지 확인하려고합니다.)

이 코드를 초기화하는 방법은 기존 코드에서 발생했습니다. 어쩌면 당신이 볼 수있는 몇 가지 매개 변수가 모순 될 수 있습니다. 내 출력은 MessageBoxes입니다.

가 여기에 기존 코드 :

 Excel.Application xApp = new Excel.Application(); 
     Excel.Workbook xWorkBook; 
     Excel.Worksheet xWorkSheet; 
     object missingVal = System.Reflection.Missing.Value; 

     xWorkBook = xApp.Workbooks.Add(missingVal); 
     xWorkSheet = xWorkBook.Worksheets.get_Item(1); 
     xWorkSheet.PageSetup.Orientation = 
Microsoft.Office.Interop.Excel.XlPageOrientation.xlPortrait; 
     xWorkSheet.PageSetup.Zoom = false; 
     xWorkSheet.PageSetup.FitToPagesTall = 20; 
     xWorkSheet.PageSetup.FitToPagesWide = 1; 
     xApp.UseSystemSeparators = false; 

     xWorkSheet.Columns[1].ColumnWidth = 25; 
     xWorkSheet.Columns[2].ColumnWidth = 10; 
     for (int i = 3; i < 28; i++) 
      xWorkSheet.Columns[i].ColumnWidth = 1; 

     var range = xWorkSheet.get_Range("A1", "AB1"); 
     range.Merge(); 
     range.Font.Size = 16; 
     range.RowHeight = 21; 
     range.Font.Bold = true; 
     range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; 
     range = xWorkSheet.get_Range("A2", "AB2"); 
     range.Merge(); 
     range.Font.Size = 10; 
     range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; 

     MessageBox.Show(xWorkSheet.HPageBreaks.Count.ToString()); //This gives zero pagebreaks 
     xWorkSheet.Cells[500, 1] = " "; 
     MessageBox.Show(xWorkSheet.HPageBreaks.Count.ToString()); //This gives nine pagebreaks 
     MessageBox.Show(xWorkSheet.HPageBreaks.Item[1].Location.Row.ToString()); //This returns 51 
     MessageBox.Show(xWorkSheet.HPageBreaks.Item[2].Location.Row.ToString()); //This returns 102 
     MessageBox.Show(xWorkSheet.HPageBreaks.Item[3].Location.Row.ToString()); //This is where it breaks with the error 

코드의 하단에서, 나는 거기에 9 개 항목은 xWorkSheet.HPageBreaks.Count.ToString()를 사용 pagebreaks에 총한다는 항목을 확인하기 전에 확인. 그냥이 중요한 경우 항목 확실하지 않음 2. 과거의 모든 항목을 검색 할 수하지 않는 것,하지만 난

xWorkSheet.HPageBreaks.Item[3] 

xWorkSheet.HPageBreaks[3] 

xWorkSheet.HPageBreaks[xWorkSheet.HPageBreaks.Count] //Success at 1 or 2 PBs only 
로 전환 시도

행 500 이외의 엑셀 시트에서 공백 문자에 대해 다른 게재 위치를 시도했습니다.

아이디어가 절대적으로 없으며 해결책을 찾지 못한 채 2010 년에 게시 된 관련성없는 해결책을 찾지 못했습니다. 이것은 내 첫 번째 질문이기 때문에 아무것도 놓친 경우 알려 주시기 바랍니다. :)

내가 놓칠 수있는 아이디어 나 해결책이 있습니까?

감사합니다.

편집 : 불행히도, 나는 또한 this post처럼 foreach 루프를 사용하여 foreach 루프를 가리키는 잘못된 인덱스 오류를 다시 반환합니다. 수하여

xApp.ActiveWindow.View = XlWindowView.xlPageBreakPreview; 
xWorkSheet.DisplayPageBreaks = true; 
xWorkSheet.DisplayAutomaticPageBreaks = true; 

이 객체 내에서 가시가되기 위해 페이지 나누기의 모든 값을 허용해야하고, : 나는

+0

코드를 디버깅하고'xWorksheet.HPageBreaks.Count'의 값을 확인하면 되돌릴 정수는 무엇입니까? '잘못된 색인'오류는 대개 축 어적입니다 - 현재 생각하는 것보다 높은 숫자를 참조하려고합니다. – gravity

+0

게시물에서 언급했듯이, 내가 게시 한 코드의 맨 아래에 이미 그렇게했습니다. 값 9를 반환하므로 '유효해야'하는 숫자를 참조하고 있지만 어떤 이유로는 없습니다. 그렇기 때문에 'xWorksheet.HPageBreaks.Count'가 9를 반환하더라도 항목 1과 2가 제대로 반환되지만 3은 반환하지 않는 것이 이상하다고 생각하는 이유입니다. – Halsifer

+0

명확하게 말하면 9 개의 항목이 있고 명시적인'.Count' 9, 그 자체를 돌려 줬다. 그 문언을 명시 적으로 [편집]해야합니다. 나는 내일 이것을 좀더 자세하게 볼 것이다. – gravity

답변

0

당신이 xWorksheet를 인스턴스화 한 후,이 라인을 삽입하려고 ... 아이디어가 부족 해요 제대로 돌아왔다.

기본 '보기'가 첫 번째/단일 페이지이므로 예상 한 (9) 번으로 반환되었지만 찾을 수없는 이유가있었습니다. 따라서 2 페이지 나누기가 있었지만 첫 페이지 이외의 나머지 페이지 나누기는 보지 못했습니다.

여기의 키는 실제로는 xlPageBreakPreview입니다. 그러나 추가로 2 줄을 추가하면 이후의 변경 사항에 대해서도 객체가 완벽하게 표시되어야합니다.

+0

+1 upvoted (나도 보여주기에 너무 빠름) - 이것은 훌륭하게 작동합니다! 나는 아마도 이러한 매개 변수를 변경하지 못했을 것입니다. 도움과 시간을 가져 주셔서 정말 고마워요, 정말 고마워요! – Halsifer

+0

잠깐, 다른 문제가 발생합니다. 이 질문이 확실히 수정 되었기 때문에 새 질문을 열지 말아야할지 잘 모르겠습니다. 그러나 엑셀 시트에 데이터를 입력 할 때마다'xApp.ActiveWindow.View = XlWindowView.xlPageBreakPreview; '를 설정 한 후에'xWorkSheet.Cells [i + 1, n + 1] = dataTable.Rows 거의 쓸모없는 속도로 급격히 줄어 들었습니다. 어떤 아이디어? – Halsifer

+0

새로운 질문을 엽니 다. 비슷한 방식으로 여기에 링크하십시오. 더 나은 담당자를 얻을 수 있습니다. – gravity

관련 문제