vb.net для импорта текстового файла в excel, разделенного пробелами

было интересно, есть ли у кого-нибудь пример кода vb для импорта текстового файла в excel, разделенного пробелами, независимо от количества пробелов. В текстовом файле, например, 100 тысяч строк, и в каждой строке каждое слово может быть разделено одним, двумя или тремя пробелами и т. д.

результатом импорта в excel является то, что каждая строка из текстового файла находится в каждой строке, а каждое слово из каждой строки, разделенное пробелами, находится в каждом столбце этой строки.

Я попытался сделать это, прочитав каждую строку в текстовом файле, а затем проанализировав каждое слово для каждой строки, поместив их в переменную, а затем записав ее в Excel. Я думаю, что этот способ занимает больше времени, и я сейчас разбираю каждую строку. Но я думаю, что импорт текстового файла в excel, разделенный пробелами, будет быстрее, если это можно сделать. Причина, по которой я использую vb вместо vba, заключается в том, что vb может создавать исполняемый файл, который может запускаться планировщиком. Спасибо

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

person Johnseito    schedule 23.12.2016    source источник


Ответы (1)


В этом примере StreamReader и Excel открываются первыми. Затем добавляются новые Workbook и новые Worksheet. Наконец, текстовый файл читается построчно. Каждая строка разбивается на пробелы и записывается в Excel Worksheet. После обработки текстового файла Stream закрывается, а Excel с результатами остается открытым. ХТН

Установите основные сборки взаимодействия Office для вашей версии Excel.

(В примере используется ссылка на 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

РЕДАКТИРОВАТЬ:

Можно использовать QueryTables из Excel для импорта текстовых данных. Есть некоторые настройки, которые следует учитывать, например TextFileColumnDataTypes. Здесь, в этом примере, все столбцы установлены на 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
person Daniel Dušek    schedule 23.12.2016
comment
Привет Ди, спасибо за пример кода. Он выглядит очень хорошо и отлично работает. Единственное, что в строке из строки в текстовом файле пробелы между каждым словом могут быть непредсказуемыми, в нем может быть 1, 2, 3 или много пробелов. Поэтому я провел поиск в Интернете, чтобы найти код, который удаляет лишние пробелы и добавляет его в вашу функцию writetoexcel, и он работает как шарм. так что теперь пробелы не записываются в столбец excel, если есть лишние пробелы. - person Johnseito; 24.12.2016
comment
Во всяком случае, с отличным кодом и всем благодаря вам, мне было интересно, есть ли в vb возможность импортировать текстовый файл в excel, а не читать каждую строку за строкой и записывать каждую строку за строкой, чтобы преуспеть. Импорт, я думаю, намного быстрее, если, например, для большого файла с 500 тыс. строк, если vb не может этого сделать, это тоже нормально. Еще раз спасибо за отличный код! :) - person Johnseito; 24.12.2016
comment
Добро пожаловать, я рад, что это помогло! :). См. отредактированный ответ, чтобы узнать о других собственных возможностях Excel для импорта текстовых данных в Excel. - person Daniel Dušek; 24.12.2016
comment
Еще раз спасибо Ди за замечательные и удивительные коды. Я думаю, что отредактированная часть - это VBA, и для ее запуска требуется Excel. Было интересно, есть ли версия vb.net без входа в vba и excel. Если нет, то хорошо. Я просто подумал, что остановлюсь на VBA и вместо этого изучу vb.net. Ваше здоровье ! - person Johnseito; 25.12.2016
comment
Пожалуйста! См. отредактированный ответ, где код VBA был преобразован в код VB.NET. Это выглядит почти так же, как VBA. Изучить VB.NET — хорошая идея! Не ждите, просто начните с VB.NET сегодня... или хотя бы завтра :). - person Daniel Dušek; 25.12.2016