Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
2 / 2 / 1
Регистрация: 06.07.2015
Сообщений: 73

Передача данных из файла *CSV в таблицу dataGridView

07.07.2015, 10:06. Показов 2680. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня в программе все данные из файла с расширением *CSV отображаются только в первом столбце dataGridView.
Что не так в коде, чтобы распределяло данные по столбцам? В Excel этот файл открывается корректно.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data.SqlClient;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
 
namespace TechRegLite
{
    public partial class FromExcel : Form
    {
        public FromExcel()
        {
            InitializeComponent();
        }
 
       
 
        private void button1_Click(object sender, EventArgs e)
        {
            string str;
            int rCnt;
            int cCnt;
 
            OpenFileDialog opf = new OpenFileDialog();
            opf.Filter = "Excel (*.CSV)|*.CSV";
            opf.ShowDialog();
            System.Data.DataTable tb = new System.Data.DataTable();
            string filename = opf.FileName;
 
            Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel._Workbook ExcelWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet ExcelWorkSheet;
            Microsoft.Office.Interop.Excel.Range ExcelRange;
 
            ExcelWorkBook = ExcelApp.Workbooks.Open(filename, 0, true, 5, "","",true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false,
                false, 0, true, 1, 0);
            ExcelWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ExcelWorkBook.Worksheets.get_Item(1);
 
            ExcelRange = ExcelWorkSheet.UsedRange;
            for (rCnt = 1; rCnt <= ExcelRange.Rows.Count; rCnt++)
            {
                dataGridView1.Rows.Add(1);
                for (cCnt = 1; cCnt <= 2; cCnt++)
                {
                    str = (string)(ExcelRange.Cells[rCnt, cCnt] as Microsoft.Office.Interop.Excel.Range).Value2;
                    dataGridView1.Rows[rCnt - 1].Cells[cCnt - 1].Value = str;
                }
            }
            ExcelWorkBook.Close(true, null, null);
            ExcelApp.Quit();
 
            releaseObject(ExcelWorkSheet);
            releaseObject(ExcelWorkBook);
            releaseObject(ExcelApp);
        
        }
        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Unable to release the object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
 
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.07.2015, 10:06
Ответы с готовыми решениями:

Добавление данных из CSV файла в таблицу БД
Добрый день. Подскажите, правильный ли подход к добавлению данных я выбрал. У меня еще совсем без опыта, поэтому не используйте это...

Импорт данных из файла .csv в таблицу MySQL
Существует ли какой-нибудь универсальный способ импорта данных из файла .csv в таблицу MySQL? Или надо писать функцию обработки обычного...

Импорт данных из файла CSV в таблицу SQL Server
Добрый день, уважаемые коллеги! Пожалуйста, помогите в решении следующей задачи. Дан файл с данными в формате CSV. Необходимо...

2
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.07.2015, 10:42
Андрей197000, OMG, а зачем вы CSV экселем открываете?
Парсите CSV парсером, храните в Data, отображете в DataGridView в виртуальном режиме:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication301
{
    public partial class Form1 : Form
    {
        private Data data;
        private DataGridView dgv;
 
        public Form1()
        {
            InitializeComponent();
 
            dgv = new DataGridView {Parent = this, VirtualMode = true, AllowUserToAddRows = false, Dock = DockStyle.Fill};
            dgv.CellValueNeeded += dgv_CellValueNeeded;
            dgv.CellValuePushed += dgv_CellValuePushed;
 
            ShowOpenFileDialog();
        }
 
        void dgv_CellValuePushed(object sender, DataGridViewCellValueEventArgs e)
        {
            if (data == null) return;
            if (e.ColumnIndex >= data.ColumnNames.Count || e.ColumnIndex < 0 || e.RowIndex >= data.Count) return;
 
            data[e.RowIndex].Items[e.ColumnIndex] = e.Value.ToString();
        }
 
        void dgv_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
        {
            if (data == null) return;
            if (e.ColumnIndex >= data.ColumnNames.Count || e.ColumnIndex < 0 || e.RowIndex >=data.Count) return;
 
            e.Value = data[e.RowIndex].Items[e.ColumnIndex];
        }
 
        private void ShowOpenFileDialog()
        {
            var ofd = new OpenFileDialog{ Filter = "CSV|*.csv" };
            if (ofd.ShowDialog(this) == DialogResult.OK)
            {
                data = OpenFile(ofd.FileName);
                BuildGrid();
            }
        }
 
        private Data OpenFile(string fileName)
        {
            var parser = new CsvParser() { Separator = ';' };
            parser.Parse(fileName, Encoding.Default);
            var data = new Data();
            data.AddRange(parser.Rows.Select(r=>new DataRow{Items = r}));
            data.ColumnNames = parser.ColumnNames;
 
            return data;
        }
 
        void BuildGrid()
        {
            dgv.ColumnCount = data.ColumnNames.Count;
            for (int i = 0; i < data.ColumnNames.Count; i++)
                dgv.Columns[i].Name = data.ColumnNames[i];
 
            dgv.RowCount = 0;
            dgv.RowCount = data.Count;
            dgv.Invalidate();
        }
    }
 
    /// <summary>
    /// Данные
    /// </summary>
    public class Data : List<DataRow>
    {
        public List<string> ColumnNames;
    }
 
    /// <summary>
    /// Строка данных
    /// </summary>
    public class DataRow
    {
        public List<string> Items;
    }
}
Класс парсера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
 
namespace WindowsFormsApplication301
{
    /// <summary>
    /// Парсер CSV
    /// </summary>
    public class CsvParser
    {
        public char Separator { get; set; }
        public char Quote { get; set; }
        public bool TrimLineAtEnd { get; set; }
 
        public List<string> ColumnNames { get; private set; }
        public IEnumerable<List<string>> Rows { get; private set; }
 
        public CsvParser()
        {
            Separator = '\t';
            Quote = '"';
        }
 
        public static char AutoDetectSeparator(string fileName, Encoding enc)
        {
            fileName = fileName.Split(';')[0];
            using (StreamReader sr = new StreamReader(fileName, enc))
                while (sr.Peek() >= 0)
                {
                    var s = sr.ReadLine();
                    //если есть табуляции - скорее всего это и есть разделитель
                    if (s.Contains("\t")) return '\t';
                    //считаем число запятых и точек с запятыми
                    int semicolonCount = 0;
                    int commaCount = 0;
                    foreach (char c in s)
                        if (c == ';') semicolonCount++;
                        else
                            if (c == ',') commaCount++;
                    //точек с запятыми больше чем запятых
                    if (semicolonCount > commaCount) return ';';
                    return ',';
                }
 
            return ',';
        }
 
        public void Parse(string fileName, Encoding enc, bool parseColumnNames = true, bool autoDetectSeparator = false)
        {
            if (autoDetectSeparator)
                Separator = AutoDetectSeparator(fileName, enc);
 
            if (parseColumnNames)
            {
                ColumnNames = Parse(ReadLines(fileName, enc)).FirstOrDefault();
                Rows = Parse(ReadLines(fileName, enc)).Skip(1);
            }
            else
                Rows = Parse(ReadLines(fileName, enc));
        }
 
        public void Parse(Stream stream, Encoding enc, bool parseColumnNames = true)
        {
            if (parseColumnNames)
            {
                ColumnNames = Parse(ReadLines(stream, enc)).FirstOrDefault();
                Rows = Parse(ReadLines(stream, enc)).Skip(1);
            }
            else
                Rows = Parse(ReadLines(stream, enc));
        }
 
        private IEnumerable<string> ReadLines(Stream stream, Encoding enc)
        {
            using (StreamReader sr = new StreamReader(stream, enc))
                while (sr.Peek() >= 0)
                {
                    var line = sr.ReadLine();
                    if (TrimLineAtEnd) line = line.TrimEnd();
                    yield return line;
                }
        }
 
        private IEnumerable<string> ReadLines(string fileName, Encoding enc)
        {
            using (StreamReader sr = new StreamReader(fileName, enc))
                while (sr.Peek() >= 0)
                {
                    var line = sr.ReadLine();
                    if (TrimLineAtEnd) line = line.TrimEnd();
                    yield return line;
                }
        }
 
        private IEnumerable<List<string>> Parse(IEnumerable<string> lines)
        {
            var e = lines.GetEnumerator();
            while (e.MoveNext())
                yield return ParseLine(e);
        }
 
        private List<string> ParseLine(IEnumerator<string> e)
        {
            var items = new List<string>();
            foreach (string token in GetToken(e))
                items.Add(token);
            return items;
        }
 
        private IEnumerable<string> GetToken(IEnumerator<string> e)
        {
            string token = "";
            State state = State.outQuote;
 
        again:
            foreach (char c in e.Current)
                switch (state)
                {
                    case State.outQuote:
                        if (c == Separator)
                        {
                            yield return token;
                            token = "";
                        }
                        else
                            if (c == Quote)
                                state = State.inQuote;
                            else
                                token += c;
                        break;
                    case State.inQuote:
                        if (c == Quote)
                            state = State.mayBeOutQuote;
                        else
                            token += c;
                        break;
                    case State.mayBeOutQuote:
                        if (c == Quote)
                        {
                            //кавычки внутри кавычек
                            state = State.inQuote;
                            token += c;
                        }
                        else
                            if (c != Separator)
                            {
                                //кавычки внутри кавычек
                                state = State.inQuote;
                                token += Quote;
                                token += c;
                            }
                            else
                            {
                                state = State.outQuote;
                                goto case State.outQuote;
                            }
                        break;
                }
 
            //разрыв строки внутри кавычек
            if (state == State.inQuote && e.MoveNext())
            {
                token += Environment.NewLine;
                goto again;
            }
 
            yield return token;
        }
 
        enum State { outQuote, inQuote, mayBeOutQuote }
    }
}
0
2 / 2 / 1
Регистрация: 06.07.2015
Сообщений: 73
07.07.2015, 11:24  [ТС]
Спасибо ! Всё получилось. На этом форуме ещё один пример нашёл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.07.2015, 11:24
Помогаю со студенческими работами здесь

Загрузка данных из файла в таблицу DataGridView
Здравствуйте. Вот я сохранил таблицу в текстовый файл: SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter =...

Передача данных из одной формы в таблицу dataGridView другой формы
Есть две формы на одной таблица на второй поля в которые пользователь вводит значения. Не получает со второй формы добавить больше одного...

Неправильное отображение csv файла в datagridview
Доброго времени суток! У меня возникла проблема с открытием *.csv файла в datagridview. Суть в том, что есть csv файл с записями,...

Сохранение данных из DataGridView в *.csv
Добрый день, хочу созранить данные из грида в цсв файл,но почему то не получается.Помогите, в чём соль, создаёт просто пустой файл. ...

Импорт .csv-файла в таблицу
Доброго времени суток. Столкнулся с проблемой импорта содержимого .csv в таблицу из СУБД PostgreSQL. Вот sql-запрос, по которому...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru