Exemple #1
0
        public Файл СформироватьОтчет(ШаблонОтчета Шаблон, Хранилище Хранилище, string user, string domain)
        {
            if (Шаблон.Колонки == null)
            {
                Шаблон.Колонки = new ШаблонОтчета.Колонка[0];
            }
            else
            {
                Шаблон.Колонки = Шаблон.Колонки.Where(p => !string.IsNullOrEmpty(p.Атрибут)).ToArray();
            }

            switch (Шаблон.ФорматОтчета)
            {
            //case ФорматОтчета.ПоУмолчанию:
            case ФорматОтчета.Xaml:
            case ФорматОтчета.Xps:
                throw new Exception(string.Format("Формат '{0}' не поддерживается конструктором отчетов", Шаблон.ФорматОтчета.ToString()));
            }
            var sb = new StringBuilder(10000);

            #region Подготовить DataSet
            var querys = Шаблон.Запросы.Select(p => Query.Deserialize(p)).ToArray();
            foreach (var item in querys.Where(p => p != null))
            {
                item.ИгнорироватьСтраницы = true;
            }
            var ds = BuildDataSet(Шаблон.НазваниеОтчета, querys, Хранилище, user, domain);
            #endregion

            #region generate columns
            var table = new System.Data.DataTable("Columns");
            table.Columns.Add("Атрибут", typeof(string));
            table.Columns.Add("Название", typeof(string));
            table.Columns.Add("Размер", typeof(int));
            foreach (var item in Шаблон.Колонки)
            {
                table.Rows.Add(new object[] { item.Атрибут, item.Название, !double.IsNaN(item.азмер) ? item.азмер : 140 });
            }
            ds.Merge(table);
            #endregion

            #region Columns Display
            sb = new StringBuilder();

            var source = "//Значение1";
            if (Шаблон.Группировки != null)
            {
                foreach (var item in Шаблон.Группировки)
                {
                    var _Группировки = item.Trim().Replace("/", "_x002F_").Replace("@", "_x0040_");
                    sb.AppendFormat(@"<xsl:for-each-group select=""{0}"" group-by=""{1}"">", source, _Группировки);
                    sb.AppendLine();
                    sb.AppendLine(@"<xsl:sort select=""current-grouping-key()""/>");
                    sb.AppendLine(@"<Row>");
                    sb.AppendFormat("\t<Cell ss:MergeAcross=\"{0}\" ss:StyleID=\"s177\">", Шаблон.Колонки.Length - 1);
                    sb.AppendLine();
                    sb.AppendLine("\t\t<Data ss:Type=\"String\"><xsl:value-of select=\"current-grouping-key()\"/></Data>");
                    sb.AppendLine("\t</Cell>");
                    sb.AppendLine(@"</Row>");
                    source = "current-group()";
                }
            }

            #region <Header>
            sb.Append(@"
<Row ss:Height=""13.5"">
<xsl:for-each select=""//Columns"">
    <Cell ss:StyleID=""s97"">
    <Data ss:Type=""String"">
        <xsl:value-of select=""Название"" />
    </Data>
    </Cell>
</xsl:for-each>
</Row>
");
            #endregion

            #region <Row>
            var isDataSet = ds != null && ds.Tables.Contains("Значение1");
            sb.AppendFormat(@"<xsl:for-each select=""{0}"">", source);
            sb.AppendLine(@"<Row>");
            foreach (var item in Шаблон.Колонки)
            {
                var style = "s93";
                var type  = null as Configuration.Type;
                if (!string.IsNullOrEmpty(item.Формат))
                {
                    switch (item.Формат)
                    {
                    case "Int":
                        type = new Configuration.Type()
                        {
                            MemberType = MemberTypes.Int
                        };
                        break;

                    case "Double":
                        type = new Configuration.Type()
                        {
                            MemberType = MemberTypes.Double
                        };
                        break;

                    case "String":
                        type = new Configuration.Type()
                        {
                            MemberType = MemberTypes.String
                        };
                        break;
                    }
                }

                if (type == null && isDataSet && ds.Tables["Значение1"].Columns.Contains(item.Атрибут))
                {
                    //определить тип из DataSet
                    var typeofColumn = ds.Tables["Значение1"].Columns[item.Атрибут].DataType;
                    if (typeofColumn == typeof(double) || typeofColumn == typeof(decimal))
                    {
                        type = new Configuration.Type()
                        {
                            MemberType = MemberTypes.Double
                        }
                    }
                    ;

                    else if (typeofColumn == typeof(int) || typeofColumn == typeof(long))
                    {
                        type = new Configuration.Type()
                        {
                            MemberType = MemberTypes.Int
                        }
                    }
                    ;

                    else if (typeofColumn == typeof(DateTime))
                    {
                        type = new Configuration.Type()
                        {
                            MemberType = MemberTypes.DateTime
                        }
                    }
                    ;

                    else if (typeofColumn == typeof(bool))
                    {
                        type = new Configuration.Type()
                        {
                            MemberType = MemberTypes.Bool
                        }
                    }
                    ;

                    else
                    {
                        type = new Configuration.Type()
                        {
                            MemberType = MemberTypes.String
                        }
                    };
                }
                else
                {
                    type = new ConfigurationClient().ПолучитьТип(item.Атрибут, domain);
                }

                #region set style
                if (type != null)
                {
                    switch (type.MemberType)
                    {
                    case MemberTypes.Double:
                        style = "s93Numeric";
                        break;

                    case MemberTypes.Ссылка:
                    case MemberTypes.Int:
                        style = "s93Int";
                        break;
                    }
                }
                #endregion

                sb.AppendFormat("<Cell ss:StyleID=\"{0}\">", style);
                sb.AppendLine();
                if (!string.IsNullOrEmpty(item.Атрибут))
                {
                    var attr = item.Атрибут.Replace("/", "_x002F_").Replace("@", "_x0040_");
                    if (type != null)
                    {
                        switch (type.MemberType)
                        {
                        case MemberTypes.Double:
                        case MemberTypes.Ссылка:
                        case MemberTypes.Int:
                            sb.Append(@"<Data ss:Type=""Number"">");
                            sb.AppendFormat(@"<xsl:value-of select=""{0}"" />", attr);
                            //sb.AppendFormat(@"<xsl:value-of select=""format-number({0},'# ##0,00')"" />", item.Атрибут);
                            break;

                        case MemberTypes.DateTime:
                            sb.Append(@"<Data ss:Type=""String"">");
                            switch ((item.Формат ?? "").ToUpper())
                            {
                            case "G":
                                sb.AppendFormat(@"<xsl:value-of select=""format-dateTime({0},'[D,2].[M,2].[Y,*-4] [H01]:[m01]')"" />", attr);
                                break;

                            case "HH:MM":
                                sb.AppendFormat(@"<xsl:value-of select=""format-dateTime({0},'[H01]:[m01]')"" />", attr);
                                break;

                            default:
                                sb.AppendFormat(@"<xsl:value-of select=""format-dateTime({0},'[D,2].[M,2].[Y,*-4]')"" />", attr);
                                break;
                            }
                            break;

                        //case MemberTypes.Bool:
                        //    sb.Append(@"<Data ss:Type=""String"">");
                        //    sb.AppendFormat(@"<xsl:if test=""{0} = 'true'"">ДА</<xsl:if>", attr);
                        //    break;

                        default:
                            sb.Append(@"<Data ss:Type=""String"">");
                            sb.AppendFormat(@"<xsl:value-of select=""{0}"" />", attr);
                            break;
                        }
                    }
                    else
                    {
                        sb.AppendFormat(@"<Data ss:Type=""{0}"">", item.ТипЗначения.ToString());
                        sb.AppendFormat(@"<xsl:value-of select=""{0}"" />", attr);
                    }
                    sb.AppendLine(@"</Data>");
                }
                sb.AppendLine(@"</Cell>");
            }
            sb.AppendLine(@"</Row>");
            sb.AppendLine(@"</xsl:for-each>");
            sb.AppendLine(@"<Row />");
            sb.AppendLine(@"<Row />");
            #endregion

            if (Шаблон.Группировки != null)
            {
                foreach (var item in Шаблон.Группировки)
                {
                    sb.AppendLine(@"</xsl:for-each-group>");
                }
            }
            #endregion

            #region ИсходныйКод
            var ИсходныйКод = Regex.Replace(RosService.Properties.Resources.ReportExcel, "<r:Data />", sb.ToString());
            #endregion

            return(ВыводОтчета(
                       Шаблон.НазваниеОтчета,
                       ИсходныйКод.ToString(),
                       "Excel",
                       Шаблон.ФорматОтчета,
                       Шаблон.ОриентацияСтраницы,
                       ds,
                       Хранилище,
                       user,
                       domain));
        }
Exemple #2
0
        public Файл СформироватьОтчет(string НазваниеОтчета, Query.Параметр[] Параметры, ФорматОтчета ФорматОтчета, Хранилище Хранилище, string user, string domain)
        {
            var id_report   = FindReport(НазваниеОтчета, domain);
            var ИсходныйКод = data.ПолучитьЗначение <string>(id_report, "ИсходныйКод", Хранилище.Конфигурация, domain);
            var Запросы     = BuildQuery(Параметры, id_report, domain);

            if (string.IsNullOrEmpty(ИсходныйКод))
            {
                if (Запросы != null && Запросы.Count() > 0)
                {
                    var Шаблон = new ШаблонОтчета()
                    {
                        ВерхнийКолонтитул  = true,
                        НижнийКолонтитул   = true,
                        ОриентацияСтраницы = ШаблонОтчета.Ориентация.Альбом,
                        НазваниеОтчета     = НазваниеОтчета,
                        Запросы            = Запросы.Select(p => Serializer(p)).ToArray()
                    };
                    var колонки   = new List <ШаблонОтчета.Колонка>();
                    var firsQuery = Запросы.ElementAt(0);
                    firsQuery.Parse(domain);
                    foreach (var item in firsQuery.ВыводимыеКолонки)
                    {
                        var type = new ConfigurationClient().ПолучитьТип(item.Атрибут, domain);
                        if (type == null)
                        {
                            continue;
                        }

                        var __Колонка = new ШаблонОтчета.Колонка()
                        {
                            Атрибут = item.Атрибут, Название = type.Описание
                        };
                        switch (type.MemberType)
                        {
                        case MemberTypes.String:
                            __Колонка.азмер = 160;
                            break;

                        case MemberTypes.Double:
                        case MemberTypes.Int:
                            __Колонка.азмер = 100;
                            break;

                        case MemberTypes.DateTime:
                            __Колонка.азмер = 80;
                            break;

                        case MemberTypes.Bool:
                            __Колонка.азмер = 40;
                            break;

                        case MemberTypes.Ссылка:
                            __Колонка.азмер   = 200;
                            __Колонка.Атрибут = item.Атрибут + ".НазваниеОбъекта";
                            break;
                        }
                        колонки.Add(__Колонка);
                    }
                    Шаблон.Колонки = колонки.ToArray();
                    return(СформироватьОтчет(Шаблон, Хранилище, user, domain));
                }
                else
                {
                    return(new Файл());
                }
            }
            else
            {
                #region Подготовить DataSet
                var ds = BuildDataSet(НазваниеОтчета, Запросы, Хранилище, user, domain);
                #endregion

                return(ВыводОтчета(
                           НазваниеОтчета,
                           ИсходныйКод,
                           data.ПолучитьЗначение <string>(id_report, "ФорматОтчета", Хранилище.Конфигурация, domain),
                           ФорматОтчета,
                           (ШаблонОтчета.Ориентация)Enum.Parse(typeof(ШаблонОтчета.Ориентация), data.ПолучитьЗначение <string>(id_report, "Ориентация", Хранилище.Конфигурация, domain)),
                           ds, Хранилище, user, domain));
            }
        }