Here's a suggestion. You have data object T which has properties that are defined in a certain order, but you want the columns in your table displayed in a different order. Create another object class called Display_Of_T where you define the properties in
the order you want them to be displayed. In this object class you have a constructor that takes object T and creates a new object Display_Of_T and copies the property values from T to the property values of Display_Of_T. The object class can also have a method
that takes List<T> as the argument and returns List<Display_Of_T>. Now your application code does insertTable(List<Display_Of_T>, true) to insert the records into the worksheet.
ClosedXML will now use the properties of Display_Of_T to define the column order. I still get a thrill whenever I do insertTable and there -- as if by magic -- is all my data with column headings and colors and everything else I might want. It's so great.
If you want to get fancy, you can define data attributes (also known as data annotations) to set your column heading names which can be different from the property name. See this link, http://msdn.microsoft.com/en-us/library/dd901590(v=vs.95).aspx
This kind of programming practice is known as "Separation of Concerns". The format in which the data is stored or constructed shouldn't dictate the format by which the data is viewed. In C# and other object oriented languages one of the ways to implement
Separation of Concerns is to define separate objects for data storage and for data display along with defining the mappings between the objects.
Have fun coding.