el_tot93 Ответов: 1

Как решить проблему извлечения таблицы excel с арабским языком


я экспортирую большую таблицу с большими данными в лист excel/.csv с арабскими буквами.

есть проблема, которую я получаю, когда открываю лист, я получаю такие арабские буквы(/*0%&#@*!*$&@$^#@%*@#4)

есть ли какие-то проблемы с моим кодом или я должен использовать другой код?


<pre>public void DumpTableToFile(SqlConnection connection, string tableName, string destinationFile)
    {
        using (var command = new SqlCommand("select * from table " , connection))
        using (var reader = command.ExecuteReader())
        using (var outFile = File.CreateText(destinationFile))
        {
            string[] columnNames = GetColumnNames(reader).ToArray();
            int numFields = columnNames.Length;
            outFile.WriteLine(string.Join(",", columnNames));
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    string[] columnValues =
                        Enumerable.Range(0, numFields)
                                  .Select(i => reader.GetValue(i).ToString())
                                  .Select(field => string.Concat("\"", field.Replace("\"", "\"\""), "\""))
                                  .ToArray();
                    outFile.WriteLine(string.Join(",", columnValues));
                }
            }
        }
    }

    private IEnumerable<string> GetColumnNames(IDataReader reader)
    {
        foreach (DataRow row in reader.GetSchemaTable().Rows)
        {
            yield return (string)row["ColumnName"];
        }
    }

    private void Button5_Click(object sender, EventArgs e)
    {
        SqlConnection _connection = new SqlConnection();
        SqlDataAdapter _dataAdapter = new SqlDataAdapter();
        SqlCommand _command = new SqlCommand();
        DataTable _dataTable = new DataTable();

        _connection = new SqlConnection();
        _dataAdapter = new SqlDataAdapter();
        _command = new SqlCommand();
        _dataTable = new DataTable();

        //dbk is my database name that you can change it to your database name
        _connection.ConnectionString = "connaction";
        _connection.Open();

        SaveFileDialog saveFileDialogCSV = new SaveFileDialog();
        saveFileDialogCSV.InitialDirectory = Application.ExecutablePath.ToString();

        saveFileDialogCSV.Filter = "CSV files (*.csv)|*.csv|All files (*.*)|*.*";
        saveFileDialogCSV.FilterIndex = 1;
        saveFileDialogCSV.RestoreDirectory = true;

        string path_csv = "";
        if (saveFileDialogCSV.ShowDialog() == DialogResult.OK)
        {
            // Runs the export operation if the given filenam is valid.
            path_csv = saveFileDialogCSV.FileName.ToString();
        }


        DumpTableToFile(_connection, "tbl_trmc", path_csv);

    }
}


Что я уже пробовал:

var utf8 = new UTF8Encoding();
...

string[] columnValues =
    Enumerable.Range(0, numFields)
        .Select(i => {
            if (reader[i].GetType() == typeof(SqlString))
            {
              SqlString sqlString = reader.GetSqlString(i);
              Byte[] encodedBytes = sqlString.GetNonUnicodeBytes();
              return "\"" + utf8.GetString(encodedBytes) + "\"";
            }
            else
            {
              return "\"" + reader[i].ToString() + "\"";
            }
         }).ToArray();
 ...

Richard MacCutchan

- есть проблема, которую я получаю, когда открываю лист"
И вы хотите, чтобы мы догадались, в чем заключается эта проблема?

el_tot93

извините, что я обновляю это

Richard MacCutchan

Похоже, что ваш код выполняет какое-то преобразование данных. Используйте свой отладчик, чтобы проверить, правильно ли он это делает.

el_tot93

я стараюсь, чтобы не было никаких проблем

Richard MacCutchan

Тогда он должен быть в отображении извлеченных данных. Приложение должно установить правильную культуру для правильного отображения этих символов.

1 Ответов

Рейтинг:
11

el_tot93

<pre>public void DumpTableToFile(SqlConnection connection, string tableName, string destinationFile)
{
    using (var command = new SqlCommand("select * from table " , connection))
    {
        using (var reader = command.ExecuteReader())
        {
            using (StreamWriter sw = new StreamWriter(File.Open(destinationFile, FileMode.Create), Encoding.Utf8))
            {    
                string[] columnNames = GetColumnNames(reader).ToArray();
                int numFields = columnNames.Length;
                sw.WriteLine(string.Join(",", columnNames)); // writing headers  

                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        string[] columnValues = Enumerable.Range(0, numFields)
                              .Select(i => reader.GetValue(i).ToString())
                              .Select(field => string.Concat("\"", field.Replace("\"", "\"\""), "\""))
                              .ToArray();
                        sw.WriteLine(string.Join(",", columnValues));
                    }
                }
            }
        }
    } 
}