I have a function called "GuardarAExcel2()" which uses a step datawindow called "d_filafichero". With this function you generate an excel with the same visual aspect as your datawindow. I hope it helps you:
I did the translation of my comments, I hope you understand. I'm sorry for my English.
Example of use:
GuardarAExcel2( dw_1, "c:\Report.xls")
GuardarAExcel2( dw_1, "c:\Report.html")


// This function activates CSS in the datawindow to export in Excel format,
// doing this will maintain the visual appearance of the dw in excel.
// ***********
// TO CONSIDER
// ***********
// - If there are overlapping column or compute type controls (one above the other),
// the SaveAs will only record the one above it. Use the setPosition() function if possible:
// > Example: dw.setPosition( 'campo_t', 'header', true )
// - The objects must be in the Layer: Band
// - HELP to apply special formats:
// > http://codesnipers.com/?q=excel-compatible-html
// > https://stigmortenmyre.no/mso/html/excel/xlconformulas.htm
String ls_GenerateCSS
String ls_Border
String ls_NoWrap
String ls_Fila
String ls_Valor
String ls_Temp
String ls_CabeceraHTML
String ls_PieHTML
String ls_NumToStr
Long i
Long ll_TRow
Long ll_Pos
Long ll_PosIni
Long ll_PosFin
Long ll_Row
Long ll_Temp
Boolean lb_Actualizar
ls_CabeceraHTML = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">'
ls_PieHTML = '</html>'
ls_NumToStr = 'x:str'
// Save current CSS datawindow format
ls_GenerateCSS = dwDatos.Describe("DataWindow.HTMLTable.GenerateCSS")
ls_Border = dwDatos.Describe("DataWindow.HTMLTable.border")
ls_NoWrap = dwDatos.Describe("DataWindow.HTMLTable.nowrap")
// Apply CSS format to datawindow
dwDatos.Modify("DataWindow.HTMLTable.GenerateCSS='1'")
dwDatos.Modify("DataWindow.HTMLTable.border='0'")
dwDatos.Modify("DataWindow.HTMLTable.nowrap='1'")
// Save the .xls file
dwDatos.SaveAs( spRuta, HTMLTable!, TRUE )
// Import the .xls file to "d_FilaFichero"
ds_datastore dsHTML
dsHTML = CREATE ds_datastore
dsHTML.DataObject = "d_FilaFichero"
dsHTML.ImportFile( Text!, spRuta )
// Process line by line for:
// - Add in the header: <!DOCTYPE html>
// - Replace "{;" by "{"
// - If there is "visibility:hidden" replacing its value with spaces, excel does not support this and displays it
// Example: Original: <TD NOWRAP CLASS=htmldw9C370 Style='visibility:hidden;'>0202002003</TD>
// Replaced: <TD NOWRAP CLASS=htmldw9C370 Style='visibility:hidden;'> </TD>
// - Number solution in parentheses, excel converts to negative number.
// - Keep the leading zeros to the left, Excel them to convete numbers.
// - Remove references to images that are not included:
// Example: Original: <TD NOWRAP CLASS=htmldw152FC><IMG SRC="" border="0" CLASS=htmldw152FC onClick="{return htmldw.itemClicked(0,-1,'compute_11',0,-1);}" ></TD>
// Replaced: <TD NOWRAP CLASS=htmldw152FC></TD>
// - Prevent text with / convert to date
dsHTML.InsertRow(1)
dsHTML.setItem( 1, 'fila', ls_CabeceraHTML )
dsHTML.InsertRow(0)
ll_TRow = dsHTML.RowCount()
dsHTML.setItem( ll_TRow, 'fila', ls_PieHTML )
For i = 1 to ll_TRow
lb_Actualizar = False
ls_Fila = dsHTML.getItemString( i, 'fila' )
// Activation of CSS that is disabled by default
If Pos( ls_Fila, '{;' ) > 0 Then
ls_Fila = f_global_replace( ls_Fila, '{;', '{' )
lb_Actualizar = True
End If
// Visibility
If Pos( ls_Fila, 'visibility:hidden' ) > 0 or Pos( ls_Fila, 'visibility: hidden' ) > 0 Then
ll_PosIni = Pos( ls_Fila, '>' )
ll_PosFin = Pos( ls_Fila, '</' )
If ll_PosIni > 0 and ll_PosFin > 0 Then
ls_Valor = Mid( ls_Fila, ll_PosIni + 1, (ll_PosFin - ll_PosIni) - 1 )
If Len( Trim( ls_Valor ) ) > 0 Then
ls_Fila = f_global_replace( ls_Fila, ls_Valor, Space( Len( ls_Valor ) ) )
lb_Actualizar = True
End If
End If
End If
// Number solution in parentheses, excel converts to negative number.
ll_PosIni = Pos( ls_Fila, '>(' )
ll_PosFin = Pos( ls_Fila, ')</' )
If ll_PosIni > 0 and ll_PosFin > 0 Then
ls_Valor = Mid( ls_Fila, ll_PosIni + 2, (ll_PosFin - ll_PosIni) - 2 )
If isNumber( ls_Valor ) Then
ls_Fila = f_global_replace( ls_Fila, ">(", "> (" )
lb_Actualizar = True
End If
End If
// Apply formatting to keep leading zeros
ll_PosIni = Pos( ls_Fila, '>0' )
ll_PosFin = Pos( ls_Fila, '</' )
If ll_PosIni > 0 and ll_PosFin > 0 Then
ls_Valor = Mid( ls_Fila, ll_PosIni + 1, (ll_PosFin - ll_PosIni) - 1 )
If isNumber( ls_Valor ) Then
If Dec( ls_Valor ) > 0 Then
ls_Fila = f_global_replace( ls_Fila, ">0", " " + ls_NumToStr + ">0" )
lb_Actualizar = True
End If
End If
End If
// Remove reference to images that are not included:
ll_PosIni = Pos( ls_Fila, '<IMG SRC=""' )
ll_PosFin = Pos( ls_Fila, '</' )
If ll_PosIni > 0 and ll_PosFin > 0 Then
ls_Valor = Mid( ls_Fila, ll_PosIni, (ll_PosFin - ll_PosIni) )
If Len( Trim( ls_Valor ) ) > 0 Then
ls_Fila = f_global_replace( ls_Fila, ls_Valor, "" )
lb_Actualizar = True
End If
End If
// Prevent text with / convert to date
ll_PosIni = Pos( ls_Fila, '>' )
ll_PosFin = Pos( ls_Fila, '</' )
If ll_PosIni > 0 and ll_PosFin > 0 Then
ls_Valor = Mid( ls_Fila, ll_PosIni + 1, (ll_PosFin - ll_PosIni) - 1 )
If f_cuenta_char( ls_Valor, '/' ) = 1 Then
ls_Fila = f_global_replace( ls_Fila, ">"+ls_Valor, " " + ls_NumToStr + ">"+ls_Valor )
lb_Actualizar = True
End If
End If
If lb_Actualizar Then
dsHTML.setItem( i, 'fila', ls_Fila )
End If
Next
// Save the "d_FilaFichero" as Txt with .xls extension
dsHTML.SaveAs( spRuta, Text!, FALSE )
// Restore the original CSS datawindow format
dwDatos.Modify("DataWindow.HTMLTable.GenerateCSS='" + ls_GenerateCSS + "'")
dwDatos.Modify("DataWindow.HTMLTable.border='" + ls_Border + "'")
dwDatos.Modify("DataWindow.HTMLTable.nowrap='" + ls_NoWrap + "'")
DESTROY dsHTML
Return