Запись в файл Excel с помощью OLEDB
Вопрос
Кто-нибудь знает, как записать файл Excel (.xls) через OLEDB на C#?Я делаю следующее:
OleDbCommand dbCmd = new OleDbCommand("CREATE TABLE [test$] (...)", connection);
dbCmd.CommandTimeout = mTimeout;
results = dbCmd.ExecuteNonQuery();
Но я получаю исключение OleDbException с сообщением:
«Невозможно изменить дизайн таблицы 'тест $'.Он находится в базе данных только для чтения ».
Мое соединение кажется нормальным, и я могу нормально выбирать данные, но не могу вставить данные в файл Excel. Кто-нибудь знает, как я могу получить доступ для чтения/записи к файлу Excel через OLEDB?
Решение
Вам нужно добавить ReadOnly=False;
к вашей строке подключения
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fifa_ng_db.xls;Mode=ReadWrite;ReadOnly=false;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";
Другие советы
Я тоже искал и отвечал, но решение Зорантула мне не помогло.Я нашел решение на http://www.cnblogs.com/zwwon/archive/2009/01/09/1372262.html
я удалил ReadOnly=false
параметр и IMEX=1
расширенное свойство.
А IMEX=1
Свойство открывает книгу в режиме импорта, поэтому команды, изменяющие структуру (например, CREATE TABLE
или DROP TABLE
) не работает.
Моя рабочая строка подключения:
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=workbook.xls;Mode=ReadWrite;Extended Properties=\"Excel 8.0;HDR=Yes;\";"
У меня также была такая же проблема.Удалить только расширенное свойство IMEX=1
.Это решит вашу проблему.Ваша таблица будет создана в файле Excel...
Пара вопросов:
- Имеет ли пользователь, запускающий ваше приложение (вы?), разрешение на запись в файл?
- Файл доступен только для чтения?
- Какая у вас строка подключения?
Если вы используете ASP, вам необходимо добавить пользователя IUSER_*, как показано в этот пример.
- Как проверить разрешения на запись в файл Excel для моего приложения (я использую Excel 2007)?
- Файл не доступен только для чтения и не защищен (насколько мне известно).
- Моя строка подключения:
"Provider = microsoft.jet.oledb.4.0; Data Source = fifa_ng_db.xls; mode = readwrite; расширенные свойства = " Excel 8.0; hdr = yes; imex = 1 ""
В дополнение к ответу Майкла Харена.Учетная запись, которую вам нужно будет предоставить разрешения на изменение файла XLS, скорее всего, будет NETWORK SERVICE, если этот код выполняется в приложении ASP.NET (он указан в пуле приложений IIS).Чтобы точно узнать, под какой учетной записью работает ваш код, вы можете сделать простое:
Response.Write(Environment.UserDomainName + "\\" + Environment.UserName);
Я работал под ASP.NET и обнаружил сообщения об ошибках «Невозможно изменить дизайн...» и «Невозможно найти ISAM...».
Я обнаружил, что мне нужно:
а) Используйте следующую строку подключения:
Provider=Microsoft.Jet.OLEDB.4.0;Mode=ReadWrite;Extended Properties='Excel 8.0;HDR=Yes;';Data Source=" + {path to file};
Обратите внимание, у меня тоже были проблемы с IMEX=1
и с ReadOnly=false
атрибуты в строке подключения.
б) Предоставьте ВСЕМ полные права на папку, в которую записывался файл.Обычно ASP.NET запускается под учетной записью NETWORK SERVICE, у которой уже есть разрешения.Однако код OleDb не является управляемым, поэтому он должен выполняться в каком-то другом контексте безопасности.(Мне сейчас лень выяснять, какой аккаунт, поэтому я просто использовал ВСЕ.)