Thank you for all the trouble.
There is just one issue left.
It now create only the visible columns, using the visible columns headers. : Correct
It skips the hidden fields, but it leaves a open column in Excel.
That has to be a integer counting, and I will go look for it tomorrow!

This really made my day.
-Peter
What in blazes is an "open column"??!?!?!
EDIT: Ah, i see it
here it is
for col := 0 to DBGrid1.Columns.Count-1 do
begin
if DBGrid1.Columns[col].Visible then //only visible columns
begin
cell := worksheet.WriteText(0, col, DBGrid1.Columns[col].Title.Caption); //grid columne title
worksheet.WriteFontStyle(cell, [fssBold]);
end;
end;
You are still running through all (!!) Columns of the Grid, and writing directly to the corresponding Column in your worksheet.
So, yeah: You skip the invisible columns of your grid, but you also skip the corresponding column in your Worksheet
You need two "Col"-Variables. one for the Grid, one for the Target-Worksheet
Change the For/Next-Loop to a Repeat/Until or a Do/While-Loop. You'd have to increase the Col-Counter for The Target-Worksheet yourself everytime you find a "visible" column
NOTE: This is just the Code-Snippet for the Column-Headers.
I haven't looked through the whole code, but i'd bet, there is a second loop transferring the actual Data.
You'd have to change that one accordingly