Two approaches that you could take:
You could use a templating engine; for each report, provide two templates - one that generates html and one that generates plain text. Lots of customisability, but every time you make a change to the report you're going to have to change both templates.
The alternative is to make use of a markup format that's designed to be converted into several formats. As an example, the reStructuredText format is designed to be human-readable as plain text, but also easy to convert into HTML (or latex, or pdf, or ...) and produce good-looking well laid-out documents.
The latter is how Python's documentation is written - it's written in rST and converted into HTML and other formats via Sphinx. You can see the raw text for any page of the
Python docs by clicking the "Show Source" link - for instance, http://docs.python.org/3/_sources/library/constants.txt is the source for http://docs.python.org/3/library/constants.html#constants-added-by-the-site-module
You might still need to use a template engine to generate the rST form of your report, but hopefully that gives you a plain-text version immediately, and then that plain-text version can be processed to give HTML and whatever other rich formats you need. This way, you'd only need to write one template, but that one template would be able to produce reports in many formats.