Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Запись из dataGridView в файл екселя (http://forum.oszone.net/showthread.php?t=229040)

Lawrence 28-02-2012 19:41 1868631

Запись из dataGridView в файл екселя
 
Добрый день. Недавно начал учить C#, вот решил написать простенький телефонный справочник.
Все шло гладко, пока дело не дошло до сохранения в файл.

1) В чем собственно проблема:
При нажатии на кнопку, которая должна была записать все в файл 1.xls, выскакивает сообщение:
"Не совпадает число значений запроса и число результирующих полей."
И выделяет строку "cmd.ExecuteNonQuery();"

2) Еще раз через раз выскакивает ошибка, что якобы "Процесс не может получить доступ к файлу "1.xls", так как этот файл используется другим процессом."

Сам код:
Код:

private void button5_Click(object sender, EventArgs e)         
{
string fileName = "1.xls"; // путь файла             
System.IO.File.Copy("1.xls", fileName, true); // копируем файл, шаблон файла должен лежать рядом с *.exe (1.xls)             
string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + fileName + "';Extended Properties=Excel 8.0;"; // строка подключения             
using (OleDbConnection ole = new OleDbConnection(connectionString)) // используем OleDb             
{                 
try                 
{                     
ole.Open();                     
for (int i = 0; i < dataGridView1.Rows.Count; i++)                     

var cmd = new OleDbCommand("INSERT INTO [Лист1$] VALUES ('" + dataGridView1.Rows[0].Cells[0].Value + "','" + dataGridView1.Rows[0].Cells[1].Value + "','" + dataGridView1.Rows[0].Cells[2].Value + "',' ')", ole);                         
cmd.Connection = ole;                         
cmd.ExecuteNonQuery(); // вставляем данные в лист1 файла - filename                         
cmd.Dispose();                     
}                 
}               
  finally             
{                     
ole.Close();               
}             
}

Мой dataGridView1 имеет в себе 3 колонки.
Строка для начала пока одна. Когда разберусь с сохранением одной строки, то тогда додумаю уже как записать и остальные.


3) Если не трудно, то подскажите, как мне из этого же файла заполнить dataGridView (обратная операция до вышеописанной).

alex_03 28-02-2012 21:39 1868727

Я думаю запрос составлен не верно, так как ты пишешь в Лист , но не указываешь в какие ячейки вставлять три свой поля.

Lawrence 28-02-2012 21:53 1868740

А как указать?

ferget 28-02-2012 22:02 1868750

http://forum.oszone.net/showthread.php?t=216811

Lawrence 28-02-2012 22:57 1868792

Спасибо, но я с этой темы и начал разработку своей программы. А именно с кода, предоставленного пользователем LilLoco, который отписался в той теме.

А сам автор темы говорит подключить
using Microsoft.Office.Interop;
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

Но у меня компилятор ругается при виде слова Office

ferget 28-02-2012 23:37 1868817

Цитата:

Цитата Lawrence
А сам автор темы говорит подключить
using Microsoft.Office.Interop;
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
Но у меня компилятор ругается при виде слова Office »

чтобы это подключить надо в обозревателе решений правой кнопкой мыши и выбрать добавить ссылку

Lawrence 28-02-2012 23:42 1868821

Цитата:

Цитата ferget
чтобы это подключить надо в обозревателе решений правой кнопкой мыши и выбрать добавить ссылку »

Ни в одной из вкладок нету ничего про Офис.

ferget 28-02-2012 23:59 1868837

там окно с закладками, перейдите на закладку NET

и там выберите
Microsoft.Office.Interop.Excel;

Lawrence 29-02-2012 00:01 1868839

Цитата:

Цитата ferget
и там выберите
Microsoft.Office.Interop.Excel; »

Во вкладке .NET нету ничего про Офис.
Первая половина Microsoft.*


Вторая половина:

ferget 29-02-2012 00:18 1868852

попробуйте так

http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx

Lawrence 29-02-2012 00:29 1868855

Поверить не могу, что заработало)
Осталось только понять как сделать так, чтобы файл сохранялся, а не открывался.
И заполнение datagridview`a данными из этого файла)

Спасибо большое.

ferget 29-02-2012 00:51 1868860

вот пример, заполняет datagridview данными из этого файла

Код:

private void button1_Click(object sender, EventArgs e)
        {
            string str;
            int r;
            int c;
            string filename = "1.xls";

            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);
            ExcelWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ExcelWorkBook.Worksheets.get_Item(1);

            ExcelRange = ExcelWorkSheet.UsedRange;
            for (r = 1; r <= ExcelRange.Rows.Count; r++)
            {
                dataGridView1.Rows.Add(1);
                for (c = 1; c <= 2; c++)
                {
                    str = Convert.ToString((ExcelRange.Cells[r, c] as Microsoft.Office.Interop.Excel.Range).Value2);
                    dataGridView1.Rows[r - 1].Cells[c - 1].Value = str;
                }
            }
            ExcelWorkBook.Close();
            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();
            }
        }



Время: 20:48.

Время: 20:48.
© OSzone.net 2001-