如何解决DataGrid表导出到MS Excel时,Datat显示为System.Data.DataRowView
我有一个导出到Microsoft Excel按钮的单击事件。我拥有的代码使用DataGrid
表并将其导出到MS Excel。
我遇到的问题是将DataGrid
导出到Microsoft Excel时,列标题正确,但是单元格中的数据显示为System.Data.DataRowView
以下是我的按钮单击事件的代码:
private void butn_ExportResults_Click(object sender,RoutedEventArgs e)
{
if (dt_ReportList.Items.Count > 0)
{
try
{
Microsoft.Office.Interop.Excel.Application xcelApp = new Microsoft.Office.Interop.Excel.Application();
xcelApp.Application.Workbooks.Add(Type.Missing);
// Worksheet sheet1 = (Worksheet)workbook.Sheets[1];
for (int i = 1; i < dt_ReportList.Columns.Count + 1; i++)
{
xcelApp.Cells[1,i] = dt_ReportList.Columns[i - 1].Header;
}
for (int i = 0; i < dt_ReportList.Items.Count; i++)
{
for (int j = 0; j < dt_ReportList.Columns.Count; j++)
{
xcelApp.Cells[i + 2,j + 1] = dt_ReportList.Items[i].ToString();
}
}
xcelApp.Columns.AutoFit();
xcelApp.Visible = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
解决方法
您正在使用DataTable
,因此DataGrid
中的行数据类型将为DataRowView
。它包含当前行所有列的值。问题是您不访问这些值,而是在此行中将DataRowView
实例转换为string
:
xcelApp.Cells[i + 2,j + 1] = dt_ReportList.Items[i].ToString();
它不会覆盖ToString
,因此结果将只是其类型名称。相反,您必须通过Row
属性中的索引访问相应的列,例如:
xcelApp[i + 2,j + 1] = dataRowView.Row[j];
DataRowView
仅在外循环中发生变化,因此我们通过模式匹配将其获取并强制转换在那里。 if
语句确保给定的项目是DataRowView
,因为在{{1}上启用CanUserAddRows
时,最后一行可以是类型为NewItemPlaceholder
的空白行。 }。
DataGrid
,
这样做的时候
dt_ReportList.Items[i].ToString();
您正在引用该行,即整个行。这是您的基本问题,也是为什么要获得数据行视图。
您想要该行中的列值。
我认为您可以使用列索引进行引用。
因此尝试:
dt_ReportList.Items[i][j].ToString();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。