【发布时间】:2026-02-18 07:15:01
【问题描述】:
我正在尝试将 WPF DataGrid 中的数据导出到 Excel 文档中。当我运行此按钮时,它会导出屏幕上可见或适合窗口的所有内容。 DataGrid 已填满,您必须向下滚动才能查看所有值,这些隐藏的值不会导出到 excel 文档中,并且会出现错误“对象引用未设置为对象的实例”。发生。如果所有值都适合屏幕,则没有问题。
private void Button_Click(object sender, RoutedEventArgs e)
{
Excel.Application excel = new Excel.Application();
excel.Visible = true;
Workbook workbook = excel.Workbooks.Add(System.Reflection.Missing.Value);
Worksheet sheet1 = (Worksheet)workbook.Sheets[1];
for (int ExcelRow = 1, GridRow = 0; ExcelRow <= dgrid.Items.Count - 1;
ExcelRow++, GridRow++)
{
Range myRange = (Range)sheet1.Cells[ExcelRow, 1];
myRange.Value2 = dgrid.Columns[0].Header;
TextBlock b = dgrid.Columns[0].GetCellContent(dgrid.Items[GridRow])
as TextBlock;
Microsoft.Office.Interop.Excel.Range myRange2 =
(Microsoft.Office.Interop.Excel.Range)sheet1.Cells[2, 1];
myRange.Value2 = b.Text;
///////////////////////
myRange = (Range)sheet1.Cells[ExcelRow, 2];
myRange.Value2 = dgrid.Columns[1].Header;
b = dgrid.Columns[1].GetCellContent(dgrid.Items[GridRow]) as
TextBlock;
myRange2 = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[3, 2];
myRange.Value2 = b.Text;
/////////////////////////
myRange = (Range)sheet1.Cells[ExcelRow, 3];
myRange.Value2 = dgrid.Columns[2].Header;
b = dgrid.Columns[2].GetCellContent(dgrid.Items[GridRow]) as
TextBlock;
myRange2 = (Microsoft.Office.Interop.Excel.Range)sheet1.Cells[4, 3];
myRange.Value2 = b.Text;
}
}
【问题讨论】:
-
既然它拥有一切,为什么不直接从 DataGrid 的 DataContext / ItemsSource 中吸出数据呢?直接从 UI 控件而不是视图模型中提取它很奇怪。