使用 Telerik 导出到 Excel (XLSX) 时如何解释集合?

Posted

技术标签:

【中文标题】使用 Telerik 导出到 Excel (XLSX) 时如何解释集合?【英文标题】:How to interpret a collection when exporting to Excel (XLSX) using Telerik? 【发布时间】:2016-05-29 14:53:58 【问题描述】:

场景


我正在使用 Telerik UI For Windows forms

我有一个 RadGridView,我在其上代表一个名为 MarketInfo 的自定义类型:

Public NotInheritable Class MarketInfo

    ...
    Public ReadOnly Property Participants As ReadOnlyCollection(Of ParticipantInfo)
        Get
            Return Me.GetParticipants()
        End Get
    End Property
    ...

End Class

它只包含文本和布尔属性,以及返回另一个自定义类型集合的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 participantElement.@name
        End Get
    End Property

    Public ReadOnly Property Id As String
        Get
            Return participantElement.@id
        End Get
    End Property

    Public ReadOnly Property Odds As String
        Get
            Return participantElement.@odds
        End Get
    End Property

    Public ReadOnly Property OddsDecimal As String
        Get
            Return participantElement.@oddsDecimal
        End Get
    End Property

    Public ReadOnly Property LastUpdateDate As String
        Get
            Return participantElement.@lastUpdateDate
        End Get
    End Property

    Public ReadOnly Property LastUpdateTime As String
        Get
            Return participantElement.@lastUpdateTime
        End Get
    End Property

    Public ReadOnly Property Handicap As String
        Get
            Return participantElement.@handicap
        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>
...

我希望看到每个 MarketInfo 创建一个 Excel 页面,其中缺少这些属性。

我不熟悉 Excel 的用法和 Excel 术语,我不确定如何通常可以在工作表页面中表示集合,我想通过创建一个新的工作表页面并将其“链接”到相应的单元格。

我只想在 Excel 文件中表示我在我的应用程序中表示的相同信息。

问题


如何通过 Telerik 导出相关库来做到这一点?

如果不可能使用 Telerik 库,那么我如何使用其他 3rd 方免费库来做到这一点?

(我只是说我愿意接受其他类型的建议,但是,请记住,我知道更专注的 Excel 库,但无论如何我仍然不明白如何使用任何库来执行此操作...可能是由于误解了如何仅使用 Excel UI 来完成添加/表示集合的相同任务。)

【问题讨论】:

【参考方案1】:

如果你愿意使用开源库,试试这个: 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 Grid 中的数据,但我猜它可能具有 Rows 和 Columns 属性。如果不是这种情况,那么您将不得不更改那部分代码。如果您使用 DataTable 作为网格的数据源,那么您可以直接传递 DataTable。创建文件后,可以使用 MS Excel 或任何其他支持 openxml 格式的应用程序打开它。您必须使用 ExcelPivotTable 对象才能获得所需的结果。 另请参阅以下示例报告的屏幕截图:

【讨论】:

感谢您的宝贵时间,但这并不能回答我的问题:“如何在 Excel 文件中导出/表示元素数组?”。似乎您正在展示如何导出 DataTable 结构,我知道许多 Excel 库,并且我看到了很多这样的导出示例,这不是我需要的,我需要一个非常具体的带有数组的示例。无论如何我试过了,但在你提供的代码中,“工作表”对象是“ExcelWorksheet”类型,但是,该类型不公开任何“单元格”成员,你在“导出”函数中使用它,然后打开我这边出现编译器错误,因为该成员不存在。 对不起,你是对的。 Cell(row,col) 是我可以访问的内部方法,因为我使用的是 EPPlus 源代码。由于您使用的是 dll,请将 sheet.Cell(row, col) 更改为 sheet.Cells[row, col] ,它应该可以工作。 我搜索了 EPPlus 样本,但没有找到任何类似的东西。也许我错了,但您所要求的可以使用 excel 宏来完成。现在使用宏可能会引起安全问题,但除了 VBA 函数之外,我没有看到其他方法来扩展所选市场信息对象的详细信息。我建议您下载 EPPlus 源代码并找到一种无需使用 VBA 宏即可实现所需功能的方法。【参考方案2】:

    使用层次结构在内存中填充一个新的 RadGridView,然后像其他人一样导出它: http://www.telerik.com/forums/radgrid-hierarchy-export-to-excel-showing-exporting-master-table-rows-but-detail-rows-are-blank-lines

    您可以控制使用 XML 创建的 Excel XML,与 OpenXML 相比,ClosedXML 非常易于使用。

    有loads of other options和

    向 Telerik 提出支持请求可能是确认其GridViewExportOptions 中的“每页详细信息”页面是否有任何选项的最快方式。

【讨论】:

感谢您的回答,第 4 条建议是不可能的,因为他们不会为已过 30 天的免费用户帐户提供支持。我将尝试调查您建议我的其他选项,然后来这里接受答案或在这里暴露我可能遇到的任何障碍,因为关于如何在 excel 单元格中表示集合的事情仍然不清楚。

以上是关于使用 Telerik 导出到 Excel (XLSX) 时如何解释集合?的主要内容,如果未能解决你的问题,请参考以下文章

使用Apache POI导出Excel小结--导出XLS格式文档

sqlyog中如何将查询到的数据导出为xls格式的excel文件

winfrom 使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中

iview表格导出Excel时遇到的问题:导出.xls文件&导出的表格部分列错位

java poi导出excel

laravel-excel 无法使用带有图像的刀片导出 xls 文件