Escrevendo em arquivo Excel com OLEDB
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?
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.)