Index: trac/ticket/report.py
===================================================================
--- trac/ticket/report.py	(revision 10171)
+++ trac/ticket/report.py	(working copy)
@@ -39,6 +39,7 @@
                             add_stylesheet, add_warning, \
                             INavigationContributor, Chrome
 from trac.wiki import IWikiSyntaxProvider, WikiParser
+from trac.wiki.formatter import format_to_plaintext
 
 
 def cell_value(v):
@@ -726,7 +727,11 @@
         def iso_datetime(dt):
             return format_datetime(from_utimestamp(dt), 'iso8601')
 
+        def plaintext(s):
+            return format_to_plaintext(self.env, Context.from_request(req), s)
+
         col_conversions = {
+            'description': plaintext,
             'time': iso_time,
             'datetime': iso_datetime,
             'changetime': iso_datetime,
Index: trac/ticket/query.py
===================================================================
--- trac/ticket/query.py	(revision 10171)
+++ trac/ticket/query.py	(working copy)
@@ -44,7 +44,9 @@
 
 from trac.wiki.api import IWikiSyntaxProvider
 from trac.wiki.macros import WikiMacroBase # TODO: should be moved in .api
+from trac.wiki.formatter import format_to_plaintext
 
+
 class QuerySyntaxError(TracError):
     """Exception raised when a ticket query cannot be parsed from a string."""
 
@@ -1099,6 +1101,10 @@
     def export_csv(self, req, query, sep=',', mimetype='text/plain'):
         content = StringIO()
         cols = query.get_columns()
+
+        if 'description' in query.rows:
+            query.cols.insert(2, 'description')
+
         writer = csv.writer(content, delimiter=sep, quoting=csv.QUOTE_MINIMAL)
         writer.writerow([unicode(c).encode('utf-8') for c in cols])
 
@@ -1115,6 +1121,8 @@
                                                                value)
                     elif col in query.time_fields:
                         value = format_datetime(value, tzinfo=req.tz)
+                    elif col == 'description':
+                        value = format_to_plaintext(self.env, context, value)
                     values.append(unicode(value).encode('utf-8'))
                 writer.writerow(values)
         return (content.getvalue(), '%s;charset=utf-8' % mimetype)
Index: trac/wiki/formatter.py
===================================================================
--- trac/wiki/formatter.py	(revision 10171)
+++ trac/wiki/formatter.py	(working copy)
@@ -42,7 +42,7 @@
 
 __all__ = ['wiki_to_html', 'wiki_to_oneliner', 'wiki_to_outline',
            'Formatter', 'format_to', 'format_to_html', 'format_to_oneliner',
-           'extract_link']
+           'format_to_plaintext', 'extract_link']
 
 
 def system_message(msg, text=None):
@@ -1503,6 +1503,10 @@
         shorten = context.get_hint('shorten_lines', False)
     return InlineHtmlFormatter(env, context, wikidom).generate(shorten)
 
+def format_to_plaintext(env, context, wikidom):
+    html = format_to_html(env, context, wikidom)
+    return plaintext(html)[1:-2]
+
 def extract_link(env, context, wikidom):
     if not wikidom:
         return Markup()

