Pergunta

Alguém sabe como escrever em um arquivo Excel (.xls) via OLEDB em C#?Estou fazendo o seguinte:

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

Mas recebo uma OleDbException lançada com a mensagem:

"Não é possível modificar o design da tabela 'teste $'.Está em um banco de dados somente leitura. "

Minha conexão parece boa e consigo selecionar os dados corretamente, mas não consigo inserir dados no arquivo Excel. Alguém sabe como obtenho acesso de leitura/gravação ao arquivo Excel via OLEDB?

Foi útil?

Solução

Você precisa adicionar ReadOnly=False; para sua string de conexão

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

Outras dicas

Eu também estava procurando e respondendo, mas a solução do Zorantula não funcionou para mim.encontrei a solução em http://www.cnblogs.com/zwwon/archive/2009/01/09/1372262.html

Eu removi o ReadOnly=false parâmetro e o IMEX=1 propriedade estendida.

O IMEX=1 propriedade abre a pasta de trabalho no modo de importação, portanto, comandos de modificação de estrutura (como CREATE TABLE ou DROP TABLE) não funciona.

Minha string de conexão de trabalho é:

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

Eu também tive o mesmo problema.Remova apenas a propriedade estendida IMEX=1.Isso resolverá seu problema.Sua tabela será criada em seu arquivo Excel...

Algumas perguntas:

  • O usuário que executa seu aplicativo (você?) Tem permissão para gravar no arquivo?
  • O arquivo é somente leitura?
  • Qual é a sua string de conexão?

Se estiver usando ASP, você precisará adicionar o usuário IUSER_* como em este exemplo.

  • Como verifico as permissões para gravar em um arquivo Excel do meu aplicativo (estou usando o Excel 2007)?
  • O arquivo não é somente leitura ou protegido (que eu saiba).
  • Minha string de conexão é:

"Provider = microsoft.jet.oledb.4.0; fonte de dados = fifa_ng_db.xls; mode = readWrite; Propriedades estendidas = " Excel 8.0; hdr = sim; iMex = 1 "" "

Seguindo a resposta de Michael Haren.A conta que você precisará para conceder permissões de modificação ao arquivo XLS provavelmente será NETWORK SERVICE se esse código estiver sendo executado em um aplicativo ASP.NET (é especificado no pool de aplicativos do IIS).Para descobrir exatamente em qual conta seu código está sendo executado, você pode fazer um simples:

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

Eu estava executando no ASP.NET e encontrei mensagens de erro "Não é possível modificar o design..." e "Não é possível localizar o ISAM...".

Descobri que precisava:

a) Use a seguinte string de conexão:

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

Observe que eu também tive problemas com IMEX=1 e com o ReadOnly=false atributos na cadeia de conexão.

b) Conceda a TODOS permissões completas para a pasta na qual o arquivo estava sendo gravado.Normalmente, o ASP.NET é executado na conta NETWORK SERVICE e já possui permissões.No entanto, o código OleDb não é gerenciado e, portanto, deve ser executado em algum outro contexto de segurança.(Atualmente estou com preguiça de descobrir qual conta, então usei TODOS.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top