Как интерпретировать коллекцию при экспорте в Excel (XLSX) с помощью Telerik?
СЦЕНАРИЙ
Я использую Telerik UI для форм Windows.
У меня есть RadGridView, на котором я представляю настраиваемый тип с именем MarketInfo
:
Public NotInheritable Class MarketInfo
...
Public ReadOnly Property Participants As ReadOnlyCollection(Of ParticipantInfo)
Get
Return Me.GetParticipants()
End Get
End Property
...
End Class
Он просто содержит свойства text и booleans и свойство Participants
, которое возвращает коллекцию другого настраиваемого типа:
Private Function GetParticipants(ByVal market As XElement) As ReadOnlyCollection(Of ParticipantInfo)
Dim participantInfoList As New List(Of ParticipantInfo)
For Each participantNode As XElement In market...<participant>
participantInfoList.Add(New ParticipantInfo(participantNode))
Next
Return New ReadOnlyCollection(Of ParticipantInfo)(participantInfoList)
End Function
И это полный класс ParticipantInfo
:
Public NotInheritable Class ParticipantInfo
Private ReadOnly participantElement As XElement
Public ReadOnly Property Name As String
Get
Return [email protected]
End Get
End Property
Public ReadOnly Property Id As String
Get
Return [email protected]
End Get
End Property
Public ReadOnly Property Odds As String
Get
Return [email protected]
End Get
End Property
Public ReadOnly Property OddsDecimal As String
Get
Return [email protected]
End Get
End Property
Public ReadOnly Property LastUpdateDate As String
Get
Return [email protected]
End Get
End Property
Public ReadOnly Property LastUpdateTime As String
Get
Return [email protected]
End Get
End Property
Public ReadOnly Property Handicap As String
Get
Return [email protected]
End Get
End Property
Public Sub New(ByVal participantElement As XElement)
Me.participantElement = participantElement
End Sub
Private Sub New()
End Sub
End Class
Поэтому в основном мне нужно экспортировать коллекцию типа ParticipantInfo
, которая должна быть представлена в Excel.
Ну, так что в RadGridView
я скрываю столбец Participants
, потому что он не может его представлять (потому что это коллекция), тогда я загружаю эту коллекцию в качестве источника данных на другой RadGridView
.
Чтобы понять это лучше, это результат:
![введите описание изображения здесь]()
Проблема
Моя проблема в том, что я не знаю, как интерпретировать это в файле excel (XLSX).
Это код, когда я пытаюсь экспортировать содержимое сетки MarketInfo
:
Dim exporter As New ExportToExcelML(rdg)
With exporter
.HiddenColumnOption = HiddenOption.ExportAlways
.HiddenRowOption = HiddenOption.ExportAlways
.ExportVisualSettings = True
.SheetMaxRows = ExcelMaxRows._65536
.SheetName = "xxxxxxxx"
.SummariesExportOption = SummariesOption.ExportAll
.PagingExportOption = PagingExportOption.AllPages
.FileExtension = ".xlsx"
.RadGridViewToExport = rdg
.ChildViewExportMode = ChildViewExportMode.ExportAllViews
End With
exporter.RunExport(fileName)
Однако созданный файл просто содержит имя типа участников:
...
<Data ss:Type="String">System.Collections.ObjectModel.ReadOnlyCollection`1[WilliamHillLeecher.Leecher.Types.ParticipantInfo]</Data></Cell></Row>
...
![введите описание изображения здесь]()
Я ожидал увидеть одну страницу Excel, созданную за каждый MarketInfo
с этими отсутствующими свойствами.
Я не знаком с использованием Excel и терминологией Excel, я не уверен, как обычно можно представлять коллекцию на странице листа, я полагаю, создавая новую страницу листа и "привязывая" ее к соответствующей ячейке.
Я просто хотел бы представить ту же самую информацию в файле Excel, который я представляю в своем приложении.
Вопрос
Как я мог сделать это с помощью Telerik экспорта связанных библиотек?
Если это возможно, не используя Telerik libs, то как я могу это сделать с другой сторонней бесплатной библиотекой?.
(с этим я просто говорю, что я открыт для других предложений, однако имейте в виду, что я знаю более сосредоточенные библиотеки Excel, но в любом случае я все равно не пойму, как сделать это с любым lib... возможно, из-за непонимания того, как можно сделать одну и ту же задачу добавления/представления коллекции только с помощью интерфейса Excel.)
Ответы
Ответ 1
Ответ 2
Если вы хотите использовать библиотеку opensource, попробуйте следующее:
EPPlus
После того, как вы ссылаетесь на файл epplus.dll в своем проекте, следующий код может экспортировать данные в формат xlsx так, как вы хотите:
using OfficeOpenXml.Drawing;
using OfficeOpenXml.Drawing.Chart;
using OfficeOpenXml.Style;
using OfficeOpenXml.Table;
using OfficeOpenXml.Table.PivotTable;
namespace OfficeOpenXml
{
public static class ExcelHelper
{
public static void Save(dynamic Table, string path)
{
var excel = CreateReport(Table);
excel.SaveAs(path);
}
static void Save(this ExcelPackage excel, string path)
{
excel.SaveAs(path);
}
static ExcelWorksheet Export(ExcelPackage excel, dynamic Table, out ExcelRange range) // here it is your grid
{
var sheet = excel.Workbook.Worksheets.Add("Master_Data");
int row=0, col=0;
foreach (dynamic dc in Table.Columns)
{
sheet.Cell(row, col++).Value = dc.Caption;
}
row++;
col = 0;
foreach (dynamic dr in Table.Rows)
{
foreach (object value in dr.ItemArray)
{
sheet.Cell(row, col++).Value = value;
}
row++;
col = 0;
}
range= sheet.Cells[0, 0, row - 1, Table.Columns.Count - 1];
return sheet;
}
static ExcelPackage CreateReport(dynamic Table)
{
var excel = new ExcelPackage();
ExcelRange range;
ExcelWorksheet sheet;
sheet = Export( excel, Table, out range);
CreatePivotTable(range, TableStyles.Medium12);
return excel;
}
static ExcelPivotTable CreatePivotTable(ExcelRange range, TableStyles tableStyle)
{
int count = range.Worksheet.Workbook.Worksheets.Count;
var summary = range.Worksheet.Workbook.Worksheets.Add("PivotTable" + count);
var pivotTable = summary.PivotTables.Add(summary.Cells["A3"], range, "Summary" + count);
pivotTable.ApplyBorderFormats = true;
pivotTable.ApplyNumberFormats = true;
pivotTable.TableStyle = tableStyle;
pivotTable.WorkSheet.View.ShowGridLines = false;
pivotTable.MultipleFieldFilters = false;
pivotTable.RowGrandTotals = false;
pivotTable.ColumGrandTotals = false;
pivotTable.Compact = false;
pivotTable.CompactData = false;
pivotTable.GridDropZones = false;
pivotTable.Outline = false;
pivotTable.OutlineData = false;
pivotTable.ShowError = true;
pivotTable.ErrorCaption = "[error]";
pivotTable.ShowHeaders = false;
pivotTable.UseAutoFormatting = true;
pivotTable.ApplyWidthHeightFormats = true;
pivotTable.ShowDrill = true;
//pivotTable.DataOnRows = false;
pivotTable.WorkSheet.View.FreezePanes(pivotTable.PageFields.Count + pivotTable.ColumnFields.Count + 3, 1);
foreach (var fld in pivotTable.Fields)
{
pivotTable.RowFields.Add(fld);
fld.Compact = false;
fld.Outline = false;
fld.ShowAll = false;
fld.SubtotalTop = false;
fld.SubTotalFunctions = eSubTotalFunctions.None;
}
return pivotTable;
}
}
}
Я использовал динамическое ключевое слово в некоторых функциях, потому что я не знаю, как доступ к данным в вашей сетке Telerik, но я предполагаю, что у него могут быть свойства Rows и Columns. Если это не так, вам придется изменить эту часть кода. Если вы используете DataTable в качестве источника данных сетки, вы можете передать DataTable напрямую. После создания файла его можно открыть с помощью MS Excel или любого другого приложения, которое поддерживает формат openxml. вам нужно будет играть с объектом ExcelPivotTable, чтобы получить желаемый результат.
Также см. Скриншот примера отчета ниже:
![Пример отчета]()