【问题标题】:vb.net to import text file into excel delimited by spacesvb.net 将文本文件导入以空格分隔的 excel
【发布时间】:2016-12-23 17:10:26
【问题描述】:

想知道是否有人有示例 vb 代码将文本文件导入到由空格分隔的 excel 中 - 无论空格数量如何。在文本文件中,例如有 100k 行,在每行中,每个单词可以用一个、两个或三个等空格分隔。

导入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

【问题讨论】:

    标签: vb.net import stream text-files readlines


    【解决方案1】:

    在本例中,StreamReaderExcel 首先打开。然后添加新的Workbook 和新的Worksheet。最后逐行读取文本文件。每行以空格分隔并写入Excel Worksheet。处理完文本文件后,Stream 将关闭,而带有结果的Excel 将保持打开状态。高温

    为您的 Excel 版本安装 Office 主互操作程序集。

    (示例使用对 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
    

    编辑:

    可以使用ExcelQueryTables 来导入文本数据。有一些设置需要考虑,例如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
    

    【讨论】:

    • 您好,感谢您的代码示例。它看起来非常好并且工作完美。唯一的问题是,在文本文件中一行的字符串中,每个单词之间的空格是不可预测的,它可以有 1、2、3 个或更多空格。因此,我在互联网上进行了搜索,以找到删除多余空格并添加到您的 writetoexcel 函数的代码,它就像一个魅力。因此,如果有多余的空格,现在空格不会写入 excel 列。
    • 无论如何,代码很棒,多亏了你,我想知道vb是否有能力将文本文件导入excel,而不是逐行读取并逐行写入脱颖而出。导入,我认为例如对于具有 500k 行的大文件,如果 vb 不能这样做,那也可以。再次感谢伟大的代码! :)
    • 不客气,我很高兴它有帮助! :)。有关将文本数据导入 excel 的其他 excel 原生可能性,请参阅编辑后的答案。
    • 再次感谢 dee 提供的精彩绝伦的代码。我认为编辑的部分是 VBA 并且需要 excel 来运行它。想知道是否有没有进入 vba 和 excel 的 vb.net 版本。如果不是那很好。我只是以为我停止使用 VBA 并改为学习 vb.net。干杯!
    • 不客气!请参阅已编辑的答案,其中 VBA 代码已转换为 VB.NET 代码。它看起来与 VBA 几乎相同。学习VB.NET是个好主意!别等了,今天就从 VB.NET 开始……或者至少明天 :)。
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多