【问题标题】:StringBuilder Append replacing data- issueStringBuilder 追加替换数据问题
【发布时间】:2019-03-06 16:10:52
【问题描述】:

从一个非常大的 Excel 文件中,我们循环并将 3 列中的值存储到变量中(uName(Row)、mgrName(Row)、title(Row))。从这个excel中,我们也得到了行数。

当我尝试使用 StringBuilder 创建一个单独的 .xls 文件以供稍后在应用程序中使用时,问题就出现了。我的代码如下所示:

    Dim XLstring As System.Text.StringBuilder = New System.Text.StringBuilder
    Dim newfile As System.IO.StreamWriter
    Dim fileTitle

    XLstring.Append("Name,Manager,Title" & vbCrLf)

    For X As Integer = 2 To countrows
        If X = countrows Then
            MsgBox(countrows)
            MsgBox(uName(X) & "," & mgrName(X) & "," & title(X))
        End If

        XLstring.Append(uName(X) & "," & mgrName(X) & "," & title(X) & vbCrLf)
    Next

    fileTitle = System.DateTime.Now.ToString("yy-MM-dd hh-mm-ss") & ".xls"
    filePath2 = "myPath" & fileTitle

    newfile = File.CreateText(filePath2)
    newfile.WriteLine(XLstring)

这在大多数情况下都有效。我可以看到我正在使用 MsgBox 获取正确的行数以及最后一行中的正确信息。但是,当我打开生成的 .xls 文件时,文件末尾缺少条目。另外,如果我要改变

XLstring.Append("Name,Manager,Title" & vbCrLf)

类似

XLstring.Append("Name,Manager" & vbCrLf)

我从 Append 行中删除的确切字符数现在将成功显示在缺少信息的文件末尾。

使用这些功能是否有一些我不理解的奇怪功能?我完全迷失了,不理解这种行为。

【问题讨论】:

  • 我将其重新标记为 VB.Net,因为它不是 VBA
  • 你要关闭 newFile 来刷新它吗? .WriteAllText 更简单:docs.microsoft.com/en-us/dotnet/api/…
  • @AlexK。所以我添加了“newfile.Flush()”这行似乎有效。您认为简单地添加它会导致任何其他问题吗?

标签: excel string vb.net append stringbuilder


【解决方案1】:

完成后您需要关闭文件:

newfile.Close()

附带说明,您的文件是使用 XLS 扩展名保存的,但由于您要导出逗号分隔值列表,我建议您改为以 CSV 格式保存。

【讨论】:

  • 谢谢。这与 newfile.Flush() 一样有效,但我不确定哪一个可以直接解决我遇到的问题。我将它保存为.xls的原因是因为这个文件是用来创建visio文件的,所以它需要是这种格式
  • 很高兴我能帮上忙。不同之处在于.Flush() 将刷新缓冲区(将更改写入磁盘)但保持文件打开以便您可以继续向其追加行,而.Close() 也会关闭文件,这意味着它需要重新打开,如果你想追加更多的行。无论您多久刷新一次,都应该在完成后关闭文件。
  • 您的 StreamWriter 需要被处理掉。任何具有Dispose 方法的对象都需要被释放,因为它可能具有需要整理的非托管资源。这可以通过使用 Using 块或直接调用 dispose 来完成。
猜你喜欢
  • 2011-06-19
  • 1970-01-01
  • 2021-04-21
  • 2020-04-21
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多