/// <summary>
        /// 获取报表数据源的列集合
        /// </summary>
        /// <param name="Filters"></param>
        /// <param name="reportWidget"></param>
        /// <param name="ReportSource"></param>
        /// <param name="ChildCodes"></param>
        /// <returns></returns>
        protected List <ReportWidgetColumn> GetSourceColumns(ReportFilter[] Filters, ReportWidget reportWidget, ReportSource ReportSource, out Dictionary <string, ColumnSummary> ChildCodes)
        {
            ChildCodes = new Dictionary <string, ColumnSummary>();
            List <ReportWidgetColumn> SourceColumns = this.Engine.ReportQuery.GetSourceColumns(this.Engine, reportWidget, ReportSource);
            List <ReportWidgetColumn> results       = new List <ReportWidgetColumn>();

            foreach (ReportWidgetColumn c in SourceColumns)
            {
                if (reportWidget.ContainColumn(Filters, c.ColumnCode, ReportSource, this.Engine.BizObjectManager, this.Engine.Organization, this.Engine.EngineConfig.DBType, c.DisplayName))
                {
                    results.Add(c);
                }
            }
            //设置主表id为,I_ccc.objectid
            string MainObjectId      = this.GetMainObjectId(ReportSource.SchemaCode);
            string MainObjectId_Name = this.GetMainObjectId_Name(ReportSource.SchemaCode);

            //当有主表和子表字段时,加column 主表objectid,用于明细表关联
            this.DetailNeedMainObjectId(reportWidget, ReportSource, out ChildCodes);
            ReportWidgetColumn MainObjectIdColumn = new ReportWidgetColumn();

            MainObjectIdColumn.ColumnCode  = MainObjectId_Name;
            MainObjectIdColumn.ColumnName  = MainObjectId;
            MainObjectIdColumn.DisplayName = MainObjectId;


            if (!ReportSource.IsUseSql)
            {
                results.Add(MainObjectIdColumn);
            }



            return(results);
        }
        /// <summary>
        /// 构建行表头和数据
        /// </summary>
        /// <param name="sheet"></param>
        /// <param name="Node"></param>
        /// <param name="RowNumber"></param>
        /// <param name="ColumnNumber"></param>
        /// <param name="CurrentRow"></param>
        /// <param name="ArrayValueTable"></param>
        /// <param name="ColumnHeaderNumber"></param>
        /// <param name="allReportWidgetColumns"></param>
        /// <param name="UnitTableAndAssociationTable"></param>
        /// <param name="style"></param>
        /// <param name="Columns"></param>
        private void BuidRowHeaderAndValues(
            ISheet sheet,
            SimpleHeaderNode Node,
            int RowNumber,
            int ColumnNumber,
            IRow CurrentRow,
            List <string>[] ArrayValueTable,
            int ColumnHeaderNumber,
            Dictionary <string, ReportWidgetColumn> allReportWidgetColumns,
            Dictionary <string, string> UnitTableAndAssociationTable,
            ICellStyle style,
            ReportWidgetColumn[] Columns)
        {
            int    Counter   = 0;
            ICell  cell      = CurrentRow.CreateCell(ColumnNumber);
            string nodevalue = Node.Value;

            if (Node.ColumnCode != null && allReportWidgetColumns.ContainsKey(Node.ColumnCode) && (allReportWidgetColumns[Node.ColumnCode].ColumnType == ColumnType.Association || allReportWidgetColumns[Node.ColumnCode].ColumnType == ColumnType.Unit) && UnitTableAndAssociationTable.ContainsKey(Node.Value))
            {
                nodevalue = UnitTableAndAssociationTable[Node.Value];
            }
            if (Node.ColumnCode != null && allReportWidgetColumns.ContainsKey(Node.ColumnCode))
            {
                switch (allReportWidgetColumns[Node.ColumnCode].ColumnType)
                {
                case ColumnType.Numeric:
                    double tempresult = 0;
                    if (double.TryParse(nodevalue, out tempresult))
                    {
                        cell.SetCellValue(tempresult);
                    }
                    else
                    {
                        cell.SetCellValue(nodevalue);
                    }
                    break;

                default:
                    cell.SetCellValue(nodevalue);
                    break;
                }
            }
            else
            {
                cell.SetCellValue(nodevalue);
            }
            cell.CellStyle = style;
            if (Node.ColSpan > 1 || Node.RowSpan > 1)
            {
                sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(RowNumber, RowNumber + Node.RowSpan - 1, ColumnNumber, ColumnNumber + Node.ColSpan - 1));
            }
            ColumnNumber = ColumnNumber + Node.ColSpan;
            if (Node.ChildNode == null || Node.ChildNode.Count == 0)
            {
                //这里加数据表内的数据
                int tempcounter = 0;
                foreach (string value in ArrayValueTable[RowNumber - ColumnHeaderNumber])
                {
                    ReportWidgetColumn itemColumn = null;
                    if (Columns != null & Columns.Length > 0)
                    {
                        itemColumn = Columns[tempcounter % Columns.Length];
                    }
                    ICell mycell = CurrentRow.CreateCell(ColumnNumber);
                    //类型转换
                    if (itemColumn != null)
                    {
                        switch (itemColumn.ColumnType)
                        {
                        case ColumnType.Numeric:
                            double tempresult = 0;
                            if (double.TryParse(value, out tempresult))
                            {
                                mycell.SetCellValue(tempresult);
                            }
                            else
                            {
                                mycell.SetCellValue(value);
                            }
                            break;

                        default:
                            mycell.SetCellValue(value);
                            break;
                        }
                    }
                    else
                    {
                        mycell.SetCellValue(value);
                    }

                    mycell.CellStyle = style;
                    ColumnNumber++;
                    tempcounter++;
                }
                return;
            }
            else
            {
                foreach (SimpleHeaderNode ChildNode in Node.ChildNode)
                {
                    if (Counter == 0)
                    {
                        BuidRowHeaderAndValues(sheet, ChildNode, RowNumber, ColumnNumber, CurrentRow, ArrayValueTable, ColumnHeaderNumber, allReportWidgetColumns, UnitTableAndAssociationTable, style, Columns);
                    }
                    else
                    {
                        IRow myrow = sheet.CreateRow(RowNumber);
                        BuidRowHeaderAndValues(sheet, ChildNode, RowNumber, ColumnNumber, myrow, ArrayValueTable, ColumnHeaderNumber, allReportWidgetColumns, UnitTableAndAssociationTable, style, Columns);
                    }
                    RowNumber = RowNumber + ChildNode.RowSpan;
                    Counter++;
                }
            }
        }