Здравствуйте, меня интересует или есть возможность создавать excel отчеты в BPMOnline 5.4 ?
(Печатные формы и последующую конвертацию в excel не предлагать, в силу того что там изначально нарушено форматирование).
Имееться в виду возможность в скрипте описать файл или какимто другим способом.
Пробывал использовать csv файлы, но в них нельзя применять форматирование и обьеденение строк.
Нравится
Здравствуйте, Игорь!
Да, есть возможность сделать такую доработку.
Вам нужно использовать Open XML SDK.
Для использования нужно просто подключить namespace DocumentFormat.OpenXml:

Вот конкретный пример использования:
здесь формируется .xlsx файл с колонками объекта, выбранного в lookup-поле
[csharp]
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 columnWidthsList = new List();
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();
var workbookStylesPart = workbookpart.AddNewPart();
worksheetPart.Worksheet = new OpenXmlSpreadsheet.Worksheet(new OpenXmlSpreadsheet.SheetData());
// Add Sheets to the Workbook.
OpenXmlSpreadsheet.Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild(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
Андрей, Добрый день!
Пытаюсь реализовать создание Excel отчета по вашему примеру. Не компилируется из-за ошибки с функцией CreateStyleSheet()
Не могли бы Вы привести пример данной функции, т.к. вероятно данная функция добавлена в methods, или ответить, что необходимо написать вместо данной функции.
Код без данной строки
[csharp]
workbookStylesPart.Stylesheet = CreateStyleSheet();
[/csharp]
компилируется и отрабатывает(видно в Visual Studio), но файл на сохранение не выдается. Пишет ошибку "Время ожидания выполнения запроса истекло." Может ли быть проблема в данной строке?
Здравствуйте, Эмин!
Этот пример из страницы "ImportSettingsPage". Метод CreateStyleSheet() определен там же. На всякий случай прикладываю исходный код.
Добрый день!
Почти та же проблема, что и у Эмина, только у меня код отрабатывает без ошибок, но в конце файл не выдается на сохранение с ошибкой:
Время ожидания выполнения запроса истекло.
Action: Click
ControlId: PageContainer_btnOk
SubmitAjaxEventConfig: {"config":{"viewStateMode":"include","extraParams":{}}}
[csharp]
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
[/csharp]
версия 5.4
схемы из примера Андрея у меня в конфигурации нет
Здравствуйте, Лариса!
Вам нужно импортировать схему, которую я предоставлял, вызвать
[csharp]
workbookStylesPart.Stylesheet = CreateStyleSheet();
[/csharp]
и тогда должно работать. В общем, если Вы вырезали из кода строки, из-за которых происходила ошибка компиляции, это не означает, что этот код не нужен, и без него не возникнет ошибки на этапе выполнения.
Приведите, пожалуйста, свой код в соответствие с приведенным примером.