Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Редактирование файлов xlsx через Ole Db  [new]
зубок александр
Member

Откуда:
Сообщений: 2007
Всем привет!

Вобщем тема конечно обсосана со всех сторон и сам работал часто с экселем как с БД но видимо давно было и они многое поменяли.

Сразу по исходным данным.
Фреймворк .net 4.0

Ось - win 7. Среда разработки - vs 2010 express, язык c#.

Дрова - последняя версия ACE.OLEDB.12.0.

Читается файл на ура. Но с писаниной проблема.

Такое работает
OleDbCommand InsCommand = new OleDbCommand("UPDATE [Sheet1$A1:A1] SET F1='org_name'");

            InsCommand.Connection = conn;

            InsCommand.ExecuteNonQuery();   


А вот такое
OleDbCommand InsCommand = new OleDbCommand("INSERT INTO [Sheet1$] (F3, F4, F5, F6, F8) values ('" + cOrgData.OrgName + "', '"
                                                                 + cOrgData.Zip + "', '" + cOrgData.City + "', '" + cOrgData.KontaktFace + "', '" + cOrgData.Tel + "')",
                                                           conn
                                                          );

                InsCommand.ExecuteNonQuery();
               
                DbAdapter.Update(DataOrgs);


не работает. Просто тупо не вставляет данных в файл - при том что размер файла меняется.

Т е что происходит примерно понятно - добавляются пустые записи неизвестно куда.

Вообще конечное желание - без всяких запросов прямо через datatable добавлять.

По сути открывается файл так.

// собственно подключение          
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties=\"Excel 12.0;HDR=NO;READONLY=FALSE\"");

// дальше открывается соединение

conn.Open();
              // подключиться к нужному листу excel
              OleDbDataAdapter DbAdapter = new OleDbDataAdapter("select * from [Sheet1$]", conn);
              // пока не пробовал но могу и отсечь и ненужные записи коих в файле до фига
              // там даже заголовок тупой - посему не хочу его как заглавие использовать
              // OleDbDataAdapter DbAdapter = new OleDbDataAdapter("select * from [Sheet1$] where F1 <> ''", conn);
              DataSet CDataSet = new DataSet();
              DbAdapter.Fill(CDataSet);
              DataTable DataOrgs = CDataSet.Tables[0];


и в дальнейшем цель используя DataOrgs часть данных обновлять часть исправлять

Причем привязку делать через F1, F2 и так далее

Т е обновлять в таком ключе

 DataOrgs.Rows[RecNo].BeginEdit();
            // сравнить почтовый код
            if (DataOrgs.Rows[RecNo][3].ToString() != cOrgData.Zip.ToString())
            {
                DataOrgs.Rows[RecNo][3] = cOrgData.Zip;
             }
             DataOrgs.AcceptChanges(); 
             DbAdapter.Update(DataOrgs);


Если пробовал без генератора команд выдается ошибка - команда не задана. А классические insert и update ни фига не пашут как было описано выше.
Это если просто пытаюсь команды использовать - а если использую OleDbCommandBuilder
то там и вовсе не получается переписать текст команд. Хотя еще не пробовал через параметры. Но как то хочется сделать попроще и кода поменьше.
И так вопрос - если возможно только через двойную адресацию ячеек - можно ли ее как нибудь в цикле юзать.

Если можно то живой пример было бы не плохо. Как я понимаю тогда можно вообще только update делать. Но идеальный вариант конечно через datatable и инсерт и апдейт. Если просто линк - тоже сойдет - вчера гуглил в том числе на английском - как то ничего умного не попалось. В перспекктиве будет отказываться в данном софте от экселя (данный вариант - просто тестовая версия) и посему вариант через чистые эксель объекты не катит да и вообще экселя на раб машине может не быть на моей кстати тоже только опенофффис
7 сен 13, 13:50    [14808318]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить