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)); }
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)); } }