2014-11-04 2 views
1

EPPlus를 사용하여 피벗 테이블을 만들었습니다. 피벗 테이블은 원시 데이터의 별도 시트에 있습니다. 피벗 테이블 데이터를 새 시트, 세 번째 시트,하지만 피벗 정의가 아닌 값으로 복사하고 싶습니다. EPPlus가이를 지원합니까?EPPlus 피벗 테이블 - 값을 새 시트로 복사

답변

3

당신은 캐시 정의를 통해 데이터 소스의 범위를 복사 할 수 있습니다 :

public void PivotDataCopy() 
{ 
    const string FORMATCURRENCY = "#,###;[Red](#,###)"; 

    var file = new FileInfo(@"c:\temp\temp.xlsx"); 
    if (file.Exists) 
     file.Delete(); 

    var pck = new ExcelPackage(file); 
    var workbook = pck.Workbook; 
    var dataworksheet = workbook.Worksheets.Add("datasheet"); 

    //The data 
    dataworksheet.Cells["A20"].Value = "Col1"; 
    dataworksheet.Cells["A21"].Value = "sdf"; 
    dataworksheet.Cells["A22"].Value = "wer"; 
    dataworksheet.Cells["A23"].Value = "ghgh"; 
    dataworksheet.Cells["A24"].Value = "sdf"; 
    dataworksheet.Cells["A25"].Value = "wer"; 

    dataworksheet.Cells["B20"].Value = "Col2"; 
    dataworksheet.Cells["B21"].Value = "Group A"; 
    dataworksheet.Cells["B22"].Value = "Group B"; 
    dataworksheet.Cells["B23"].Value = "Group A"; 
    dataworksheet.Cells["B24"].Value = "Group C"; 
    dataworksheet.Cells["B25"].Value = "Group A"; 

    dataworksheet.Cells["C20"].Value = "Col3"; 
    dataworksheet.Cells["C21"].Value = 453.5; 
    dataworksheet.Cells["C22"].Value = 634.5; 
    dataworksheet.Cells["C23"].Value = 274.5; 
    dataworksheet.Cells["C24"].Value = 453.5; 
    dataworksheet.Cells["C25"].Value = 634.5; 

    dataworksheet.Cells["D20"].Value = "Col4"; 
    dataworksheet.Cells["D21"].Value = 686468; 
    dataworksheet.Cells["D22"].Value = 996440; 
    dataworksheet.Cells["D23"].Value = 185780; 
    dataworksheet.Cells["D24"].Value = 686468; 
    dataworksheet.Cells["D25"].Value = 996440; 

    //The pivot table 
    var pivotworksheet = workbook.Worksheets.Add("pivotsheet"); 
    var pivotTable = pivotworksheet.PivotTables.Add(pivotworksheet.Cells["A1"], dataworksheet.Cells["A20:D29"], "test"); 

    //The label row field 
    pivotTable.RowFields.Add(pivotTable.Fields["Col1"]); 
    pivotTable.DataOnRows = false; 

    //The data fields 
    var field = pivotTable.DataFields.Add(pivotTable.Fields["Col3"]); 
    field.Name = "Sum of Col2"; 
    field.Function = DataFieldFunctions.Sum; 
    field.Format = FORMATCURRENCY; 

    field = pivotTable.DataFields.Add(pivotTable.Fields["Col4"]); 
    field.Name = "Sum of Col3"; 
    field.Function = DataFieldFunctions.Sum; 
    field.Format = FORMATCURRENCY; 

    //Get the pivot table data source 
    var newworksheet = workbook.Worksheets.Add("newworksheet"); 
    var pivotdatasourcerange = pivotTable.CacheDefinition.SourceRange; 
    pivotdatasourcerange.Copy(newworksheet.Cells["A1"]); 

    pck.Save(); 

} 

편집 :

