none
請問各位大大 datagridview匯出CSV,中文亂碼該如何解? 謝謝 RRS feed

  • 問題

  • 請問各位大大 

    datagridview匯出CSV,中文亂碼該如何解? 謝謝

     Sub te()
            If DataGridView1.RowCount = 0 Then
                MessageBox.Show("the datagridview is emptly")
            Else
                If Directory.Exists("C:\Pos") = False Then
                    Directory.CreateDirectory("C:\Pos")
                End If
                Dim sFile As String = "C:\Pos\上傳及列印折讓證明單主檔.csv"
                Dim count As Integer = 1
    
                Dim fileNameOnly As String = Path.GetFileNameWithoutExtension(sFile)
                Dim extension As String = Path.GetExtension(sFile)
                Dim path__1 As String = Path.GetDirectoryName(sFile)
                Dim newFullPath As String = sFile
    
                While File.Exists(newFullPath)
                    Dim tempFileName As String = String.Format("{0}({1})", fileNameOnly, System.Math.Max(System.Threading.Interlocked.Increment(count), count - 1))
                    newFullPath = Path.Combine(path__1, tempFileName & extension)
                End While
    
                Using f As New IO.StreamWriter(newFullPath, True)
                    Dim col As String = ""
                    Dim row As String = ""
                    Dim i As Integer = 0
                    For Each r As DataGridViewRow In DataGridView1.Rows
                        For Each c As DataGridViewColumn In DataGridView1.Columns
                            row = row & """" & Convert.ToString(r.Cells(c.HeaderText).Value) & "" & """" & ","
                        Next
                        row = row.Substring(0, row.Length - 1) '去除最後一個分號
                        If i < DataGridView1.Rows.Count - 1 Then row &= Environment.NewLine
                    Next
                    f.WriteLine(row)
                    'MessageBox.Show("file created")
                End Using
            End If
        End Sub
    請問該如何解? 謝謝各位大大

    2020年11月6日 上午 07:45

所有回覆

  • 預設輸出為 Default ,通常為 ANSI ,若包含日韓簡罕,將會亂碼。

    若非巨大的 csv ,例如大於 100 MB ,我的作法會用 StringBuilder 去組,一開始就先加入 BOM ,最後組完後轉成 Byte() 直接寫入二進為檔。

    多數的軟體對於有 BOM 的 CSV 會判讀編碼開啟。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2020年11月6日 下午 12:11
  • 將這個[上傳及列印折讓證明單主檔.csv]檔案改用Unicode編碼存檔看看
    2020年11月7日 上午 04:35
  • Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim headers = (From header As DataGridViewColumn In DataGridView1.Columns.Cast(Of DataGridViewColumn)() _
                  Select header.HeaderText).ToArray
            Dim rows = From row As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow)() _
                       Where Not row.IsNewRow _
                       Select Array.ConvertAll(row.Cells.Cast(Of DataGridViewCell).ToArray, Function(c) If(c.Value IsNot Nothing, c.Value.ToString, ""))
            Using sw As New IO.StreamWriter("csv.txt")
                sw.WriteLine(String.Join(",", headers))
                For Each r In rows
                    sw.WriteLine(String.Join(",", r))
                Next
            End Using
            Process.Start("csv.txt")
        End Sub
    2020年11月7日 上午 06:23
  • 請問大大:"如何將檔案改用Unicode編碼存檔"

    感謝你

    2020年11月9日 上午 02:03
  • 親愛的大大:

    我在網路上找到一個程式如下

     Dim enc As System.Text.Encoding = Nothing
            Dim file As System.IO.FileStream = New System.IO.FileStream("C:\3M\上傳及列印折讓證明單主檔.txt", FileMode.Open, FileAccess.Read, FileShare.Read)
            Dim bom As Byte() = New Byte(2) {} ' Get the byte-order mark, if there is one
            file.Read(bom, 0, 3)
            If (bom(0) = &HEF AndAlso bom(1) = &HBB AndAlso bom(2) = &HBF) Then ' utf-8
                enc = System.Text.Encoding.Unicode
            Else
                enc = System.Text.Encoding.ASCII
            End If
            ' Now reposition the file cursor back to the start of the file
            file.Seek(0, System.IO.SeekOrigin.Begin)
            file.Close()
    我不知此檔案轉換編碼是否成功?要如何得知?有何方法嗎? 感謝你

    2020年11月9日 上午 03:22
  • 這是讀取前 3 個 bytes ,檢查有沒有 BOM 。

    再依據 BOM 選擇 Encoding ,讀取檔案。

    你寫入的話就是前面說的。

    用 StringBuilder 從 BOM 開始組 CSV ,因為 StringBuilder 比字串相加快多了,作完後可用 ToString 得到完整字串,在用 Encoding.Unicode.GetBytes 轉成 Byte()

    直接用 FileStream.Write(byteArray, 0, byteArray.Length) 當二進位檔寫入。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2020年11月9日 下午 03:23