vb.net to import text file into excel delimited by spaces

4.6k views Asked by At

was wondering if anyone has an example vb code to import a text file into excel delimited by spaces - regardless of number of spaces. In the text file there are for example 100k lines and in each line, each word can be separated by one, two or three etc spaces.

the result of the import into excel is that each line from the text file is in each row, and each word from each line separated by spaces are in each column of that row.

I tried to accomplish this by reading each line in the text file and then to parse each word for each line, and put these into a variable and then write it to excel. I think this way takes longer, and I am in the middle of parsing each line. But I think importing the text file into excel delimited by spaces is quicker if this can be done. The reason I use vb instead of vba is because vb can create an executable file which can be run by scheduler. Thanks

Dim reader As New System.IO.StreamReader("C:\test.txt")
Dim allLines As List(Of String) = New List(Of String)
Dim stringreader As String
Dim a As String
    stringreader = filereader.ReadLine()

    Do While Not reader.EndOfStream
      allLines.Add(reader.ReadLine())
      stringreader = reader.ReadLine()
      MsgBox("The first line of the file is                " & stringreader)
    Loop
1

There are 1 answers

4
gembird On BEST ANSWER

In this example StreamReader and Excel are opened first. Then new Workbook and new Worksheet are added. Finally the text file is read line by line. Each line is split on spaces and written to Excel Worksheet. After the text file was processed the Stream is closed and the Excel with the results remains opened. HTH

Install Office Primary Interop Assemblies for your version of Excel.

(Example uses reference to Ecel 2007 PIA: C:\Windows\assembly\GAC\Microsoft.Office.Interop.Excel\12.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll)

Imports System.IO
Imports ExcelInterop = Microsoft.Office.Interop.Excel

Module Module2
   Sub Main()
        Dim reader As StreamReader = New StreamReader("C:\test.txt")
        Dim targetWorksheet As ExcelInterop.Worksheet = GetTargetWorksheet("c:\test.xls")
        if targetWorksheet Is Nothing Then
            Exit Sub
        End If
        Try
            Dim line As String
            Dim lineIndex As Long = 1
            Do While reader.Peek() >= 0
                line = reader.ReadLine()
                WriteToExcel(line, targetWorksheet, lineIndex)
                lineIndex += 1 
            Loop
        Catch ex As Exception
            Debug.WriteLine("The file could not be read:")
            Debug.WriteLine(ex.Message)
        finally
            If Not reader Is Nothing Then
                reader.Close()
            End If
        End Try
    End Sub

   Private Sub WriteToExcel(line As String, targetWorksheet As ExcelInterop.Worksheet, lineIndex As Long)
        Dim column As Integer = 1
        For Each part As String In line.Split(" ")
            targetWorksheet.Cells(lineIndex, column).Value =part
            column += 1
       Next
   End Sub

    Private Function GetTargetWorksheet(targetPath As String) As ExcelInterop.Worksheet
        Try
            Dim excelApplication = New ExcelInterop.Application
            excelApplication.Visible = True
            Dim excelWorkbook As ExcelInterop.Workbook
            excelWorkbook = excelApplication.Workbooks.Add()
            excelWorkbook.SaveAs(targetPath)
            Dim excelWorksheet As ExcelInterop.Worksheet = excelWorkbook.Worksheets.Add()
            excelWorksheet.Name = "Import"
            return excelWorksheet
        Catch ex As Exception
            Debug.WriteLine("The excel worksheet could not be created:")
            Debug.WriteLine(ex.Message)
        End Try
        Return Nothing
    End Function
End Module

EDIT:

It is possible to use QueryTables of Excel to import text data. There are some settings to consider, like TextFileColumnDataTypes. Here in this example all the columns are set to xlColumnDataType.xlTextFormat.

Sub Main()
    Dim targetWorksheet As Worksheet = GetTargetWorksheet("c:\test.xls")
    if targetWorksheet Is Nothing Then
        Debug.WriteLine("Target sheet is Nothing.")
        Exit Sub
    End If

    Try
        Dim qt As QueryTable
        qt = targetWorksheet.QueryTables.Add( _
        Connection:="TEXT;C:\test.txt", _
        Destination:=targetWorksheet.Range("$A$1"))

        With qt
            .Name = "Import"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = XlCellInsertionMode.xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 1252
            .TextFileStartRow = 1
            .TextFileParseType = XlTextParsingType.xlDelimited
            .TextFileTextQualifier = XlTextQualifier.xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = True
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = False
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = True
            .TextFileColumnDataTypes = GetColumnDataTypes(targetWorksheet.Columns.Count)
            .TextFileTrailingMinusNumbers = True
            .Refresh(BackgroundQuery := False)
        End With
        
    Catch ex As Exception
        Debug.WriteLine("The file could not be read:")
        Debug.WriteLine(ex.Message)
    End Try
End Sub

Private Function GetColumnDataTypes(queryTableColumnsCount As long) As Object
    Dim textDataTypes As xlColumnDataType()
    textDataTypes = Enumerable.Repeat(xlColumnDataType.xlTextFormat, queryTableColumnsCount).ToArray()
    Return textDataTypes          
End Function