public void PivotDataCopy() 
{ 
    const string FORMATCURRENCY = "#,###;[Red](#,###)"; 

    var file = new FileInfo(@"c:\temp\temp.xlsm"); 
    if (file.Exists) 
     file.Delete(); 

    var pck = new ExcelPackage(file); 
    var workbook = pck.Workbook; 
    var dataworksheet = workbook.Worksheets.Add("datasheet"); 

    //The data 
    dataworksheet.Cells["A20"].Value = "Col1"; 
    dataworksheet.Cells["A21"].Value = "sdf"; 
    dataworksheet.Cells["A22"].Value = "wer"; 
    dataworksheet.Cells["A23"].Value = "ghgh"; 
    dataworksheet.Cells["A24"].Value = "sdf"; 
    dataworksheet.Cells["A25"].Value = "wer"; 

    dataworksheet.Cells["B20"].Value = "Col2"; 
    dataworksheet.Cells["B21"].Value = "Group A"; 
    dataworksheet.Cells["B22"].Value = "Group B"; 
    dataworksheet.Cells["B23"].Value = "Group A"; 
    dataworksheet.Cells["B24"].Value = "Group C"; 
    dataworksheet.Cells["B25"].Value = "Group A"; 

    dataworksheet.Cells["C20"].Value = "Col3"; 
    dataworksheet.Cells["C21"].Value = 453.5; 
    dataworksheet.Cells["C22"].Value = 634.5; 
    dataworksheet.Cells["C23"].Value = 274.5; 
    dataworksheet.Cells["C24"].Value = 453.5; 
    dataworksheet.Cells["C25"].Value = 634.5; 

    dataworksheet.Cells["D20"].Value = "Col4"; 
    dataworksheet.Cells["D21"].Value = 686468; 
    dataworksheet.Cells["D22"].Value = 996440; 
    dataworksheet.Cells["D23"].Value = 185780; 
    dataworksheet.Cells["D24"].Value = 686468; 
    dataworksheet.Cells["D25"].Value = 996440; 

    //The pivot table 
    var pivotworksheet = workbook.Worksheets.Add("pivotsheet"); 
    var pivotTable = pivotworksheet.PivotTables.Add(pivotworksheet.Cells["A1"], dataworksheet.Cells["A20:D29"], "test"); 

    //The label row field 
    pivotTable.RowFields.Add(pivotTable.Fields["Col1"]); 
    pivotTable.DataOnRows = false; 

    //The data fields 
    var field = pivotTable.DataFields.Add(pivotTable.Fields["Col3"]); 
    field.Name = "Sum of Col2"; 
    field.Function = DataFieldFunctions.Sum; 
    field.Format = FORMATCURRENCY; 

    field = pivotTable.DataFields.Add(pivotTable.Fields["Col4"]); 
    field.Name = "Sum of Col3"; 
    field.Function = DataFieldFunctions.Sum; 
    field.Format = FORMATCURRENCY; 

    //add the macro to copy the table data on open 
    workbook.Worksheets.Add("newworksheet"); 

    var sb = new StringBuilder(); 
    sb.AppendLine("Private Sub Workbook_SheetCalculate(ByVal Sh As Object)"); 
    sb.AppendLine(" Sheets(\"pivotsheet\").Cells.Copy"); 
    sb.AppendLine(" Sheets(\"newworksheet\").Range(\"A1\").PasteSpecial Paste:=xlPasteValues"); 
    sb.AppendLine(" Selection.Clear"); 
    sb.AppendLine(" Application.DisplayAlerts = False"); 
    sb.AppendLine(String.Format(" ActiveWorkbook.SaveAs \"{0}\", xlOpenXMLWorkbook", file.FullName.Replace("xlsm", "xlsx"))); 
    sb.AppendLine(" Application.DisplayAlerts = True"); 

    sb.AppendLine("End Sub"); 
    pck.Workbook.CreateVBAProject(); 
    pck.Workbook.CodeModule.Code = sb.ToString(); 

    pck.Save(); 
} 
+0

: 다음 비 매크로 XLSX로 시트를 다시 저장 이는 VBA 매크로를 활용하기 감사합니다 어니. 나는 곧 그것을 시도 할 것이다. 이것은 피벗 테이블 정의가 아닌 값만 복사합니까? 사용자가 새 시트의 값을 편집 할 수있게하려고합니다. –

+0

@RandyMinder 피벗 테이블이 복사되지 않고 원본 데이터에 계속 연결될 수 있도록 곧장 값 복사를 새 시트에 적용합니다. 귀하의 게시물을 기반으로 나는 그것이 당신이 원하는 것이라고 생각합니까? – Ernie

+0

이것은 내가 원하는 것을하지 않습니다. 코드가 피벗 된 데이터가 아닌 소스 데이터의 복사본을 만듭니다. 피벗 된 데이터 값을 새 시트에 복사하고 싶습니다. –