none
Atualizar Planilhas Excel com Aplicativo RRS feed

  • Pergunta

  • Boa tarde a todos,

    Queria pedir uma opinião a vocês aqui do forum sobre uma questão, é o seguinte aqui tenho diversas planilhas em excel com macro habilitada que possui dados vindos do sql server, precisando assim toda semana de atualização, é preciso abrir as planilhas e ir atualizando cada uma e ai a consulta roda no banco novamente.

    queria saber se no C# teria como eu fazer um aplicativo que abra essas planilhas no servidor e atualize as mesmas automaticamente indo de uma por uma, logo depois a fechasse e isse pra outra. Pensei em abrir pelo caminho da mesma mas tenho que saber como vou salvar as alterações.

    alguem teria uma ideia? dei uma olhada no namespace Microsoft.Office.Interop mas não conheço bem ele ainda.

     

    segunda-feira, 20 de setembro de 2010 17:08

Respostas

  • Então, no fim não usei o namespace Microsoft.Office.Interop.Excel tentei varios métodos só que pra minha situação sempre algo dava errado, então resolvi da seguinte forma marco a opção na planilha de atualizar assim que for aberta e todas estão no servidor, sendo assim se aguem acessar fora ela não atualiza não pesando a rede.

    Abro a planilha com a classe Process e peço pra aguardar um tempo determinado pra cada planilha atualizar, fazendo assim não pude controlar o tempo que cada documento leva pra atualizar tive que colocar um tempo padrão que sei que será suficiente pra que se atualize, sendo assim depois desse tempo fecho e vou para o próximo, pode ser que haja outra solução mas no momento encontrei essa.

    quando tiver um tempo vou estudar mais as Bibliotecas referentes ao office, de qualquer forma agradeço a disposição principalmente do André em ajudar.

     

    sexta-feira, 1 de outubro de 2010 20:16
  • Alexandre,

    Nossa, agora entendi! Pensei que era algo completamente diferente...

    Então... No seu caso, talvez você consiga chamar um RefreshAll utilizando Office Automation... Veja se esta outra thread te ajuda:

    http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b288098d-d4e8-4845-ae3f-38ad235e22aa

    Mais especificamente, seria este método que eu tentaria utilizar:

    http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.workbook.refreshall(VS.80).aspx


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    terça-feira, 28 de setembro de 2010 23:08
    Moderador
  • Alexandre,

    Esse é difícil hein... Pensei que o RefreshAll ficasse esperando a planilha atualizar para liberar o processamento... Pelo que vi, não tem nenhum evento que você possa fazer isso diretamente... Você poderia tentar os eventos SheetCalculate ou SheetPivotTableUpdate, mas, não sei se vai resolver...

    Talvez um workaround seria você chamar um Save da planilha após o RefreshAll... Aí, você poderia ficar monitorando a propriedade Saved da planilha pra ver se acabou de salvar... Não sei se essa alternativa pode resolver também... Só testando...

    Se eu encontrar algo mais direcionado, volto aqui pra te indicar...


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Marcado como Resposta Alexandre Cross sexta-feira, 1 de outubro de 2010 20:33
    quinta-feira, 30 de setembro de 2010 19:54
    Moderador

