从r#导出rdl报告到多张excel文件有问题

时间:2013-04-24 11:42:52

标签: c# excel export export-to-excel rdlc

我一直在网上寻找解决方案,但到目前为止还没有运气。

在我正在开发的当前应用程序中,我需要将可能很大的rdlc报告导出到excel文件(以及其他格式)

这是我用来实现这一目的的代码,它在正常大小的报告中非常有效:

private static void ExportToExcel(LocalReport localReport, string filename)
{
  if (File.Exists(filename))
  { 
    File.Delete(filename);
  }

  var bytes = localReport.Render("Excel", string.Empty);
  using (var stream = File.Create(filename))
  {
    stream.Write(bytes, 0, bytes.Length);
  }
}

非常简单,但是当我尝试导出大型报告时,我得到类似于以下内容的异常: “Excel渲染扩展:行数超过此版本工作表中可能的最大行数。请求的行数:152190。最大行数:65536。”

所以这是我的问题: 有没有办法告诉出口商在达到最大行数时创建一个新的工作表?那是什么意思呢?

3 个答案:

答案 0 :(得分:2)

我遇到了类似的问题,并认为我会在这里添加我的经验。由于没有提到SSRS的版本,问题仍然没有答案,我认为这是一个好地方。我编写了一个PowerShell脚本,将SSRS 2012 rdl报告导出为各种格式,一种是Excel。我也收到了以下错误:

  

异常调用"呈现"用" 7"参数:" Excel渲染扩展:行数超过此版本工作表中可能的最大值。   请求的行数:65587。最大行数:65536。(rrRenderingError)"

SSRS 2012确实从Excel导出中删除了65536行限制,但我很难找到如何以编程方式超过此行限制。经过一番搜索,我遇到了http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/,帮助我解决了问题。参数值" Excel"需要更改为" EXCELOPENXML"

var bytes = localReport.Render("EXCELOPENXML", string.Empty);

同样,这对早期版本的SSRS没有帮助,但我希望为SSRS 2012提供更多可见性。

答案 1 :(得分:1)

不确定您使用的是哪个版本的Excel,但是65,536行是.xls文件的限制。如果您创建一个.xlsx文件,那么最多只有1,048,576行(​​来自here),这应该满足您的要求。

编辑:虽然我最近自己使用了本机Excel对象,但显然EPPlus将允许您更轻松地创建XLSX文件。

HTH, ž

如要求:

xl.Application myExcelApp;
xl.Workbooks myExcelWorkbooks;
xl.Workbook myExcelWorkbook;
xl.Worksheet myExcelWorksheet;

myExcelApp = new xl.Application();
myExcelApp.DisplayAlerts = false;
myExcelApp.Visible = false;
myExcelWorkbooks = myExcelApp.Workbooks;

String fileName = @"G:/foo/bar/goleafsgo.xlsx"; // set this to the file you want
myExcelWorkbook = myExcelWorkbooks.Add(misValue);
myExcelWorksheet = (xl.Worksheet)myExcelWorkbook.Worksheets.get_Item(1);

Recordset rs = ConvertToRecordset(dt);

ws.get_Range("A3", System.Reflection.Missing.Value).CopyFromRecordset(rs);

myExcelWorkbook.SaveAs(fileName, xl.XlFileFormat.xlWorkbookDefault, misValue, misValue, false, false, xl.XlSaveAsAccessMode.xlNoChange, misValue, misValue, misValue, misValue, misValue);
myExcelApp.Quit();

可以找到ConvertToRecordset函数here

答案 2 :(得分:1)

我知道这是一个老问题,但您可以在.rdl文件中添加分页符。这些导致导出在Excel中启动新工作表。您可以使用.rdl中的公式来确定何时需要动态地进行其他分页。