2017-11-06 3 views
1

EPPlus를 사용하여 다양한 테스트의 결과를 기록한 엑셀 워크 시트를 내보내고 기본 요약을 작성했습니다. 나는이 코드 라인이 잘 작동한다.EPPlus가 다른 워크 시트에서 호출하는 수식의 범위를 올바르게 지정하지 않습니다

groupsheet.Cells[3, 5, 3, (25 + (tPts.Count() - 1) * 9) ].Formula = "AVERAGE(E6:E"+(5+ mCount).ToString()+")"; 
groupsheet.Cells[4, 5, 4, (25 + (tPts.Count() - 1) * 9) ].Formula = "STDEV(E6:E"+(5+ mCount).ToString()+")"; 
groupsheet.Cells[5, 5, 5, (25 + (tPts.Count() - 1) * 9) ].Formula = "MAX(E6:E"+(5+ mCount).ToString()+")"; 

EPPlus에서 기대할 수있는 코드 범위는 다음과 같다. 따라서 E3는 "평균 = E6 : E8"을 얻습니다. (mCount가 3이면) F3는 "평균 (F6 : F8)"등을 끝까지 얻습니다 (tPts의 길이로 정의 됨). 마찬가지로 4 번 행의 모든 ​​것은 원하는 범위의 표준 편차를 얻고 5 번 행의 모든 ​​것은 원하는 범위의 최대 값을 얻습니다.

또한 모든 개별 그룹 시트의 데이터를 기록하는 전체 요약 시트가 있습니다. 현재 다음 코드를 사용하여 정확한 값을 복사하여이 작업을 수행하고 있습니다.

summarysheet.Cells[3 + groupCount * 4, 5, 5 + groupCount * 4, (25 + (tPts.Count() - 1) * 9)].Value = groupsheet.Cells[3 , 5, 5 , (25 + (tPts.Count() - 1) * 9)].Value; 

이 요약 시트에 적절한 장소에 개별 groupsheet에서 값을 넣어 예상대로 작동합니다. 그러나 각 셀에 개별 그룹 워크 시트 (Group1, Group2, Group3 ...)의 해당 셀에 대한 참조가 포함되어 있으면 개별 시트 시트의 변경 사항과 함께 요약 시트가 동적으로 변경됩니다.

내 직감은 이렇게하는 적절한 방법은 다음 코드를 통해 것이라고 말합니다.

summarysheet.Cells[3 + groupCount * 4, 5, 5 + groupCount * 4, (25 + (tPts.Count() - 1) * 9)].Formula = "Group"+ groupNumKey.ToString() +"!E3"; 

그러나 이것은 셀 E3의 수식을 모든 단일 셀에 붙여 넣기 만합니다. 수식이 하나의 워크 시트 내에 모두 포함되어있을 때와 같은 방식으로 범위를 호출하는 방법을 알아낼 수 없습니다.

감사합니다.

이것은 "Base26Encode는"A 26 주어진 경우 1, Z를 부여 할 때, AA 주어진 27 출력 코드의 조각이 무작위 방식

// Iterate over each column to put the references in place 
int currColNum = 5; //Start at 5 (E) 
string currColName = "E"; 
int maxColNum = (25 + (tPts.Count() - 1) * 9); // End at the last column 
while (currColNum <= maxColNum) 
{ 
    currColName = Base26Encode(currColNum); // Finds the excel column name from the row # 
    summarysheet.Cells[3 + groupCount * 4, currColNum].Formula = "Group" + groupNumKey.ToString() + "!" + currColName + "3"; // Grab Average 
    summarysheet.Cells[4 + groupCount * 4, currColNum].Formula = "Group" + groupNumKey.ToString() + "!" + currColName + "4"; // Grab STD 
    summarysheet.Cells[5 + groupCount * 4, currColNum].Formula = "Group" + groupNumKey.ToString() + "!" + currColName + "5"; // Grab Max 

    currColNum++; 
} 

하려고 시도한이기 때문에 (컬럼 인덱스를 엑셀 열 이름으로 변환)

답변

1

다른 시트의 셀을 참조하려는 경우 수식이 오른쪽 인 것처럼 보이지만 !E3을 하드 코딩 했으므로 수식이 GroupX ! E3 ". 당신이해야 할 일은 다음과 같이 변경하는 것입니다 :

이것에
summarysheet.Cells[3 + groupCount * 4, 5, 5 + groupCount * 4, (25 + (tPts.Count() - 1) * 9)].Formula 
    = "Group" + groupNumKey.ToString() +"!E3"; 

:

//Use a variable to save space and avoid repeating the same calculation over and over 
var row = (25 + (tPts.Count() - 1) * 9); 
summarysheet.Cells[3 + groupCount * 4, 5, 5 + groupCount * 4, row].Formula 
    = "Group" + groupNumKey.ToString() +"!E" + row; 

내가 오해하고 있다면 알려주세요. 댓글


