1 / 1 / 0
Регистрация: 15.06.2013
Сообщений: 135
1

Вывод в DataGridView заранее неизвестного кол-ва строк и колонок из Excel

15.06.2016, 15:41. Показов 2225. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день
помогите допилить код
кусочек прост до безобразия
нужно вывести данные из таблицы в Excel
и после перемножить их на некоторое число из textBox1

вопрос в следующем
как подправить код так , что бы он "хавал" любые таблицы , с любым значением строк и столбцов
пытась выставить ExcelRange.Сells.Count вместо константы (3) в цикле
но выполнение программы завешается ошибкой выхода за пределы диапазона

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
 private void button1_Click(object sender, EventArgs e)
        {
            string str;
            int rCnt;
            int cCnt;
    
         
            
 
            OpenFileDialog opf = new OpenFileDialog();
            opf.Filter = "Файл Excel|*.XLSX;*.XLS";
            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;
            int[,] list = new int[ExcelRange.Cells.Count, ExcelRange.Rows.Count]; // массив значений с листа равен по размеру листу
            for (rCnt = 1; rCnt <= ExcelRange.Rows.Count; rCnt++)
            {
                if (rCnt == 1)
                {
                    dataGridView1.Columns.Add(" ", " ");
                    dataGridView2.Columns.Add(" ", " ");
                }
                dataGridView1.Rows.Add(1);
                dataGridView2.Rows.Add(1);
                
                for (cCnt = 1; cCnt <= 3; cCnt++)
                {
                    if (cCnt != 1)
                    {
                        dataGridView1.Columns.Add(" ", " ");
                        dataGridView2.Columns.Add(" ", " ");
                    }
 
                    str = (string)(ExcelRange.Cells[rCnt, cCnt] as Microsoft.Office.Interop.Excel.Range).Text;
                    dataGridView1.Rows[rCnt - 1].Cells[cCnt - 1].Value = str;
                    list[rCnt, cCnt] = Convert.ToInt32(str) * int.Parse(textBox2.Text);
 
                    //textBox1.Text = list [rCnt, cCnt]; 
                    //dataGridView2 = list[rCnt,cCnt];
                    dataGridView2.Rows[rCnt-1].Cells[cCnt-1].Value = list[rCnt, cCnt];
                } 
            }
            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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2016, 15:41
Ответы с готовыми решениями:

I2C, прием заранее неизвестного кол-ва байт.
Всем привет. Подскажите пжлста, как реализовать прием заранее неизвестного количества байт по I2C....

Ввод заранее неизвестного количества строк
Знающие люди помогите! Необходимо ввести с консоли определнное количество строк, заранее не...

Сохранение порядка колонок DataGridView при экспорте в Excel
Народ в C# недавно, перерыл все что можно. Проблема в том что у меня в datagridview можно...

Название колонок нескольких выделенных строк dataGridView
Уважаемые господа программисты, проблема такова: Имеется dataGridView, при выделении ячейки я...

4
995 / 354 / 135
Регистрация: 27.10.2006
Сообщений: 764
15.06.2016, 22:32 2
без файла Excel могу просто погадать ...
C#
1
int[,] list = new int[ExcelRange.Cells.Count, ExcelRange.Rows.Count];
ExcelRange.Cells.Count - это количество всех ячеек в диапазоне. Может вам количество столбцов нужно? Только, вроде, первым должно идти кол-во строк, а втором кол-во столбцов

может нужно так
C#
1
int[,] list = new int[ExcelRange.Rows.Count, ExcelRange.Columns.Count];
может вам подсказать, как найти последнюю заполненную ячейку в указаном столбце? Приблизительно так

using Excel = Microsoft.Office.Interop.Excel;

C#
1
2
3
4
5
6
7
8
9
10
11
Excel.Workbook xlWB;
Excel.Worksheet xlSht;
int iLastRow, iLastCol;
 
Excel.Application xlApp = new Excel.Application(); //создаём приложение Excel
//xlApp.Visible = true;
xlWB = xlApp.Workbooks.Open(xlFileName); //открываем наш файл           
xlSht = xlWB.Worksheets["Лист1"]; //или так xlSht = xlWB.ActiveSheet //активный лист
 
iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row; //последняя заполненная строка в столбце А
iLastCol = xlSht.Cells[1, xlSht.Columns.Count].End[Excel.XlDirection.xlToLeft].Column; //последний заполненный столбец в 1-й строке

вам нужны переменные:
iLastRow - номер строки с последней заполненной ячейкой в столбце А
iLastCol - номер столбца с последней заполненной ячейкой в 1-й строке

Добавлено через 4 минуты
Можете посмотреть ещё один пример тут http://www.codeproject.com/Que... -DataTable
0
1 / 1 / 0
Регистрация: 15.06.2013
Сообщений: 135
16.06.2016, 10:40  [ТС] 3
C#
1
int[,] list = new int[ExcelRange.Rows.Count, ExcelRange.Columns.Count];
подрисовал этот кусочек кода
и прога крашится на заполнении формы
опять вылет за пределы диапазона

WindowsFormsApplication11.rar
вот она собственно для наглядности проблемы
0
995 / 354 / 135
Регистрация: 27.10.2006
Сообщений: 764
16.06.2016, 20:00 4
а что же вы в свой архив не положили свой Excel файл? Я сейчас создам свой Excel файл, вставлю туда числа из головы, подправлю ваш код и у меня всё заработает. А вот с вашим файлом Excel код может и не заработать.

Понимаете, вы хотите, чтобы ваш код работал с вашим Excel файлом, но не даёте ваш Excel файл.

Вот смотрите, я взял Excel файл, забил в ячейки A1:E10 числа 5, подпривил ваш код и у меня всё загружается в dataGridview и умножается на число введённое в textBox2.
Вот код, а дальше уже сами с вашим секретным 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
      private void button1_Click(object sender, EventArgs e)
        {
            int rCnt;
            int cCnt;                    
 
            OpenFileDialog opf = new OpenFileDialog();
            opf.Filter = "Файл Excel|*.XLSX;*.XLS";
            if (opf.ShowDialog() != DialogResult.OK)
            {
                MessageBox.Show("Вы не выбрали Excel файл!", "Внимание", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            string filename = opf.FileName;
            
            Excel.Application ExcelApp = new Excel.Application();
            Excel._Workbook ExcelWorkBook;
            Excel.Worksheet ExcelWorkSheet;
            Excel.Range ExcelRange;
 
            ExcelWorkBook = ExcelApp.Workbooks.Open(filename, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            ExcelWorkSheet = ExcelWorkBook.Worksheets.get_Item(1);
            //ExcelRange = ExcelWorkSheet.UsedRange; //я бы так не делал, т.к. таблица может быть в А1:B5, а UsedRange может быть огромным полем (куча пустых ячеек)            
            ExcelRange = ExcelWorkSheet.get_Range("A1").CurrentRegion; //Если ваша таблица начинается с ячейки А1 и не имеет пустых строк, то лучше так
            //int[,] list = new int[ExcelRange.Rows.Count, ExcelRange.Columns.Count]; // массив значений с листа равен по размеру листу
 
            var list = (object[,])ExcelRange.Value;
 
            dataGridView1.RowCount = list.GetUpperBound(0); //кол-во строк
            dataGridView1.ColumnCount = list.GetUpperBound(1); //кол-во столбцов
 
            for (rCnt = 1; rCnt <= dataGridView1.RowCount; rCnt++)
            {
                for (cCnt=1; cCnt <= dataGridView1.ColumnCount; cCnt++ ) 
                {
                    dataGridView1.Rows[rCnt - 1].Cells[cCnt - 1].Value = Convert.ToDouble(list[rCnt, cCnt]) * Convert.ToDouble(this.textBox2.Text);
                }                
            }
 
            ExcelWorkBook.Close(true, null, null);
            ExcelApp.Quit();
 
            releaseObject(ExcelWorkSheet);
            releaseObject(ExcelWorkBook);
            releaseObject(ExcelApp);
        }
1
1 / 1 / 0
Регистрация: 15.06.2013
Сообщений: 135
16.06.2016, 23:54  [ТС] 5
я не прикреплял свой Excel т.к. необходимо , что бы код работал с любыми видами заполнения таблицы
в моем случае это было 2 файла
1 - 1 столбец на 100 строк , который не запускался
2 - 3 столбца по 100 строк каждый ... он работал , но чуть корявый цикл был
и прога шпилила кучу пустых столбцов )

Добавлено через 2 часа 34 минуты
однако , спасибо
Ваш код работает с моими таблицами
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.06.2016, 23:54
Помогаю со студенческими работами здесь

Вывод колонок DataGridView разным цветом
В элементе DataGridView текст в колонках должен выводиться разным цветом. Как это сделать?

Масив заранее неизвестного размера
Имеется массив пользовательского типа данных Account, у которого число ячеек заранее неизвестно,...

Массив заранее неизвестного размера
Скажите как создать массив за рание не известной размерности. Искал по форумам приимеры описания,...

Массив заранее неизвестного размера
Возможно сейчас произвучит тупой вопрос,не судите строго,но можно каким-нибудь образом сделать...

Поиск заранее неизвестного слова
Всем привет. Допустим, у нас имеется текстовый документ, содержащее следующее: Устройство...

Вывод заранее сформированных строк
добрый вечер! Заинтересовал данный пример @echo off echo ^ abcdefg^ hijklmn^ opqrstu^...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru