Как интерпретировать коллекцию при экспорте в 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, чтобы получить желаемый результат. Также см. Скриншот примера отчета ниже: Пример отчета