2016-07-22 2 views
4

J'ai beaucoup cherché, mais j'ai fini par poser cette question. Il n'y a pas de réponse satisfaisante à ma question: Je veux créer un pivot Excel (WorkSheet1 en tant que tableau croisé dynamique, WorkSheet2 en tant que source de données) Je n'ai aucun problème avec la création de DataSource à partir de DataTable. Mais il n'y a pas de document d'orientation pour ajouter des colonnes hiérarchiques et des lignes hiérarchiques et des mesures qui sont mappées vers DataSource (WorkSheet 2). Je suis assez sûr est fait avec la cartographie:Exemple NPOI Real World Pivot

var pt = pivotSheet.CreatePivotTable(new AreaReference(new CellReference("A2"), new CellReference(rowCount, columnCount -1)), new CellReference("A1"), dataSheet); 

Mais il n'y a aucune preuve comment mapper des colonnes et des lignes hiérarchiques et mesures hiérarchiques.

Je l'ai déjà perdu mon temps trop, donc je besoin d'aide très mal: Toute aide sera appréciée ...

Cordialement efaruk ...

+0

Je n'ai plus besoin de NPOI, EPPlus a résolu le problème en douceur;) Meilleure documentation et support communautaire ... – efaruk

Répondre

3

Voici ma solution avec EPPlus [** ***]

public static class ExcelPivotHelper 
{ 
    public static void CreateExcelPivot(Stream outputStream, DataTable data, PivotSettings settings) 
    { 
     using (var pckg = new ExcelPackage()) 
     { 
      var book = pckg.Workbook; 
      var pivotSheet = book.Worksheets.Add("Pivot"); 
      var dataSheet = book.Worksheets.Add("Data"); 
      var dataRange = GenerateDataSheet(data, dataSheet); 
      GeneratePivotSheet(pivotSheet, dataRange, settings); 
      pckg.SaveAs(outputStream); 
     } 
    } 

    private static void GeneratePivotSheet(ExcelWorksheet pivotSheet, ExcelRangeBase dataRange, PivotSettings settings) 
    { 
     //var rowCount = data.Rows.Count; 
     //var columnCount = data.Columns.Count; 
     var pt = pivotSheet.PivotTables.Add(pivotSheet.Cells["A1"], dataRange, "PivotTable"); 

     pt.MultipleFieldFilters = true; 
     pt.RowGrandTotals = true; 
     pt.ColumGrandTotals = true; 
     pt.Compact = true; 
     pt.CompactData = true; 
     pt.GridDropZones = false; 
     pt.Outline = false; 
     pt.OutlineData = false; 
     pt.ShowError = true; 
     pt.ErrorCaption = "[error]"; 
     pt.ShowHeaders = true; 
     pt.UseAutoFormatting = true; 
     pt.ApplyWidthHeightFormats = true; 
     pt.ShowDrill = true; 
     pt.DataOnRows = false; 

     pt.FirstHeaderRow = 1; // first row has headers 
     pt.FirstDataCol = 1; // first col of data 
     pt.FirstDataRow = 2; // first row of data 

     pt.TableStyle = TableStyles.Medium6; 

     //pt.ColumGrandTotals = true; 
     //pt.RowGrandTotals = true; 
     //pt.GrandTotalCaption = "Genel Toplam"; 

     // pt.RowHeaderCaption = ""; 
     foreach (var column in settings.Columns) 
     { 
      var field = pt.Fields[column.Field]; 
      var pivotField = pt.ColumnFields.Add(field); 
      if (column.PivotDataType == PivotDataType.Date) 
      { 
       //pivotField.AddDateGrouping(eDateGroupBy.Days); 
      } 
     } 

     foreach (var row in settings.Rows) 
     { 
      var field = pt.Fields[row.Field]; 
      var pivotField = pt.RowFields.Add(field); 
      if (row.PivotDataType == PivotDataType.Date) 
      { 
       //pivotField.AddDateGrouping(eDateGroupBy.Days); 
      } 
     } 

     foreach (var measurement in settings.Measurements) 
     { 
      var field = pt.Fields[measurement.Field]; 
      var pivotField = pt.DataFields.Add(field); 
      pivotField.Format = measurement.DisplayFormat; 
      pivotField.Function = DataFieldFunctions.Sum; 
      pivotField.Name = measurement.Caption; 
     } 

    } 

    private static readonly Type[] NumericTypes = { typeof(decimal), typeof(double), typeof(float), typeof(int), typeof(long), typeof(short), typeof(byte) }; 
    private static ExcelRangeBase GenerateDataSheet(DataTable data, ExcelWorksheet dataSheet) 
    { 
     dataSheet.Hidden = eWorkSheetHidden.VeryHidden; 
     var range = dataSheet.Cells["A1"].LoadFromDataTable(data, true, TableStyles.Medium6); 
     range.AutoFitColumns(); 
     for (var i = 0; i < data.Columns.Count; i++) 
     { 
      var ix = i + 1; 
      var cell = dataSheet.Cells[2, ix, data.Rows.Count + 1, ix]; 
      var column = data.Columns[i]; 
      if (NumericTypes.Contains(column.DataType)) 
      { 
       cell.Style.Numberformat.Format = "#,##0"; 
      } 
      else if (column.DataType == typeof(DateTime)) 
      { 
       cell.Style.Numberformat.Format = "dd.MM.yyyy"; 
      } 
     } 

     return range; 
    } 
} 


public class PivotSettings 
{ 
    private string _generalTotalText = "Genel Toplam"; 
    private string _yesText = "Evet"; 
    private string _noText = "Hayır"; 
    private string _fileExtension = ".xlsx"; 

    /// <summary> 
    ///  Default ctor 
    /// </summary> 
    public PivotSettings() 
    { 
     Columns = new List<PivotItemSetting>(10); 
     Rows = new List<PivotItemSetting>(10); 
     Measurements = new List<MeasureSetting>(10); 
    } 

    /// <summary> 
    /// Column Item Settings 
    /// </summary> 
    public List<PivotItemSetting> Columns { get; set; } 

    /// <summary> 
    /// Row Item Settings 
    /// </summary> 
    public List<PivotItemSetting> Rows { get; set; } 

    /// <summary> 
    /// Measure Settings 
    /// </summary> 
    public List<MeasureSetting> Measurements { get; set; } 

    /// <summary> 
    ///  Display text for 'Genel Toplam' word. Default is 'Genel Toplam' 
    /// </summary> 
    public string GeneralTotalText 
    { 
     get { return _generalTotalText; } 
     set { _generalTotalText = value; } 
    } 

    /// <summary> 
    ///  Display text for 'Evet' word. Default is 'Evet' 
    /// </summary> 
    public string YesText 
    { 
     get { return _yesText; } 
     set { _yesText = value; } 
    } 

    /// <summary> 
    ///  Display text for 'Hayır' word. Default is 'Hayır' 
    /// </summary> 
    public string NoText 
    { 
     get { return _noText; } 
     set { _noText = value; } 
    } 

    /// <summary> 
    ///  Excel File Extension 
    /// </summary> 
    public string FileExtension 
    { 
     get { return _fileExtension; } 
     set { _fileExtension = value; } 
    } 
} 


/// <summary> 
///  Setting for Pivot Column and Row 
/// </summary> 
public class PivotItemSetting 
{ 
    private string _displayFormat = "{0}"; 

    /// <summary> 
    ///  Field Name 
    /// </summary> 
    public string Field { get; set; } 

    /// <summary> 
    ///  Desired data type of the field 
    /// </summary> 
    public PivotDataType PivotDataType { get; set; } 

    /// <summary> 
    ///  Desired display format string for field 
    /// </summary> 
    public string DisplayFormat 
    { 
     get { return _displayFormat; } 
     set { _displayFormat = value; } 
    } 

    /// <summary> 
    ///  Automatically filled by generation process. Don't fill manually. 
    /// </summary> 
    public int CalculatedItemCount { get; set; } 
} 

/// <summary> 
///  Pivot Measure Setting 
/// </summary> 
public class MeasureSetting 
{ 
    private string _displayFormat = "#,##0"; 

    /// <summary> 
    ///  Field Name 
    /// </summary> 
    public string Field { get; set; } 

    /// <summary> 
    ///  Measure Caption 
    /// </summary> 
    public string Caption { get; set; } 

    /// <summary> 
    ///  Type of Measure 
    /// </summary> 
    public MeasureType MeasureType { get; set; } 

    /// <summary> 
    ///  Desired display format string for measure 
    /// </summary> 
    public string DisplayFormat 
    { 
     get { return _displayFormat; } 
     set { _displayFormat = value; } 
    } 
} 

/// <summary> 
///  Masure type 
/// </summary> 
public enum MeasureType 
{ 
    /// <summary> 
    ///  Sum of the values for measure field 
    /// </summary> 
    Sum 
} 

Mise à jour

Yep DataTable est DataTable normal vous ...quesStream est tout type de flux dépend de la façon dont vous voulez l'utiliser: Dans mon cas MemoryStream pour créer ASP.Net MVC Response comme téléchargement de fichiers ...

Voici les types personnalisés:

/// <summary> 
///  Settings for Pivot Table 
/// </summary> 
public class PivotSettings 
{ 
    private string _generalTotalText = "Genel Toplam"; 
    private string _yesText = "Evet"; 
    private string _noText = "Hayır"; 
    private string _fileExtension = ".xlsx"; 

    /// <summary> 
    ///  Default ctor 
    /// </summary> 
    public PivotSettings() 
    { 
     Columns = new List<PivotItemSetting>(10); 
     Rows = new List<PivotItemSetting>(10); 
     Measurements = new List<MeasureSetting>(10); 
    } 

    /// <summary> 
    /// Column Item Settings 
    /// </summary> 
    public List<PivotItemSetting> Columns { get; set; } 

    /// <summary> 
    /// Row Item Settings 
    /// </summary> 
    public List<PivotItemSetting> Rows { get; set; } 

    /// <summary> 
    /// Measure Settings 
    /// </summary> 
    public List<MeasureSetting> Measurements { get; set; } 

    /// <summary> 
    ///  Display text for 'Genel Toplam' word. Default is 'Genel Toplam' 
    /// </summary> 
    public string GeneralTotalText 
    { 
     get { return _generalTotalText; } 
     set { _generalTotalText = value; } 
    } 

    /// <summary> 
    ///  Display text for 'Evet' word. Default is 'Evet' 
    /// </summary> 
    public string YesText 
    { 
     get { return _yesText; } 
     set { _yesText = value; } 
    } 

    /// <summary> 
    ///  Display text for 'Hayır' word. Default is 'Hayır' 
    /// </summary> 
    public string NoText 
    { 
     get { return _noText; } 
     set { _noText = value; } 
    } 

    /// <summary> 
    ///  Excel File Extension 
    /// </summary> 
    public string FileExtension 
    { 
     get { return _fileExtension; } 
     set { _fileExtension = value; } 
    } 
} 

/// <summary> 
///  Setting for Pivot Column and Row 
/// </summary> 
public class PivotItemSetting 
{ 
    private string _displayFormat = "{0}"; 

    /// <summary> 
    ///  Field Name 
    /// </summary> 
    public string Field { get; set; } 

    /// <summary> 
    ///  Desired data type of the field 
    /// </summary> 
    public PivotDataType PivotDataType { get; set; } 

    /// <summary> 
    ///  Desired display format string for field 
    /// </summary> 
    public string DisplayFormat 
    { 
     get { return _displayFormat; } 
     set { _displayFormat = value; } 
    } 

    /// <summary> 
    ///  Automatically filled by generation process. Don't fill manually. 
    /// </summary> 
    public int CalculatedItemCount { get; set; } 
} 

/// <summary> 
///  Pivot Measure Setting 
/// </summary> 
public class MeasureSetting 
{ 
    private string _displayFormat = "#,##0"; 

    /// <summary> 
    ///  Field Name 
    /// </summary> 
    public string Field { get; set; } 

    /// <summary> 
    ///  Measure Caption 
    /// </summary> 
    public string Caption { get; set; } 

    /// <summary> 
    ///  Type of Measure 
    /// </summary> 
    public MeasureType MeasureType { get; set; } 

    /// <summary> 
    ///  Desired display format string for measure 
    /// </summary> 
    public string DisplayFormat 
    { 
     get { return _displayFormat; } 
     set { _displayFormat = value; } 
    } 
} 

/// <summary> 
///  Masure type 
/// </summary> 
public enum MeasureType 
{ 
    /// <summary> 
    ///  Sum of the values for measure field 
    /// </summary> 
    Sum 
} 

/// <summary> 
///  Pivot Item type 
/// </summary> 
public enum PivotDataType 
{ 
    /// <summary> 
    ///  Not Defined, Default 
    /// </summary> 
    None, 
    /// <summary> 
    ///  String 
    /// </summary> 
    String, 
    /// <summary> 
    /// Date Part of DateTime 
    /// </summary> 
    Date, 
    /// <summary> 
    /// DateTime 
    /// </summary> 
    DateTime, 
    /// <summary> 
    /// Numeric 
    /// </summary> 
    Numeric, 
    /// <summary> 
    /// Boolean 
    /// </summary> 
    Boolean 
} 

Cordialement ...

+1

Pourriez-vous aussi montrer comment vous appelez CreateExcelPivot()? par exemple, le flux est-il un System.IO.Stream? Le DataTable est-il un System.Data.DataTable? –

+0

En outre, PivotDataType n'est pas reconnu. –

+1

PivotDataType une énumération, vous pouvez utiliser votre propre et oui Stream est IO.Stream et DataTable est datable régulier ... – efaruk