Todas as Respostas

  • Salve!

    Dê uma olhada nesse material: http://csharpbrasil.com.br/2010/04/02/criar-ler-e-modificar-arquivos-excel-sem-uso-da-interoperabilidade-ou-conexao-oledb/

    Mas, minha opinião é que o uso de Interop é melhor: http://dotnetperls.com/excel-interop

    Abs

    segunda-feira, 20 de setembro de 2010 22:39
  • Alexandre,

    Sugiro também que você dê uma olhada no post "adesivo" do fórum de C# que apresenta vários links para tutoriais (http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/52255833-a691-4fed-9db3-832d68a00ff8)... Dois deles abordam a atualização de arquivos Excel utilizando tanto Office Automation quanto OleDb...


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    quinta-feira, 23 de setembro de 2010 23:13
    Moderador
  • Pessoal, obrigado por enviar os links mas o que estou precisando mesmo é depois de abrir a planilha pelo C# eu conseguir disparar o comando de atualização de dados, porque estou usando fonte de dados no excel vindo do banco de dados sql server, estou fazendo isso manualmente e quero automatizar pra deixar por exemplo as planilhas atualizando em um horario fora do horario de trabalho porque demora ir uma por uma.

    Teria algum comando no VB na parte Desenvolvedor do excel em que eu poderia colocar pra atualizar automaticamente após o evento de abertura da planilha? se souberem alguma coisa me falem, porque ai eu poderia fazer um aplicativo em C# que abrisse as planilhas e o proprio excel ja começaria a atualiza-la.

    terça-feira, 28 de setembro de 2010 13:50
  • Pensando bem não daria pra fazer o que eu disse acima pois toda vez que o usuário abrir a planilha faria uma conexão ao banco, estou procurando uma solução pra fazer isso.
    terça-feira, 28 de setembro de 2010 16:27
  • Alexandre,

    Não entendi o problema... Você pega a planilha do banco e salva local em um diretório temporário... Ao abrir a planilha utilizando Office Automation, as fórmulas são recalculadas... Não é isso que você quer?


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    terça-feira, 28 de setembro de 2010 16:39
    Moderador
  • É o seguinte André, tenho planilhas que usam a fonte de dados, não tenho nenhuma formula, aqui apenas tem na aba dados do excel e em conexões uma conexão com o SQL Server e uma consulta em sql que pega dados do banco e apenas joga na planilha os dados referente a consulta especificada.

    Só que toda semana necessito atualizar porque como os dados ficam no banco as planilhas ficam desatualizadas, então tenho que ir em Dados-->Conexões e clicar em atualizar só que esse processo demora, queria poder fazer essa atualização via programação, porque ai faria uma aplicação com uma  rotina pra rodar de madrugada por exemplo e fazer isso automático. Mas pra isso preciso saber como vou e se posso ter acesso a essa opção de atualizar as conexões feitas com o sql server via C#. A extensão das planilhas é xlsm.

     

     

     

    terça-feira, 28 de setembro de 2010 17:51
  • Alexandre,

    Nossa, agora entendi! Pensei que era algo completamente diferente...

    Então... No seu caso, talvez você consiga chamar um RefreshAll utilizando Office Automation... Veja se esta outra thread te ajuda:

    http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b288098d-d4e8-4845-ae3f-38ad235e22aa

    Mais especificamente, seria este método que eu tentaria utilizar:

    http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.workbook.refreshall(VS.80).aspx


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    terça-feira, 28 de setembro de 2010 23:08
    Moderador
  • Obrigado André isso resolveu parte do meu problema aqui usando o Método RefreshAll(), só que preciso ainda de uma propriedade ou método que verifique se a planilha está em modo de atualização para que quando terminasse a atualização eu fechasse a planilha atualmente aberta e fosse pra próxima, ja estou procurando alguma solução pra isso aqui mas se souberem de algo me falem.

    A questão também é que primeiro creio que o excel faça a consulta no banco as vezes bastante demorada ficando o excel sem responder por alguns minutos logo após isso o excel volta a responder e dispara um comando de atualizar os dados, durante esse tempo não posso fechar a planilha somente posso fechar depois que executou tanto a consulta quanto a atualização.

     

    quinta-feira, 30 de setembro de 2010 19:43
  • Alexandre,

    Esse é difícil hein... Pensei que o RefreshAll ficasse esperando a planilha atualizar para liberar o processamento... Pelo que vi, não tem nenhum evento que você possa fazer isso diretamente... Você poderia tentar os eventos SheetCalculate ou SheetPivotTableUpdate, mas, não sei se vai resolver...

    Talvez um workaround seria você chamar um Save da planilha após o RefreshAll... Aí, você poderia ficar monitorando a propriedade Saved da planilha pra ver se acabou de salvar... Não sei se essa alternativa pode resolver também... Só testando...

    Se eu encontrar algo mais direcionado, volto aqui pra te indicar...


    André Alves de Lima
    Visite o meu site: http://andrealveslima.spaces.live.com
    Me siga no Twitter: @andrealveslima
    • Marcado como Resposta Alexandre Cross sexta-feira, 1 de outubro de 2010 20:33
    quinta-feira, 30 de setembro de 2010 19:54
    Moderador
  • Então, no fim não usei o namespace Microsoft.Office.Interop.Excel tentei varios métodos só que pra minha situação sempre algo dava errado, então resolvi da seguinte forma marco a opção na planilha de atualizar assim que for aberta e todas estão no servidor, sendo assim se aguem acessar fora ela não atualiza não pesando a rede.

    Abro a planilha com a classe Process e peço pra aguardar um tempo determinado pra cada planilha atualizar, fazendo assim não pude controlar o tempo que cada documento leva pra atualizar tive que colocar um tempo padrão que sei que será suficiente pra que se atualize, sendo assim depois desse tempo fecho e vou para o próximo, pode ser que haja outra solução mas no momento encontrei essa.

    quando tiver um tempo vou estudar mais as Bibliotecas referentes ao office, de qualquer forma agradeço a disposição principalmente do André em ajudar.

     

    sexta-feira, 1 de outubro de 2010 20:16