응답 : @Iassac는 아직도 약간 문제가 당신이 뭘 하려는지 이해하는 데. 아마 더 많은 코드를 게시 할 수 있습니다.도움이된다면, 여기에 내가 나 수식을 가진 다른 시트에서 셀을 심판 할 수 않는 해낸와 단위 테스트입니다 : 응답

[TestMethod] 
public void SheetReferenceTest() 
{ 
    //https://stackoverflow.com/questions/47144930 
    var file = new FileInfo(@"c:\temp\SheetReferenceTest.xlsx"); 
    if (file.Exists) 
     file.Delete(); 

    using (var pck = new ExcelPackage(file)) 
    { 
     var group = 1; 
     var workbook = pck.Workbook;  
     var group1 = workbook.Worksheets.Add($"group{group}"); 
     var summarysheet = workbook.Worksheets.Add("summarysheet"); 

     group1.Cells["A1"].Value = 2; 
     group1.Cells["A2"].Value = 3; 
     group1.Cells["A3"].Value = 6; 
     group1.Cells["A4"].Value = 27; 
     group1.Cells["A5"].Formula = "Average(A1:A4)"; 

     //This shows "=group1!A5" in Excel when the cell is selected 
     summarysheet.Cells["A1"].Formula = $"group{group}!A5"; 

     pck.Save(); 
    } 
} 

편집은

좋아, 이제 네가 한 일을 얻는다. 당신이 맞아요, 나는 공유 문자열 수식을 처리하는 엑셀 얻을 수 없다. 이것이 탁월한 능력을 발휘할 수 있는지 알지 못하기 때문에 이것이 Epplus 문제인지 확신 할 수 없습니까?

<row r="11"> 
    <c r="A11" s="0"> 
     <f ref="A11:O11" t="shared" si="1">AVERAGE(A1:A10)</f> 
    </c><c r="B11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="C11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="D11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="E11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="F11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="G11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="H11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="I11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="J11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="K11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="L11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="M11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="N11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="O11" s="0"> 
     <f t="shared" si="1"/> 
    </c> 
</row> 

그러나 비 작업 요약 시트에 대해 : 여기

[TestMethod] 
public void SheetReferenceTest() 
{ 
    //https://stackoverflow.com/questions/47144930 
    var file = new FileInfo(@"c:\temp\SheetReferenceTest.xlsx"); 
    if (file.Exists) 
     file.Delete(); 

    using (var pck = new ExcelPackage(file)) 
    { 
     var group = 1; 
     var workbook = pck.Workbook;  
     var group1 = workbook.Worksheets.Add($"group{group}"); 
     var summarysheet = workbook.Worksheets.Add("summarysheet"); 
     var random = new Random(); 

     const int rows = 10; 
     const int cols = 15; 
     for (var r = 0; r < rows; r++) 
      for (var c = 0; c < cols; c++) 
       group1.Cells[r + 1, c + 1].Value = random.Next(100); 

     //This works fine and auto increments the formala to B1:B10, C1:C10, etc. 
     group1.Cells[rows + 1, 1, rows + 1, cols].Formula = $"AVERAGE(A1:A{rows})"; 

     //This does not, it just does group1!A1:A10 for all cells. 
     summarysheet.Cells[rows + 1, 1, rows + 1, cols].Formula = $"AVERAGE(group1!A1:A{rows})"; 

     pck.Save(); 
    } 
} 

는 XML이 작업 시트의 모습입니다 : 여기 쇼와 함께 문제를 함께 제공되는 유닛 테스트는

<row r="11"> 
    <c r="A11" s="0"> 
     <f ref="A11:O11" t="shared" si="1">AVERAGE(group1!A1:A10)</f> 
    </c><c r="B11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="C11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="D11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="E11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="F11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="G11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="H11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="I11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="J11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="K11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="L11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="M11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="N11" s="0"> 
     <f t="shared" si="1"/> 
    </c><c r="O11" s="0"> 
     <f t="shared" si="1"/> 
    </c> 
</row> 
+0

안녕하세요 @ 에르니, 제 문제를 잘 설명하지 못했습니다. 요약 시트 셀 E3에 그룹 시트의 E3에 대한 참조가 포함되도록하고 요약 시트 셀 F3에 그룹 시트의 F3에 대한 참조가 포함되도록하고 데이터의 마지막 열이 무엇이든 상관 없습니다. 처음 세 줄을 사용할 때 열심히 코딩되었지만 E5 = 평균 (E6 : E8), F5 = 평균 (F6 : F8), 배설물이 동적으로 변경되었습니다. 그러나 그것은 다른 시트를 참조하려고 할 때 작동하지 않으며 변경할 수있는 것인지 알 수 없습니다. –

+0

@IsaacLittle 위의 RTC 참조하십시오. – Ernie

+0

안녕하세요, @Ernie, 그래서 나는 그것을 강요하는 간단한 해결 방법을 발견했습니다. 어쩌면 내가 분명히 밝히면 도움이 될 것입니다. 이제 그 내용을 본문에 추가 할 것입니다. –