【问题标题】:LocalReport to Excel本地报告到 Excel
【发布时间】:2013-12-20 19:33:47
【问题描述】:

我正在使用下面的代码将简单的报告呈现到 Excel 或 PDF,它在 PDF 中运行良好,但是在 Excel 中,如果 dtTable 的行数超过 64K,则会出现错误。我正在使用 Microsoft 发布的 ReportDefinition 以允许从 DataTable 动态创建 rdlc,可从此处获得 http://www.gotreportviewer.com/

有人知道如何设置报告生成器以将电子表格分成每 64K 行的新标签页吗?

        var localReport = new LocalReport();

        var availableFields = new List<string>();
        for (var i = 0; i < dtTable.Columns.Count; i++)
        {
            if (dtTable.Columns[i].ColumnName != "RowID")
            availableFields.Add(dtTable.Columns[i].ColumnName);
        }

        MemoryStream m_rdl = new MemoryStream();
        RdlGenerator gen = new RdlGenerator();

        gen.AllFields = availableFields;
        gen.SelectedFields = availableFields;
        gen.WriteXml(m_rdl);
        m_rdl.Position = 0;

        localReport.LoadReportDefinition(m_rdl);

        ReportDataSource reportDataSource = new ReportDataSource("MyData", dtTable);
        localReport.DataSources.Add(reportDataSource);
        string reportType = "Excel";
        string encoding;
        string fileNameExtension;
        string mimeType;

        string deviceInfo = "<DeviceInfo><OutputFormat>Excel</OutputFormat></DeviceInfo>"; Warning[] warnings; string[] streams; byte[] renderedBytes;
        renderedBytes = localReport.Render(reportType, deviceInfo, out mimeType, out encoding, out fileNameExtension, out streams, out warnings);

【问题讨论】:

    标签: c# excel reporting


    【解决方案1】:

    要将每 64K 行放置在单独的工作表中,请根据行号在报表中创建分页符。

    How to Export Data in Excel of SSRS Report if data exceeds greater than 65k
    Export to EXCEL error in SSRS 2005

    发生错误是因为报表查看器控件使用旧的 BIFF Excel 格式,每个工作表只能处理 65536 行。

    【讨论】:

    • 谢谢,看来我需要设置一个 TableGroup 并将分页符作为表达式放入。然而,似乎也有一个行分组。 rdlc 配置对我来说似乎相当复杂......
    • 我在生成器中添加了一个额外的页面,以便按照您提到的设置分页,但是我一直收到定义错误:报告定义无效。详细信息:反序列化失败:缺少必需的属性“名称”。第 204 行,第 14 位。不确定他们指的是哪一行,很可能组定义缺少某些内容,但是什么?
    【解决方案2】:

    以防万一其他人遇到相同的情况,这是我修改/添加到 TableRdlGenerator 的内容,以使其在 Excel 中输出任意数量的行。生成一个 2M 行的报告大约需要 5 分钟。

        public Rdl.TableType CreateTableExcel()
        {
            Rdl.TableType table = new Rdl.TableType();
            table.Name = "Table1";
            table.Items = new object[]
                {
                    CreateTableColumns(),
                    CreateHeader(),
                    CreateDetails(),
                    CreateTableGroups(),
                };
            table.ItemsElementName = new Rdl.ItemsChoiceType21[]
                {
                    Rdl.ItemsChoiceType21.TableColumns,
                    Rdl.ItemsChoiceType21.Header,
                    Rdl.ItemsChoiceType21.Details,
                    Rdl.ItemsChoiceType21.TableGroups,
                };
            return table;
        }
    
        private Rdl.TableGroupsType CreateTableGroups()
        {
            Rdl.TableGroupsType tableGroups = new Rdl.TableGroupsType();
            tableGroups.TableGroup = new TableGroupType[]
            {
                CreateTableGroup(),
            };
            return tableGroups;
        }
    
        private Rdl.TableGroupType CreateTableGroup()
        {
            Rdl.TableGroupType tableGroup = new TableGroupType();
            tableGroup.Items = new object[]
            {
                CreateGrouping(),
            };
            return tableGroup;
        }
    
        private Rdl.GroupingType CreateGrouping()
        {
            Rdl.GroupingType groupingType = new GroupingType();
    
            groupingType.Name = "pagebreak";
            groupingType.Items = new object[]
            {
                true,
                CreateGroupExpressions(),
            };
            groupingType.ItemsElementName = new ItemsChoiceType17[]
            {
                ItemsChoiceType17.PageBreakAtEnd,
                ItemsChoiceType17.GroupExpressions
            };
            return groupingType;
        }
    
        private Rdl.GroupExpressionsType CreateGroupExpressions()
        {
            Rdl.GroupExpressionsType groupExpressions = new GroupExpressionsType();
    
            groupExpressions.GroupExpression = new string[] { "=Int((RowNumber(Nothing)-1)/65000)" };
    
            return groupExpressions;
        }
    

    【讨论】:

      猜你喜欢
      • 2014-09-21
      • 2023-03-13
      • 1970-01-01
      • 2016-01-19
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      相关资源
      最近更新 更多