使用 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中