Amar chand123 Ответов: 4

Проблема при экспорте данных datagridview в excel в C winform


я пробую этот код в экспорте данных в Excel
но проблема заключается в экспорте данных только заголовка столбца и первой строки DataGridView

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

private void ToCsV(DataGridView dGV, string filename)
        {
            string stOutput = "";
            // Export titles:
            string sHeaders = "";

            for (int j = 0; j < dGV.Columns.Count; j++)
                sHeaders = sHeaders.ToString() + Convert.ToString(dGV.Columns[j].HeaderText) + "\t";
            stOutput += sHeaders + "\r\n";
            // Export data.
            for (int i = 0; i < dGV.RowCount - 1; i++)
            {
                string stLine = "";
                for (int j = 0; j < dGV.Rows[i].Cells.Count; j++)
                    stLine = stLine.ToString() + Convert.ToString(dGV.Rows[i].Cells[j].Value) + "\t";
                stOutput += stLine + "\r\n";
            }
            Encoding utf16 = Encoding.GetEncoding(1254);
            byte[] output = utf16.GetBytes(stOutput);
            FileStream fs = new FileStream(filename, FileMode.Create);
            BinaryWriter bw = new BinaryWriter(fs);
            bw.Write(output, 0, output.Length); //write the encoded file
            bw.Flush();
            bw.Close();
            fs.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "Excel Documents (*.xls)|*.xls";
            sfd.FileName = "export.xls";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                //ToCsV(dataGridView1, @"c:\export.xls");
                ToCsV(dataGridView1, sfd.FileName); // Here dataGridview1 is your grid view name
            }
        }

Maciej Los

Вы пробовали отлаживать?

4 Ответов

Рейтинг:
2

OriginalGriff

Во-первых, почему вы вызываете ToString для existign строк?

string sHeaders = "";

for (int j = 0; j < dGV.Columns.Count; j++)
    sHeaders = sHeaders.ToString() + Convert.ToString(dGV.Columns[j].HeaderText) + "\t";

string stLine = "";
for (int j = 0; j < dGV.Rows[i].Cells.Count; j++)
    stLine = stLine.ToString() + Convert.ToString(dGV.Rows[i].Cells[j].Value) + "\t";


Во - вторых, мы не можем вам помочь-у нас нет никакого доступа к yoru DGV, и вам это нужно, чтобы проверить, что происходит.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
1

Maciej Los

В дополнение к решениям № 1 и № 2.

Строки неизменны, а это значит, что...

Цитата:
...не могут быть изменены после того, как они были созданы. Все строковые методы и операторы C#, которые, как представляется, изменяют строку, на самом деле возвращают результаты в новом строковом объекте.

Видеть: Строки - Руководство По Программированию На C# | Microsoft Docs[^]

Я бы посоветовал использовать Класс StringBuilder (System.Text) | Microsoft Docs[^] для создания csv-контента.

private void ToCsV(DataGridView dGV, string filename)
{
    //create an instance of StringBuilder
    StringBuilder sb = new StringBuilder();
    //headers
    string line = string.Join("\t", dGV.Columns.Cast<DataGridViewColumn>().Select(x=>x.ColumnName));
    sb.AppendLine(line);
    //data
    foreach(DataGridViewRow dgvr in dGV.Rows)
    {
        line = string.Join("\t", dGV.Columns.Cast<DataGridViewColumn>().Select(x=>dgvr[x].ToString()));
        sb.AppendLine(line);
    }
   //use sb.ToString() to save csv content to text file
}


[no name]

Привет,
как v может экспортировать данные с очень длинной длиной строки с функцией переноса слов из данных в приведенном выше коде.

Пожалуйста помочь.

Maciej Los

Вы пробовали использовать приведенный выше код? Что в этом плохого?

[no name]

Да, я пробовал, код работает нормально, но содержимое пропускается в другие строки, из-за чего данные в excel не поступают в надлежащий заголовок столбца .выравнивание не является правильным

Maciej Los

Вы должны понимать, что экспортируемый текст в каждом столбце должен иметь одинаковую длину, чтобы иметь возможность отображать его в табличной форме.
Csv-файл (текст с разделителями) используется не для представления текста (визуализации), а для хранения некоторой части данных...

[no name]

ладно...понял !!

Спасибо :)

[no name]

есть ли какой-либо другой способ в .net framework 3.5, кроме метода interop для экспорта excel??

Как Microsoft.Офис.Взаимодействие.Excel это не поддерживается в 3.5 .net framwork

Рейтинг:
0

Patrice T

Цитата:
но проблема заключается в экспорте данных только заголовка столбца и первой строки DataGridView

Я не являюсь пользователем DataGridView, но есть кое-что удивительное.
Если dGV.Columns.Count правильно, я бы ожидал, что у меня будет dGV.Rows.Count, а не dGV.RowCount.


Richard MacCutchan

dGV.RowsCount должно быть dGV.Rows.Count.

Patrice T

Хороший улов, спасибо

Рейтинг:
0

Richard MacCutchan

Вы не можете создавать файлы Excel с помощью streamwriter. Вам необходимо использовать интерфейс OLEDB с Microsoft Access Database Engine 2016 распространяемый из официального центра загрузки Microsoft[^], или же Microsoft.Офис.Взаимодействие.Пространство Имен Excel | Microsoft Docs[^].

Кроме того, csv-файлы не должны создаваться с помощью .xls расширение. А их поля содержимого должны быть разделены запятыми.


Maciej Los

5ed!