为什么SSRS导出损坏的XLS文件?

我在SQL Server 2012中有一个SSRS报告,导出到Word和PDF,在各自的阅读器中打开。 但是,当我打开MS-Excel中的XLS文件,我收到消息询问是否应该修复损坏的文件。 如果我点击是,它显示一个空的文件与消息如下。 我正在使用SQL Server 2012.这只发生在某一天的数据。

Replaced Part: /xl/worksheets/sheet1.xml part with XML error. Illegal xml character. Line 14, column 6935. 

我想我必须学习这篇文章http://christianspecht.de/2014/01/14/excel-found-unreadable-content-when-exporting-a-reporting-services-report/

我有同样的问题,在我的情况下,这是数据精度的问题。 显然SSRS是不能够处理18位小数,我的程序返回这些数据的一些领域。 这可能发生在你的情况。 特定date的数据最后只能得到一个值,SSRS处理的小数位数太多。

一种select是更改表中的数据types以支持较低的精度。 其他解决scheme是转换填充报表的存储过程中的数字。

 SELECT CONVERT(NUMERIC(38,8),MyNumber) AS MyNumber_v2 

你可以在这里阅读更多关于这个bug。

我有百分比types字段类似的问题。 当数据输出中出现值0%时,报表导出到Excel生成的破损文件。 自动修复的Excel文件包含0.00000000000值而不是0.00%,如预期的那样。 DB中的初始字段数据types是DECIMAL(24,14)。 我添加CONVERT到DECIMAL(10,7)子句到查询和问题是固定的。

从SSRS 2012与Oracle数据库导出为ex​​cel(xlsx格式)时,我遇到了类似的问题。 但错误信息是“我们发现XYZ.xlsx中的某些内容存在问题,您是否希望我们尝试尽可能地恢复?如果您信任此工作簿的源,请单击”是“。 这个问题是因为其中一个领域的不可打印的特点。 通过将SQL查询更改为使用正则expression式“select column1,REGEXP_REPLACE(column2,'[^ [:print:]]','')作为来自表”的column2来解决问题。 基本上,正则expression式从列2中删除任何不可打印的字符。

我以excel格式输出时遇到过同样的情况。 在我的情况下,通过密切关注的报告输出,我发现输出中有非ASCII字符。 我删除了非ASCII字符,之后,Excel导出工作正常。 我通过使用下面的函数从包含列删除非ASCII字符。

 CREATE FUNCTION fnc_RemoveNonASCII ( @nstring nvarchar(255) ) RETURNS varchar(255) AS BEGIN DECLARE @Result varchar(255) SET @Result = '' DECLARE @nchar nvarchar(1) DECLARE @position int SET @position = 1 WHILE @position <= LEN(@nstring) BEGIN SET @nchar = SUBSTRING(@nstring, @position, 1) --Unicode & ASCII are the same from 1 to 255. --Only Unicode goes beyond 255 --0 to 31 are non-printable characters IF UNICODE(@nchar) between 32 and 255 SET @Result = @Result + @nchar SET @position = @position + 1 END RETURN @Result END GO 

检出报表devise中的单元格(或列标题)字体(在报表生成器中)。 也许其中一个在你的机器上不存在!