2008-09-12 20 views
8

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

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

, pero ocurre el OleDbException tirado con el mensaje:.

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

Mi conexión parece correcta y puedo seleccionar bien los datos, pero parece que no puedo insertar datos en el archivo Excel, ¿alguien sabe cómo obtener acceso de lectura/escritura al archivo Excel a través de OLEDB?

+0

¿El libro de trabajo ya tiene una hoja llamada test $? – Kearns

Respuesta

8

es necesario agregar ReadOnly=False; a la 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\"; 
+7

No es del todo correcto: el uso del atributo ReadOnly provoca el error "System.Data.OleDb.OleDbException: Could not find instalable ISAM." Es el IMEX = 0 que impide que el archivo sea de solo lectura. La cadena que funcionó para mí (C#) es: @ "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = {0}; Mode = ReadWrite; Extended Properties =" "Excel 8.0; HDR = YES; MaxScanRows = 0; IMEX = 0 ""; "; – rohancragg

+0

Gracias por esta respuesta y comentario. Resolvió mi problema! – user279521

+2

Todo lo que es esencial es 'Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C: \ Docs \ Test.xls; Mode = ReadWrite; Propiedades extendidas =" "Excel 8.0; HDR = Yes" "' MaxScanRows e IMEX Dependiendo de la configuración del registro, en cierta medida ya menudo no es necesario. – Fionnuala

1

un par de preguntas:

  • ¿El usuario que ejecuta la aplicación (que?) Tiene permiso para escribir en el fichero?
  • ¿Es el archivo de solo lectura?
  • ¿Cuál es su cadena de conexión?

Si está utilizando ASP, deberá agregar el usuario IUSER_ * como en this example.

0
  • ¿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 = Sí; IMEX = 1 \ ""

+0

Comprueba los permisos haciendo clic derecho sobre él y presionando la pestaña de seguridad o permisos. ¿El archivo de Excel está cerrado cuando te conectas? –

+0

Debe intentar IMEX = 0 en su lugar – rohancragg

0

Además de la respuesta de Michael Haren. La cuenta que deberá otorgar para modificar permisos para el archivo XLS probablemente sea SERVICIO DE RED si este código se está ejecutando en una aplicación ASP.NET (está especificado en el grupo de aplicaciones de IIS). Para averiguar exactamente lo que cuenta su código se ejecuta como, se puede hacer un simple:

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

Yo también estaba buscando y respuesta, pero la solución de Zorantula no funcionó para mí. he encontrado la solución en http://www.cnblogs.com/zwwon/archive/2009/01/09/1372262.html

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

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

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

IMEX = 1 es el truco! Gracias. –

0

estaba corriendo bajo ASP.NET, y se encontró con ambos "No se puede modificar el diseño ..." y "No se puede encontrar ISAM ..." mensajes de error.

me pareció que necesitaba:

un) Usar 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};

Nota Yo también tuve problemas con IMEX=1 y con las ReadOnly=false atributos en la cadena de conexión .

b) Otorgue TODOS permisos completos a la carpeta en la que se estaba escribiendo el archivo. Normalmente, ASP.NET se ejecuta bajo la cuenta SERVICIO DE RED, y eso ya tenía permisos. Sin embargo, el código OleDb no está administrado, por lo que debe ejecutarse en algún otro contexto de seguridad. (Actualmente soy demasiado flojo para descubrir qué cuenta, así que acabo de usar TODOS).

2

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

Cuestiones relacionadas