Войти

Показать полную графическую версию : Запись из dataGridView в файл екселя


Lawrence
28-02-2012, 19:41
Добрый день. Недавно начал учить 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
Я думаю запрос составлен не верно, так как ты пишешь в Лист , но не указываешь в какие ячейки вставлять три свой поля.

Lawrence
28-02-2012, 21:53
А как указать?

ferget
28-02-2012, 22:02
http://forum.oszone.net/showthread.php?t=216811

Lawrence
28-02-2012, 22:57
Спасибо, но я с этой темы и начал разработку своей программы. А именно с кода, предоставленного пользователем LilLoco, который отписался в той теме.

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

ferget
28-02-2012, 23:37
А сам автор темы говорит подключить
using Microsoft.Office.Interop;
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
Но у меня компилятор ругается при виде слова Office »

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

Lawrence
28-02-2012, 23:42
чтобы это подключить надо в обозревателе решений правой кнопкой мыши и выбрать добавить ссылку »
Ни в одной из вкладок нету ничего про Офис.

ferget
28-02-2012, 23:59
там окно с закладками, перейдите на закладку NET

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

Lawrence
29-02-2012, 00:01
и там выберите
Microsoft.Office.Interop.Excel; »
Во вкладке .NET нету ничего про Офис.
Первая половина Microsoft.*
http://rudb.org/img/2012_02/28/371d1694-ee7b-4cbe-9e17-49ae51dd1b47.PNG

Вторая половина:
http://rudb.org/img/2012_02/28/5a8bc430-64b1-4739-9c7d-cbcbe970fbbf.PNG

ferget
29-02-2012, 00:18
попробуйте так

http://msdn.microsoft.com/en-us/library/ms173186%28v=vs.80%29.aspx

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

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

ferget
29-02-2012, 00:51
вот пример, заполняет 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();
}
}




© OSzone.net 2001-2012