【问题标题】:NPOI Real World Pivot ExampleNPOI 真实世界枢轴示例
【发布时间】:2016-11-26 19:50:53
【问题描述】:

我搜索了很多,但我最终在这里问了这个问题。我的问题没有令人满意的答案:我想创建一个 excel 数据透视表(WorkSheet1 作为数据透视表,WorkSheet2 作为数据源)我从 DataTable 创建数据源没有任何问题。但是没有用于添加映射回数据源(工作表 2)的分层列和分层行和度量的指导文档。我很确定映射已完成:

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

但没有证据表明如何映射分层列和分层行和度量。

我已经浪费了太多时间,所以我非常需要帮助:任何帮助将不胜感激......

问候 efaruk...

【问题讨论】:

  • 我不再需要 NPOI,EPPlus 顺利解决了问题 ;) 更好的文档和社区支持...

标签: c# excel pivot-table epplus npoi


【解决方案1】:

NPOI 目前不完全支持数据透视表。我使用this 为我的 excel 文件创建数据透视表,或者您可以考虑使用 EPPLus(不免费用于商业用途)。 现在我想用VB编写excel函数和宏来自动完成我的任务。您应该将其视为另一种选择

【讨论】:

    【解决方案2】:

    这是我使用 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
    }
    

    更新

    是的,DataTable 是正常的 DataTable,因为您有疑问... Stream 是任何类型的 Stream 取决于您要如何使用它:在我的情况下 MemoryStream 以创建 ASP.Net MVC 响应作为文件下载...

    这里是自定义类型:

    /// <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
    }
    

    问候...

    【讨论】:

    • 您能否再举一个例子来说明如何调用 CreateExcelPivot()?例如,Stream 是 System.IO.Stream 吗? DataTable 是 System.Data.DataTable 吗?
    • 另外,PivotDataType 无法识别。
    • PivotDataType 一个枚举,你可以使用你自己的,是的 Stream 是 IO.Stream 而 DataTable 是常规数据表...
    猜你喜欢
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多