Forum Discussion
Alvaro
4 days agoNew Contributor III
Hello , this code was useful for me and get the same purpose:
Namespace OneStream.BusinessRule.Extender.Test_ExportTabletoCSV
Public Class MainClass
Public Function Main(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As ExtenderArgs) As Object
Dim extender As New MainClass()
Try
Dim strSQL As String = "SELECT * FROM TableName"
Dim dt As DataTable
Using dbConnApp As DBConnInfo = BRApi.Database.CreateApplicationDbConnInfo(si)
dt = BRApi.Database.ExecuteSqlUsingReader(dbConnApp, strSQL, True)
End Using
If dt Is Nothing OrElse dt.Rows.Count = 0 Then
BRApi.ErrorLog.LogMessage(si, "⚠️ La consulta no devolvió filas.")
Return "No hay datos para exportar."
End If
Dim fileName As String = "ExportTablaTest.csv"
Dim filePathOS As String = $"Documents\Public\{fileName}"
BRApi.ErrorLog.LogMessage(si, "[DEBUG] Generando CSV...")
Dim csvContent As String = DataTableToCSV(dt, ";")
Dim utf8WithBom As New System.Text.UTF8Encoding(True)
Dim bytes() As Byte = utf8WithBom.GetBytes(csvContent)
BRApi.ErrorLog.LogMessage(si, $"[DEBUG] CSV generado. Bytes: {bytes.Length}")
Dim fileInfo As New XFFileInfo(fileSystemLocation.ApplicationDatabase, filePathOS)
Dim xfFile As New XFFile(fileInfo, String.Empty, bytes)
BRApi.ErrorLog.LogMessage(si, "[DEBUG] Intentando guardar archivo...")
BRApi.FileSystem.InsertOrUpdateFile(si, xfFile)
Return $"✅ Exportación completada: {filePathOS}"
Catch ex As Exception
BRApi.ErrorLog.LogMessage(si, "❌ Error al guardar CSV: " & ex.ToString())
Return $"❌ Error: {ex.Message}"
End Try
End Function
' Convierte el DataTable a texto CSV
Public Function DataTableToCSV(dt As DataTable, Optional separator As String = ";") As String
Dim sb As New StringBuilder()
' --- Cabecera ---
For i As Integer = 0 To dt.Columns.Count - 1
Dim colName As String = EscapeCsvValue(dt.Columns(i).ColumnName)
sb.Append(colName)
If i < dt.Columns.Count - 1 Then sb.Append(separator)
Next
sb.AppendLine()
' --- Filas ---
For Each row As DataRow In dt.Rows
For i As Integer = 0 To dt.Columns.Count - 1
Dim value As String = EscapeCsvValue(row(i).ToString())
sb.Append(value)
If i < dt.Columns.Count - 1 Then sb.Append(separator)
Next
sb.AppendLine()
Next
Return sb.ToString()
End Function
' --- Función auxiliar que asegura formato CSV válido ---
Private Function EscapeCsvValue(value As String) As String
If value Is Nothing Then value = ""
' Si contiene separadores, comillas, saltos de línea o guiones, se encierra entre comillas
Dim needsQuotes As Boolean = value.Contains("""") OrElse
value.Contains(";") OrElse
value.Contains(",") OrElse
value.Contains(vbCr) OrElse
value.Contains(vbLf) OrElse
value.Contains("-")
' Escapa las comillas internas duplicándolas (" → "")
value = value.Replace("""", """""")
If needsQuotes Then
Return $"""{value}"""
Else
Return value
End If
End Function
End Class
End Namespace
Related Content
- 7 months ago
- 3 years ago
- 3 months ago