Здравствуйте, меня интересует или есть возможность создавать excel отчеты в BPMOnline 5.4 ?
(Печатные формы и последующую конвертацию в excel не предлагать, в силу того что там изначально нарушено форматирование).
Имееться в виду возможность в скрипте описать файл или какимто другим способом.
Пробывал использовать csv файлы, но в них нельзя применять форматирование и обьеденение строк.
Нравится
Здравствуйте, Игорь!
Да, есть возможность сделать такую доработку.
Вам нужно использовать Open XML SDK.
Для использования нужно просто подключить namespace DocumentFormat.OpenXml:
Вот конкретный пример использования:
здесь формируется .xlsx файл с колонками объекта, выбранного в lookup-поле
Page.BaseMessagePanel.Clear(); if (string.IsNullOrEmpty(SchemaName)) { Page.BaseMessagePanel.AddMessage(WarrningMessage, UnableSelectObjectMessage, MessageType.Warning, true); return true; } Page.Response.ClearHeaders(); Page.Response.ClearContent(); string fileName = SchemaName; var instance = UserConnection.EntitySchemaManager.GetInstanceByUId(SchemaId); if (instance != null) { fileName = instance.Caption.ToString(); } Page.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Page.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx"); List<double> columnWidthsList = new List<double>(); using (MemoryStream stream = new MemoryStream()) { using(SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook)) { // Add a WorkbookPart to the document. var workbookpart = spreadsheetDocument.AddWorkbookPart(); workbookpart.Workbook = new OpenXmlSpreadsheet.Workbook(); // Add a WorksheetPart to the WorkbookPart. var worksheetPart = workbookpart.AddNewPart<WorksheetPart>(); var workbookStylesPart = workbookpart.AddNewPart<WorkbookStylesPart>(); worksheetPart.Worksheet = new OpenXmlSpreadsheet.Worksheet(new OpenXmlSpreadsheet.SheetData()); // Add Sheets to the Workbook. OpenXmlSpreadsheet.Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<OpenXmlSpreadsheet.Sheets>(new OpenXmlSpreadsheet.Sheets()); // Append a new worksheet and associate it with the workbook. string relationshipId = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart); string sheetName = fileName; OpenXmlSpreadsheet.Sheet sheet = new OpenXmlSpreadsheet.Sheet() { Id = relationshipId, SheetId = 1, Name = sheetName }; sheets.Append(sheet); OpenXmlSpreadsheet.Worksheet worksheet = new OpenXmlSpreadsheet.Worksheet(); OpenXmlSpreadsheet.SheetData sheetData = new OpenXmlSpreadsheet.SheetData(); OpenXmlSpreadsheet.Row row = new OpenXmlSpreadsheet.Row(); OpenXmlSpreadsheet.Cell currentCell; int columnCount = 0; var entitySchema = UserConnection.EntitySchemaManager.GetInstanceByName(SchemaName); foreach (var column in entitySchema.Columns) { if (!column.DefValue.IsSystemValue && !column.Name.Equals("ProcessListeners")) { currentCell = new OpenXmlSpreadsheet.Cell(); currentCell.DataType = OpenXmlSpreadsheet.CellValues.String; if (column.RequirementType == EntitySchemaColumnRequirementType.ApplicationLevel || column.RequirementType == EntitySchemaColumnRequirementType.DBLevel) { currentCell.StyleIndex = 3; } else { currentCell.StyleIndex = 4; } columnWidthsList.Add(CalculateWidth(column.Caption.Value)); currentCell.CellValue = new OpenXmlSpreadsheet.CellValue(column.Caption.Value); row.AppendChild(currentCell); } } sheetData.Append(row); row = new OpenXmlSpreadsheet.Row(); for (int i=0;i<columnWidthsList.Count; i++) { currentCell = new OpenXmlSpreadsheet.Cell(); currentCell.DataType = OpenXmlSpreadsheet.CellValues.String; currentCell.StyleIndex = 5; row.AppendChild(currentCell); } sheetData.Append(row); //Adding columns and specifeing width OpenXmlSpreadsheet.Columns columns = new OpenXmlSpreadsheet.Columns(); uint j = 1; foreach (var w in columnWidthsList) { columns.Append(CreateColumnData(j, w)); j++; } worksheet.Append(columns); //-- worksheet.Append(sheetData); workbookStylesPart.Stylesheet = CreateStyleSheet(); worksheetPart.Worksheet = worksheet; spreadsheetDocument.Close(); stream.Seek(0, SeekOrigin.Begin); byte[] dataArray = stream.ToArray(); Page.Response.BinaryWrite(dataArray); Page.Response.End(); } } return true;
Андрей, Добрый день!
Пытаюсь реализовать создание Excel отчета по вашему примеру. Не компилируется из-за ошибки с функцией CreateStyleSheet()
Не могли бы Вы привести пример данной функции, т.к. вероятно данная функция добавлена в methods, или ответить, что необходимо написать вместо данной функции.
Код без данной строки
workbookStylesPart.Stylesheet = CreateStyleSheet();
компилируется и отрабатывает(видно в Visual Studio), но файл на сохранение не выдается. Пишет ошибку "Время ожидания выполнения запроса истекло." Может ли быть проблема в данной строке?
Здравствуйте, Эмин!
Этот пример из страницы "ImportSettingsPage". Метод CreateStyleSheet() определен там же. На всякий случай прикладываю исходный код.
Добрый день!
Почти та же проблема, что и у Эмина, только у меня код отрабатывает без ошибок, но в конце файл не выдается на сохранение с ошибкой:
Время ожидания выполнения запроса истекло.
Action: Click
ControlId: PageContainer_btnOk
SubmitAjaxEventConfig: {"config":{"viewStateMode":"include","extraParams":{}}}
Page.Response.ClearHeaders(); Page.Response.ClearContent(); Page.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Page.Response.AddHeader("Content-Disposition", "attachment; filename=TurnoverReport.xlsx"); using (DB.DBExecutor dbExecutor = UserConnection.EnsureDBConnection()) { using (MemoryStream stream = new MemoryStream()) { #region openxml using (OpenXmlPackaging.SpreadsheetDocument spreadsheetDocument = OpenXmlPackaging.SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook, true)) { //...тут все без ошибок }//using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create #endregion stream.Seek(0, SeekOrigin.Begin); byte[] dataArray = stream.ToArray(); Page.Response.BinaryWrite(dataArray); Page.Response.End(); } //using (MemoryStream stream = new MemoryStream()) } //using dbExecutor
версия 5.4
схемы из примера Андрея у меня в конфигурации нет
Здравствуйте, Лариса!
Вам нужно импортировать схему, которую я предоставлял, вызвать
workbookStylesPart.Stylesheet = CreateStyleSheet();
и тогда должно работать. В общем, если Вы вырезали из кода строки, из-за которых происходила ошибка компиляции, это не означает, что этот код не нужен, и без него не возникнет ошибки на этапе выполнения.
Приведите, пожалуйста, свой код в соответствие с приведенным примером.