2014-08-30 55 views
0

我想知道是否可以为'export als xls'使用不同的布局。其原因是,看起来不错(即可见的raport,pdf和word)有时与excel中的实用性非常不同。我试过看文档,无济于事。有任何想法吗?C#ReportViewer - xls的不同布局

回答

0

我同意出口。由于Excel或Word除了具有明确位置的“对象”以外没有其他任何东西,并且没有任何实际的工作可行实际上,我在导出操作中编写了自己的钩子,以便从报告上下文中获取数据并直接以我想要的格式转储它。

现在请注意......我在这里是从我的主要报告管理器的代码片段。我的所有报告都是从中派生出来的,因此我不必一遍又一遍地编写相同的报告预览框架。在我的班级中,我有一个虚拟方法GenerateData(),每个子类型的报告都会自己查询数据库,准备数据表,然后将数据表添加到主报表上的“DataSet”并让报表继续。

导出选项也是一个虚拟函数,每个子类型的报表都知道它自己的数据表是什么,并且可能对导出的列有一些限制,然后调用方法TableToCSV()进行最终导出。

希望这给你一些你的需求的想法。

// hook for when exporting is done. 
reportViewer.ReportExport += reportViewer_ReportExport; 


void reportViewer_ReportExport(object sender, ReportExportEventArgs e) 
{ 
    // Prepare an Export path for the user's desktop 
    exportPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) 
      + "\\SomeExportPath\\"; 

    // In case multiple exports, time-stamp the file name too 
    timeMark = DateTime.Now.ToString("yyyyMMddTHHmmss"); 

    if (sender != null) 
    { 
     switch(e.Extension.Name) 
     { 
      case "Excel": 
       ExportForExcel(); 
       e.Cancel = true; 
       Messagebox("Exported Excel(CSV) to your desktop in the \r\n" 
         + "folder 'SomeExportPath\\SomeFile.csv'"); 
       break; 
     } 
    } 
} 

protected virtual void ExportForExcel() 
{} 

protected void TableToCSV(DataTable dt, string FinalFileName) 
{ 
    StringBuilder sb = new StringBuilder(); 
    IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName); 
    sb.AppendLine(string.Join(",", columnNames)); 

    foreach (DataRow row in dt.Rows) 
    { 
     IEnumerable<string> fields = row.ItemArray.Select(field => 
      string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\"")); 
     sb.AppendLine(string.Join(",", fields)); 
    } 
    File.WriteAllText(exportPath + FinalFileName + ".csv", sb.ToString()); 

}