Microsoft’s SQL Server Reporting Services supports rendering of HTML tags, but for some reason that support stuck in 1990s – only very limited set is supported. And even using that set is problematic.
Case in point – ordered list. While officially supported – the way it is rendered is the stuff nightmares are made off. Jumble of original tags generously intermixed with DIVs and SPANs – it’s a wonder it renders at all.
And sometimes it doesn’t. If you try to view a report in Internet Explorer (especially from older, but still actively used versions of SSRS like 2008) numbering get screwed.
Let’s say you have following HTML in your report field (e.g. expression in a Text field):
<ol> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ol>
You would expect this to render as
1. Item 1 2. Item 2 3. Item 3
Well, surprise. Due to convoluted rendering in IE the above may show as
1. Item 1 1. Item 2 1. Item 3
And since it’s mixed pile of tags – at this point there’s nothing you can to rendered HTML.
Fortunately you can intercept the problem at the bud. SSRS allows you to create custom function, by writing Visual Basic code. This gives us a chance to transform ordered list markup in something simple that SSRS won’t choke on. Consider the following:
Public Function UnList(str As String, Level as Integer) Dim I as Integer = str.ToUpper.IndexOf("<LI>") If I = -1 Return str Else Return str.Substring(0, I) & UnList(Level.ToString() & ". " & str.substring(I+4), Level + 1) End If End Function Function DeList(str As String) Return UnList(str.Replace("<OL>", "<DIV>").Replace("<ol>", "<div>").Replace("</OL>", "</DIV>").Replace("</ol>", "</div>").Replace("</li>", "<br/>").Replace("</LI>", "<BR/>"), 1) End Function
Here main function DeList
accepts our initial HTML as a parameter. It replaces <OL> tag with DIV wrapper and replaces </LI> tag with line break. Then it recursively calls helper function UnList
that via series of recursive calls replaces starting <LI> tag with numeric sequence. If we pass our example HTML to this – it will become
<div> 1. Item 1<br/> 2. Item 2<br/> 3. Item 3<br/> </div>
Which even SSRS will always render correctly.
Note that this solution assumes there’s only one ordered list in your field of data, for multiple ones more advanced one will be needed.