private void writeMainData(XslFOProfileWriter fo, ThisReportData data, int Type) { #region #1: Основные данные _TableSeparator(fo); fo.TStart(true, ITRepStyles.TABLE, false); fo.TAddColumn("Займ №", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "15%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Тип займа", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "15%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Целевая компания/Сотрудник", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "30%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Дата", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "15%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Сумма", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "15%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); foreach (IDictionary IO in data.IncOut) { fo.TRStart(); _WriteCell(fo, xmlEncode(IO["Number"])); _WriteCell(fo, xmlEncode(IO["LoanType"])); _WriteCell(fo, xmlEncode(IO["LoanTarget"])); _WriteCell(fo, _FormatShortDate(IO["Date"].ToString())); _WriteCell(fo, xmlEncode(IO["Sum"])); fo.TREnd(); } fo.TEnd(); #endregion }
private void writeDataPair(XslFOProfileWriter fo, string sName, string sValue, string sValueStyleClass) { fo.TRStart(); _WriteCell(fo, sName, "string", ITRepStyles.TABLE_CELL_BOLD); _WriteCell(fo, sValue, "string", sValueStyleClass, true); fo.TREnd(); }
public void Write(XslFOProfileWriter foWriter, IEnumerable <BaseData> values) { foWriter.TStart(true, "TABLE", false); foWriter.TAddColumn("№", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "5%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); foWriter.TAddColumn("Департамент", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "75%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); foWriter.TAddColumn("Трудозатраты", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "20%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); Dictionary <Type, string> rowClasses = new Dictionary <Type, string>(); rowClasses.Add(typeof(DepartmentData), "GROUP_HEADER"); rowClasses.Add(typeof(DepartmentDetailData), "TABLE_CELL"); rowClasses.Add(typeof(OverallData), "TABLE_FOOTER"); foreach (BaseData value in values) { foWriter.TRStart(); if (value is OverallData) { foWriter.TRAddCell("Итого", null, 1, 1, rowClasses[value.GetType()]); } else { foWriter.TRAddCell(indexGenerator.Generate(), null, 1, 1, rowClasses[value.GetType()]); } foWriter.TRAddCell(CustomReport.xmlEncode(value.Name), null, 1, 1, rowClasses[value.GetType()]); foWriter.TRAddCell(costsFormatter.Format(value.Costs), null, 1, 1, rowClasses[value.GetType()]); foWriter.TREnd(); } foWriter.TEnd(); }
// Выводит сальдо по проекту в разрезе временной шкалы private void writeIntervalSaldoDataRow(XslFOProfileWriter fo, int nColSpan, string sLabel) { if (null == FinanceData) { throw new Exception("Не инициализированы финансовые показатели по проекту"); } fo.TRStart(ITRepStyles.TABLE_CELL_COLOR_YELLOW); fo.TRAddCell(sLabel, "string", nColSpan, 1); if (bIsBudgetBindedReport) { //Планируемая валовая прибыль (Сальдо по бюджету) _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData.ContractSum - FinanceData.BudgetOutSum))); } writeEmptyValueCell(fo, 1); foreach (IDictionary interval in FinanceData?.DateIntervals) { _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData?.IntervalSaldo[interval["ObjectID"]]))); } _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData.IncomeSum - FinanceData.OutcomeSum))); writeEmptyValueCell(fo, nColSpan); fo.TREnd(); }
//Выводит заданное кол-во "пустых" ячеек показателей private void writeEmptyValueCell(XslFOProfileWriter fo, int j) { for (int i = 1; i <= j; i++) { _WriteCell(fo, "", "string", ITRepStyles.TABLE_CELL_ND, false); } }
//Выводит заданное кол-во "пустых" ячеек показателей private void writeEmptyValueCell(XslFOProfileWriter fo, int j) { for (int i = 1; i <= j; i++) { _WriteCell(fo, "-"); } }
// Выводит итоговые финансовые данные по проектам private void writeSumProjectDataRow(XslFOProfileWriter fo, ThisReportData data, string sLabel, string sCol) { fo.TRStart(); _WriteCell(fo, sLabel); foreach (IDictionary fd in data.GroupPreFinData) { _WriteCell(fo, xmlEncode(fd[sCol])); } foreach (IDictionary fd in data.GroupFinData) { _WriteCell(fo, xmlEncode(fd[sCol])); } foreach (IDictionary fd in data.GroupSumFinData) { _WriteCell(fo, xmlEncode(fd[sCol])); } foreach (IDictionary fd in data.GroupAfterFinData) { _WriteCell(fo, xmlEncode(fd[sCol])); } foreach (IDictionary fd in data.GroupAllFinData) { _WriteCell(fo, xmlEncode(fd[sCol])); } fo.TREnd(); }
/// <summary> /// Формирует текст XSL-FO, представляющий данные заданных параметров, и /// записывает его как текст подзаголовка формируемого отчета /// </summary> /// <param name="foWriter"></param> /// <param name="cn"></param> public void WriteParamsInHeader(XslFOProfileWriter foWriter, IReportDataProvider Provider) { // XSL-FO с перечнем параметров будем собирать сюда: StringBuilder sbBlock = new StringBuilder(); string sParamValue; if (IsSpecifiedIntervalBegin) { sParamValue = ((DateTime)IntervalBegin).ToString("dd.MM.yyyy"); } else { sParamValue = "не задана"; } sbBlock.Append(getParamValueAsFoBlock("Дата начала отчетного периода", sParamValue)); if (IsSpecifiedIntervalEnd) { sParamValue = ((DateTime)IntervalEnd).ToString("dd.MM.yyyy"); } else { sParamValue = "не задана"; } sbBlock.Append(getParamValueAsFoBlock("Дата окончания отчетного периода", sParamValue)); // ВЫВОД ПОДЗАГОЛОВКА: foWriter.AddSubHeader( @"<fo:block text-align=""left""><fo:block font-weight=""bold"">Параметры отчета:</fo:block>" + sbBlock.ToString() + @"</fo:block>" ); }
// Выводит суммарные расходы по проекту в разрезе временной шкалы private void writeTotalOutcomeDataRow(XslFOProfileWriter fo, int nColSpan, string sLabel) { if (null == FinanceData) { throw new Exception("Не инициализированы финансовые показатели по проекту"); } fo.TRStart(ITRepStyles.TABLE_CELL_COLOR_ORANGE); fo.TRAddCell(sLabel, "string", nColSpan, 1); if (bIsBudgetBindedReport) { _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData.BudgetOutSum.ToString()))); } writeEmptyValueCell(fo, 1); foreach (IDictionary totalOutcome in FinanceData?.IntervalOutcomes) { _WriteCell(fo, xmlEncode(_FormatMoney(totalOutcome["PaymentSum"]))); } _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData.OutcomeSum))); if (bIsBudgetBindedReport) { _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData.BudgetOutSum - FinanceData.OutcomeSum))); } writeEmptyValueCell(fo, 1); fo.TREnd(); }
// Выводит суммарный приход по проекту в разрезе временной шкалы private void writeTotalIncomeDataRow(XslFOProfileWriter fo, int nColSpan, string sLabel) { if (null == FinanceData) { throw new Exception("Не инициализированы финансовые показатели по проекту"); } fo.TRStart(ITRepStyles.TABLE_CELL_COLOR_GREEN); fo.TRAddCell(sLabel, "string", nColSpan, 1); if (bIsBudgetBindedReport) { //Общий планируемый приход равен сумме контракта _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData.ContractSum))); } writeEmptyValueCell(fo, 1); foreach (IDictionary income in FinanceData?.Incomes) { _WriteCell(fo, xmlEncode(_FormatMoney(income["IncomeSum"]))); } _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData.IncomeSum))); if (bIsBudgetBindedReport) { _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData.ContractSum - FinanceData.IncomeSum))); } writeEmptyValueCell(fo, 1); fo.TREnd(); }
/// <summary> /// Отображение в отчете основных свойств лота и тендера /// </summary> /// <param name="fo"></param> /// <param name="data">Данные тендера, данные которого отображаются</param> private void writeMainData(XslFOProfileWriter fo, ThisReportData data) { #region #1: Основные данные // ...разделитель _TableSeparator(fo); fo.TStart(true, ITRepStyles.TABLE, false); fo.TAddColumn("Тип транзакции", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "25%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Назначение", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "25%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Дата", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Сумма", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Примечание", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "30%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); foreach (IDictionary EmpKassTrans in data.Main) { fo.TRStart(); _WriteCell(fo, xmlEncode(EmpKassTrans["TransType"])); _WriteCell(fo, xmlEncode(EmpKassTrans["Reason"])); _WriteCell(fo, xmlEncode(((DateTime)EmpKassTrans["Date"]).ToShortDateString())); _WriteCell(fo, xmlEncode(EmpKassTrans["TransSum"])); _WriteCell(fo, xmlEncode(EmpKassTrans["Rem"])); fo.TREnd(); } fo.TEnd(); #endregion }
public void Write(XslFOProfileWriter writer) { writer.WriteLayoutMaster(); writer.StartPageSequence(); writer.EmptyBody(message == null ? "Нет данных" : message); writer.EndPageSequence(); }
protected void writeEmptyBody(XslFOProfileWriter foWriter, string message) { foWriter.StartPageSequence(); foWriter.StartPageBody(); foWriter.EmptyBody(message); foWriter.EndPageBody(); foWriter.EndPageSequence(); }
private void WriteParam <T>(XslFOProfileWriter writer, string name, T value) { writer.AddSubHeader(String.Format( @"<fo:block text-align=""left""><fo:inline>{0}: </fo:inline><fo:inline font-weight=""bold"">{1}</fo:inline></fo:block>", xmlEncode(name), xmlEncode(value == null ? string.Empty : value.ToString())) ); }
private void writeExtendedReport(XslFOProfileWriter fo, ThisReportData data) { _TableSeparator(fo); fo.TStart(true, ITRepStyles.TABLE, false); fo.TAddColumn("Статья расходов/Контрагент", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "40%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Назначение", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "30%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("С учетом комплектации", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Сумма с НДС", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Сумма без НДС", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "10%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); foreach (IDictionary IO in data.Incomes) { if ((int)IO["IncType"] < 0) { fo.TRStart(); _WriteCell(fo, xmlEncode(IO["Type"])); _WriteCell(fo, xmlEncode(IO["Reason"])); _WriteCell(fo, xmlEncode("")); _WriteCell(fo, xmlEncode(IO["Sum"])); _WriteCell(fo, xmlEncode(IO["SumNoNDS"])); fo.TREnd(); } else { fo.TRStart(); fo.TRAddCell(xmlEncode(IO["Type"]), "string", 3, 1, ITRepStyles.GROUP_HEADER); fo.TRAddCell(xmlEncode(IO["Sum"]), "string", 1, 1, ITRepStyles.GROUP_HEADER); fo.TRAddCell(xmlEncode(IO["SumNoNDS"]), "string", 1, 1, ITRepStyles.GROUP_HEADER); fo.TREnd(); } } foreach (IDictionary IO in data.Outcomes) { if ((int)IO["OutType"] < 10) { fo.TRStart(); //_WriteCell(fo, _FormatShortDate(IO["Date"].ToString())); _WriteCell(fo, xmlEncode(IO["SupplierName"])); _WriteCell(fo, xmlEncode(IO["Rem"])); _WriteCell(fo, xmlEncode(IO["OutSumExt"])); _WriteCell(fo, xmlEncode(IO["OutSum"])); _WriteCell(fo, xmlEncode(IO["OutSumNoNDS"])); fo.TREnd(); } else { fo.TRStart(); fo.TRAddCell(xmlEncode(IO["SupplierName"]), "string", 2, 1, ITRepStyles.GROUP_HEADER); fo.TRAddCell(xmlEncode(IO["OutSumExt"]), "string", 1, 1, ITRepStyles.GROUP_HEADER); fo.TRAddCell(xmlEncode(IO["OutSum"]), "string", 1, 1, ITRepStyles.GROUP_HEADER); fo.TRAddCell(xmlEncode(IO["OutSumNoNDS"]), "string", 1, 1, ITRepStyles.GROUP_HEADER); fo.TREnd(); } } fo.TEnd(); }
/// <summary> /// Формирование шапки таблицы отчета /// </summary> /// <param name="fo"></param> /// <returns>Кол-во сформированных колонок</returns> private void writeHeader(XslFOProfileWriter fo) { fo.TAddColumn("Дата", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "20%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); fo.TAddColumn("Трудозатраты<fo:block font-weight='normal'>(всего, по инцидентам / по списаниям)</fo:block>", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "30%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); int nColIndex = fo.TAddColumn("Баланс списаний", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, "TABLE_HEADER"); fo.TAddSubColumn(nColIndex, "за день", align.ALIGN_CENTER, valign.VALIGN_TOP, null, "25%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); fo.TAddSubColumn(nColIndex, "за период, накопительно", align.ALIGN_CENTER, valign.VALIGN_TOP, null, "25%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); }
// Выводит итоговые финансовые данные по проектам private void writeProjectIncomeDataRow(XslFOProfileWriter fo, string sLabel) { fo.TRStart(); _WriteCell(fo, sLabel); foreach (IDictionary income in FinanceData?.Incomes) { _WriteCell(fo, xmlEncode(income["IncomeSum"])); } fo.TREnd(); }
/// <summary> /// Вставляет строку таблицы /// </summary> /// <param name="foWriter"></param> /// <param name="cells"></param> /// <param name="firstBold"></param> protected void _WriteTR(XslFOProfileWriter foWriter, bool firstBold, params object[] cells) { foWriter.TRStart(); for (int i = 0; i < cells.Length; i++) { foWriter.TRAddCell(cells[i], null, 1, 1, (i == 0 && firstBold) ? "CELL_BOLD_CLASS" : "CELL_CLASS"); } foWriter.TREnd(); }
/// <summary> /// Построение отчета с привязкой к бюджету /// </summary> /// <param name="fo"></param> private void writeBudgetBindedReport(XslFOProfileWriter fo) { _TableSeparator(fo); fo.TStart(true, ITRepStyles.TABLE, false); #region Шапка отчета fo.TAddColumn("Контрагент", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_CELL_BOLD, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Статья бюджета", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "3%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Сумма в бюджете", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_CELL_BOLD, "2%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("На начало периода", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "2%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); //Общее количество колонок в таблице отчета int i = 6; //Заголовки колонок foreach (IDictionary Interval in FinanceData.DateIntervals) { fo.TAddColumn(xmlEncode(Interval["Name"].ToString()), align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); i++; } fo.TAddColumn("Итого", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("На конец периода", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "4%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Остаток", align.ALIGN_RIGHT, valign.VALIGN_MIDDLE, null, "5%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); int nRowCount = i++; #endregion fo.TRStart(); fo.TRAddCell("ВСЕГО ПО ПРОЕКТУ", "string", nRowCount + 1, 1, ITRepStyles.GROUP_HEADER); fo.TREnd(); //Итого Сальдо по временному интервалу writeIntervalSaldoDataRow(fo, 2, "Сальдо"); //Итого приходы по проекту writeTotalIncomeDataRow(fo, 2, "Приход"); //Итого расходы по проекту writeTotalOutcomeDataRow(fo, 2, "Расход"); //TODO: Добавить Итого, Остаток, Всего fo.TRStart(); fo.TRAddCell("ПО КАЖДОЙ СТАТЬЕ БЮДЖЕТА", "string", nRowCount + 1, 1, ITRepStyles.GROUP_HEADER); fo.TREnd(); //Платежи по каждой статье бюджета в разрезе временной шкалы writeProjectBudgetBindedOutcomesData(fo); fo.TEnd(); }
// Выводит общие финансовые данные private void writeGenDataRow(XslFOProfileWriter fo, ArrayList al) { fo.TRStart(); writeEmptyValueCell(fo, 2); foreach (IDictionary fd in al) { _WriteCell(fo, xmlEncode(fd["Sum"].ToString())); } writeEmptyValueCell(fo, 3); fo.TREnd(); }
/// <summary> /// Выводит расходы по проекту в разрезе временной шкалы по каждому контрагенту /// </summary> private void writeProjectSupplierBindedOutcomesData(XslFOProfileWriter fo) { if (null == FinanceData) { throw new ApplicationException("Не инициализированы финансовые показатели по проекту"); } object oCurrentSupplierID = null; foreach (IDictionary Outcome in FinanceData?.Outcomes) { // Проверяем перешли ли к следующему контрагенту, если да, выводим данные о нем if (!Outcome["SupplierID"].Equals(oCurrentSupplierID)) { //Если не первая строка, закроем предыдущую if (null != oCurrentSupplierID) { //выведем столбцы "Итого","Всего","Остаток" _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData?.SupplierOutcomeSum[oCurrentSupplierID])), "string", ITRepStyles.TABLE_CELL_BOLD); _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData?.OutcomesAfter[oCurrentSupplierID])), "string", ITRepStyles.TABLE_CELL_BOLD); fo.TREnd(); } fo.TRStart(); //Наименование контрагента _WriteCell(fo, xmlEncode(Outcome["OrgName"]), "string", ITRepStyles.TABLE_CELL_BOLD); oCurrentSupplierID = Outcome["SupplierID"]; //Выведем показатели на начало периода if (null != FinanceData.OutcomesBefore) { foreach (IDictionary outcomeBefore in FinanceData?.OutcomesBefore) { if (outcomeBefore["SupplierID"].Equals(oCurrentSupplierID)) { _WriteCell(fo, xmlEncode(_FormatMoney(outcomeBefore["PaymentSum"]))); } } } else { writeEmptyValueCell(fo, 1); } } //непосредственно сам фин показатель по текущему временному интервалу _WriteCell(fo, xmlEncode(_FormatMoney(Outcome["PaymentSum"].ToString()))); } //Закроем последнюю строку //выведем столбцы "Итого","Всего","Остаток" _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData?.SupplierOutcomeSum[oCurrentSupplierID])), "string", ITRepStyles.TABLE_CELL_BOLD); _WriteCell(fo, xmlEncode(_FormatMoney(FinanceData?.OutcomesAfter[oCurrentSupplierID])), "string", ITRepStyles.TABLE_CELL_BOLD); fo.TREnd(); }
public void Write(XslFOProfileWriter writer) { writer.WriteLayoutMaster(); writer.StartPageSequence(); writer.StartPageBody(); headerWriter.Write(writer); bodyWriter.Write(writer); writer.EndPageBody(); writer.EndPageSequence(); }
/// <summary> /// Формирует в потоке FO одну ячейку таблицы с заданными данными, типом /// и указанным стилевым классом. /// </summary> /// <param name="foWriter"></param> /// <param name="data">Данные; явно приводятся к строке</param> /// <param name="sType">Тип данных в ячейке</param> /// <param name="sCellClass">Наименование стилевого класса для ячейки</param> /// <param name="trackEmptyValAsND"> /// Задает режим явной замены "пустых" значений: если задан в true и значение /// data есть null или DBNull.Value, то выводит текст "нет данных" и заменят /// заданный стилевой класс на ITRepStyles.TABLE_CELL_ND; /// </param> protected void _WriteCell(XslFOProfileWriter foWriter, object data, string sType, string sCellClass, bool trackEmptyValAsND) { string sValue = String.Empty; if (null != data && DBNull.Value != data) { sValue = data.ToString(); } if (String.Empty == sValue && trackEmptyValAsND) { sValue = "( нет данных )"; sCellClass = ITRepStyles.TABLE_CELL_ND; } foWriter.TRAddCell(sValue, sType, 1, 1, sCellClass); }
/// <summary> /// Построение отчета /// </summary> /// <param name="data">Контекст</param> protected override void buildReport(ReportLayoutData data) { XslFOProfileWriter foWriter = data.RepGen; ThisReportParams ps = new ThisReportParams(data.Params); ps.FolderName = data.DataProvider.GetValue("Header", null) as string; OverallData report = null; // получим данные using (IDataReader reader = data.DataProvider.GetDataReader("Main", null)) { if (reader.Read()) { IOverallDeserializer deserializer = new OverallDeserializer( new DepartmentDataDeserializer( new DepartmentDetailDataDeserializer() ) ); report = deserializer.Deserialize(new DataReaderWrapper(reader)); } else { report = new OverallData(new List <DepartmentData>()); } } // сконфигурируем компонент, отвечающий за формирование отчета IReportWriter writer = new ReportWriter( ps.ShowRestrictions ? new WithParamsHeaderWriter(ps) as IHeaderWriter : new SimpleHeaderWriter() as IHeaderWriter, new BodyWriter( new BaseDataWriter( new SimpleIntIndexGenerator(1, 1), ps.TimeMeasureUnits == TimeMeasureUnits.Days ? new DHMCostsFormatter() as ICostsFormatter : new HourCostsFormatter() as ICostsFormatter ), report, ps.ShowDetalization ? new DetailReportSerializer() as IReportSerializer : new MainReportSerializer() as IReportSerializer ) ) as IReportWriter; writer.Write(foWriter); }
/// <summary> /// Формирует текст XSL-FO, представляющий данные заданных параметров, и /// записывает его как текст подзаголовка формируемого отчета /// </summary> /// <param name="foWriter"></param> public void WriteParamsInHeader(XslFOProfileWriter foWriter) { // XSL-FO с перечнем параметров будем собирать сюда: StringBuilder sbBlock = new StringBuilder(); string sParamValue; // временная строка с представлением значения параметра // #1: Сотрудник: sbBlock.Append(getParamValueAsFoBlock("Сотрудник", FullName)); // #2: Дата начала и окончания отчетного периода. // Любая из этих дат может быть не задана; если это так, то // в заголовке отчета выводится соответствующие указание: if (IsSpecifiedIntervalBegin) { sParamValue = ((DateTime)IntervalBegin).ToString("dd.MM.yyyy"); } else { sParamValue = "не задана, используется текущая - " + DateTime.Now.ToString("dd.MM.yyyy"); } sbBlock.Append(getParamValueAsFoBlock("Дата начала периода", sParamValue)); if (IsSpecifiedIntervalEnd) { sParamValue = ((DateTime)IntervalEnd).ToString("dd.MM.yyyy"); } else { sParamValue = "не задана, используется текущая - " + DateTime.Now.ToString("dd.MM.yyyy"); } sbBlock.Append(getParamValueAsFoBlock("Дата окончания периода", sParamValue)); // #3: Единицы представления времени: sParamValue = TimeMeasureUnitsItem.GetItem(TimeMeasure).Description; sbBlock.Append(getParamValueAsFoBlock("Единицы изменения времени", sParamValue)); // #4: Признак "Показывть выходные дни без списаний" sParamValue = ShowFreeWeekends? "Да" : "Нет"; sbBlock.Append(getParamValueAsFoBlock("Отображать выходные без списаний", sParamValue)); // ВЫВОД ПОДЗАГОЛОВКА: foWriter.AddSubHeader( @"<fo:block text-align=""left"" font-weight=""bold"">Параметры отчета:</fo:block>" + sbBlock.ToString() ); }
// Выводит приходы и расходы по займам и интервалам private void writeLoansIncOutDataRow(XslFOProfileWriter fo, ThisReportData data, int iType, ReportParams Params) { string sCol = "OutSum"; fo.TRStart(); if (iType == 0) { sCol = "IncSum"; _WriteCell(fo, "П"); } else { _WriteCell(fo, "Р"); } //На начало периода writeEmptyValueCell(fo, 1); //Расходы - приходы foreach (IDictionary fd in data.LoansSumFinData) { //Если есть расходы или приходы, то формируем ссылку на отчет с детализацией if ((String)fd[sCol] != "0.00") { StringBuilder sbDetailRef = new StringBuilder(); _StartReportURL(sbDetailRef, "r-LoansIncOut"); _AppendParamURL(sbDetailRef, "Type", iType); _AppendParamURL(sbDetailRef, "PrjGroup", (Guid)Params.GetParam("Group").Value); _AppendParamURL(sbDetailRef, "DateIntervalID", (Guid)fd["DateIntervalID"]); _AppendParamURL(sbDetailRef, "IsSeparate", Params.GetParam("IsSeparate").Value); _AppendParamURL(sbDetailRef, "Sum", fd[sCol].ToString()); _EndReportURL(sbDetailRef, "Детализация", fd[sCol]); _WriteCell(fo, sbDetailRef.ToString()); } else { _WriteCell(fo, xmlEncode(fd[sCol])); } } // writeEmptyValueCell(fo, 3); fo.TREnd(); }
/// <summary> /// Построение отчета /// </summary> /// <param name="data">Контекст</param> protected override void buildReport(ReportLayoutData data) { XslFOProfileWriter foWriter = data.RepGen; ThisReportParams ps = new ThisReportParams(data.Params); string name = data.DataProvider.GetValue("Header", null) as string; List <BaseData> report = null; // получим данные using (IDataReader reader = data.DataProvider.GetDataReader("Main", null)) { if (reader.Read()) { IDataDeserializer deserializer = new DataDeserializer( new SnapDataDeserializer(), new StatusDataDeserializer() ); report = new List <BaseData>(deserializer.Deserialize(new DataReaderWrapper(reader))); } else { report = new List <BaseData>(); } } // сконфигурируем компонент, отвечающий за формирование отчета IReportWriter writer = new ReportWriter( new HeaderWriter(name), new BodyWriter( new BaseDataWriter( new SimpleIntIndexGenerator(1, 1)), report, new ReportSerializer() ) ) as IReportWriter; writer.Write(foWriter); }
/// <summary> /// Отображение в отчете основных свойств лота и тендера /// </summary> /// <param name="fo"></param> /// <param name="data">Данные тендера, данные которого отображаются</param> private void writeMainData(XslFOProfileWriter fo, ThisReportData data) { #region #1: Основные данные // ...разделитель _TableSeparator(fo); fo.TStart(false, ITRepStyles.TABLE, false); fo.TAddColumn("Характеристика", align.ALIGN_LEFT, valign.VALIGN_TOP, null, "30%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); fo.TAddColumn("Значение", align.ALIGN_LEFT, valign.VALIGN_TOP, null, "70%", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, ITRepStyles.TABLE_HEADER); writeDataPair(fo, "Получено в кассе", xmlEncode(data.Main["KassRecieved"])); writeDataPair(fo, "Сдано по АО (после 04/10/2013)", xmlEncode(data.Main["AOSended"])); writeDataPair(fo, "Возвращено в кассу", xmlEncode(data.Main["KassReturned"])); writeDataPair(fo, "Получено от других содрудников", xmlEncode(data.Main["EmpRecieved"])); writeDataPair(fo, "Передано другим сотрудникам", xmlEncode(data.Main["EmpSended"])); writeDataPair(fo, "Итоговое сальдо ДС", "<fo:inline font-weight='bold'>" + xmlEncode(data.Main["EmpSaldoDS"]) + "</fo:inline>"); fo.TEnd(); #endregion }
public void Write(XslFOProfileWriter writer) { writer.Header("Затраты в разрезе департаментов"); writer.AddSubHeader(@"<fo:block font-weight=""bold"" text-align=""left"">Параметры отчета:</fo:block>"); WriteParam(writer, "Период времени", PeriodTypeItem.GetItem(ps.PeriodType).Description); if (ps.PeriodType == PeriodType.DateInterval) { WriteParam(writer, "С", ps.IntervalBegin.HasValue ? ps.IntervalBegin.Value.ToString("dd.MM.yyyy") : "Не задан"); WriteParam(writer, "По", ps.IntervalEnd.HasValue ? ps.IntervalEnd.Value.ToString("dd.MM.yyyy") : "Не задан (используется текущая дата)"); } else if (ps.PeriodType == PeriodType.SelectedQuarter) { WriteParam(writer, "Квартал", ps.Quarter.HasValue ? QuarterItem.GetItem(ps.Quarter.Value).Description : "Не задан"); } WriteParam(writer, "Активность", ps.FolderName); WriteParam(writer, "Детализация по отделам и группам", ps.ShowDetalization ? "Да" : "Нет"); WriteParam(writer, "Представление времени", TimeMeasureUnitsItem.GetItem(ps.TimeMeasureUnits).Description); WriteParam(writer, "Порядок сортировки", ReportDepartmentCostSortItem.GetItem(ps.SortBy).Description); }
public void Write(XslFOProfileWriter foWriter, IEnumerable <BaseData> values) { foWriter.TStart(true, "TABLE", false); foWriter.TAddColumn("№", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "5%", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); foWriter.TAddColumn("Дата и время", align.ALIGN_LEFT, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); foWriter.TAddColumn("Пользователь", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); foWriter.TAddColumn("Наименование", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); foWriter.TAddColumn("Краткое наименование", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); foWriter.TAddColumn("Директор клиента", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); foWriter.TAddColumn("Структура организации определена", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); foWriter.TAddColumn("Идентификатор внешней системы", align.ALIGN_CENTER, valign.VALIGN_MIDDLE, null, "", align.ALIGN_NONE, valign.VALIGN_NONE, "TABLE_HEADER"); foreach (BaseData value in values) { foWriter.TRStart(); foWriter.TRAddCell(indexGenerator.Generate(), null); foWriter.TRAddCell(value.DateTime.ToString("dd.MM.yyyy hh.mm.ss"), null); foWriter.TRAddCell(value.SystemUser, null); if (value is StatusData) { StatusData typedValue = value as StatusData; foWriter.TRAddCell(typedValue.Exists ? "Создана новая организация" : "Организация удалена", null, 5, 1); } else { SnapData typedValue = value as SnapData; foWriter.TRAddCell(typedValue.Name, null); foWriter.TRAddCell(typedValue.ShortName, null); foWriter.TRAddCell(typedValue.Director, null); foWriter.TRAddCell(typedValue.StructureHasDefined ? "Да" : "Нет", null); foWriter.TRAddCell(typedValue.ExternalID, null); } foWriter.TREnd(); } foWriter.TEnd(); }