Pregunta

¿Alguien sabe cómo escribir en un archivo de Excel (.xls) a través de OLEDB en C#?Estoy haciendo lo siguiente:

   OleDbCommand dbCmd = new OleDbCommand("CREATE TABLE [test$] (...)", connection);
   dbCmd.CommandTimeout = mTimeout;
   results = dbCmd.ExecuteNonQuery();

Pero recibo una OleDbException con el mensaje:

"No se puede modificar el diseño de la tabla 'prueba $'.Está en una base de datos de solo lectura ".

Mi conexión parece estar bien y puedo seleccionar datos correctamente, pero parece que no puedo insertar datos en el archivo de Excel. ¿Alguien sabe cómo obtengo acceso de lectura/escritura al archivo de Excel a través de OLEDB?

¿Fue útil?

Solución

Necesitas agregar ReadOnly=False; a su cadena de conexión

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\";

Otros consejos

También estaba buscando una respuesta pero la solución de Zorantula no funcionó para mí.Encontré la solución en http://www.cnblogs.com/zwwon/archive/2009/01/09/1372262.html

eliminé el ReadOnly=false parámetro y el IMEX=1 propiedad extendida.

El IMEX=1 La propiedad abre el libro en modo de importación, por lo que los comandos que modifican la estructura (como CREATE TABLE o DROP TABLE) no funciona.

Mi cadena de conexión de trabajo es:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=workbook.xls;Mode=ReadWrite;Extended Properties=\"Excel 8.0;HDR=Yes;\";"

También tuve el mismo problema.Eliminar solo la propiedad extendida IMEX=1.Eso resolverá su problema.Su tabla se creará en su archivo de Excel...

Un par de preguntas:

  • ¿El usuario que ejecuta su aplicación (¿usted?) tiene permiso para escribir en el archivo?
  • ¿El archivo es de sólo lectura?
  • ¿Cuál es su cadena de conexión?

Si está utilizando ASP, deberá agregar el usuario IUSER_* como en este ejemplo.

  • ¿Cómo verifico los permisos para escribir en un archivo de Excel para mi aplicación (estoy usando Excel 2007)?
  • El archivo no es de solo lectura ni está protegido (que yo sepa).
  • Mi cadena de conexión es:

"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = fifa_ng_db.xls; mode = readwrite; extended Properties = " Excel 8.0; HDR = YES; IMEX = 1 ""

Además de la respuesta de Michael Haren.La cuenta a la que deberá otorgar permisos de modificación al archivo XLS probablemente será SERVICIO DE RED si este código se ejecuta en una aplicación ASP.NET (está especificado en el grupo de aplicaciones IIS).Para saber exactamente en qué cuenta se ejecuta su código, puede hacer lo siguiente:

Response.Write(Environment.UserDomainName + "\\" + Environment.UserName);

Estaba ejecutando ASP.NET y encontré los mensajes de error "No se puede modificar el diseño..." y "No se puede localizar ISAM...".

Descubrí que necesitaba:

a) Utilice la siguiente cadena de conexión:

Provider=Microsoft.Jet.OLEDB.4.0;Mode=ReadWrite;Extended Properties='Excel 8.0;HDR=Yes;';Data Source=" + {path to file};

Tenga en cuenta que yo también tuve problemas con IMEX=1 y con el ReadOnly=false atributos en la cadena de conexión.

b) Otorgue a TODOS permisos completos sobre la carpeta en la que se estaba escribiendo el archivo.Normalmente, ASP.NET se ejecuta bajo la cuenta NETWORK SERVICE y esa ya tenía permisos.Sin embargo, el código OleDb no está administrado, por lo que debe ejecutarse bajo algún otro contexto de seguridad.(Actualmente soy demasiado vago para determinar qué cuenta, así que usé TODAS).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top