• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Weasel

[VB.NET 2k5] Ficheiros XLS (EXCEL)

22 mensagens neste tópico

Como posso abrir ficheiros XLS (Excel) Para poder ler dados e escrever das celulas ?

Ou seja o programa que quero criar vái ser básicamente uma Interface para os ficheiros XLS que mais tarde vão ser processados automáticamente (mas isto já não é comigo).

Tentei alguns codigos que mostram aqui mas são para VB6 eão sempre erro, não consigo usar...

Basicamente só percisava de Como ligar ao ficheiro teste.xls, e como ler e escrever das respectivas celulas.

Obrigado a Todos que me possam ajudar!

:cheers:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas.

Adiciona uma referencia ao Microsoft Excel 11.0 Object Library (versao 2003)

Option Strict On
Option Explicit On

Imports Microsoft.Office.Interop.Excel

Dim objPrograma As New Microsoft.Office.Interop.Excel.Application '' cria novo excel
Dim objLivro As Microsoft.Office.Interop.Excel.Workbook = objPrograma.Workbooks.Add '' novo livro
Dim objFolha As Microsoft.Office.Interop.Excel.Worksheet = DirectCast(objPrograma.ActiveSheet, Microsoft.Office.Interop.Excel.Worksheet) '' nova folha
objPrograma.Visible = True '' prog visivel
objFolha = DirectCast(objPrograma.ActiveSheet(), Microsoft.Office.Interop.Excel.Worksheet) '' seleciobna folha activa
objFolha.Range("A1").Value = "ola" '' escreve na celula a1
messagebox.show(objFolha.Range("A1").Text.ToString) '' le valor celula a1
objLivro.SaveAs("c:\teste.xls") '' grava como

'' liberta recursos
objLivro.Close()
objFolha = Nothing
objPrograma.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(objPrograma)
objPrograma = Nothing
GC.Collect()
GC.WaitForPendingFinalizers()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:hmm:

Deu-me erro quando testei esse codigo

Aqui:

Dim objLivro As Microsoft.Office.Interop.Excel.Workbook = objPrograma.Workbooks.Add '' novo livro

deu este erro: Biblioteca de formato antigo ou de tipo inválido. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))

E na Immediate Window apareceu: A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in Excel Proj.exe

----

É assim, eu nem perciso de criar os ficheiros xls, basta-me mesmo poder abrir ficheiros já existentes e edita-los (Ler/Escrever), mas claro se pudermos criar, o projecto ficava mais completo.

Obrigado pela atenção  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

há uns tempos tive um problema semelhante (não digo igual porque já não me lembro bem, mas acho que era) e o problema era devido a diferentes línguas entre o default do pc (português) e o excel (inglês). Vê o tópico http://www.portugal-a-programar.pt/index.php?showtopic=4086 , a solução está lá, e também a página da microsoft que descreve esse bug.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

há uns tempos tive um problema semelhante (não digo igual porque já não me lembro bem, mas acho que era) e o problema era devido a diferentes línguas entre o default do pc (português) e o excel (inglês). Vê o tópico http://www.portugal-a-programar.pt/index.php?showtopic=4086 , a solução está lá, e também a página da microsoft que descreve esse bug.

Cumps

Eu axo que já tropecei com esse topic, mas vou ver denovo....

Agora um detalhe, será q isso terá mesmo influencia ? é que eu queria apenas abrir ficheiros xls, ou seja, este programa em prencipio até funcionaria em computadores sem o Excel.

Não é essa a intenção, mas não tenho razão ?

:humm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:'(

Não consegui usar nenhum dos códigos que tens nesse teu Post...

Alguém me ajuda ?

Asgorath sabes porque o teu código dá erro ?

Obrigado a todos...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu tenho em Ingles o Microsoft office Professional Edition

Build 11.5612.5606

Será disso ?  :shocking:

Mas o que eu pretendia era apenas abrir um FILE.XLS e poder ler e escrever nele.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens o excel 2003 Ing acrescenta  a seguinte linha código a ver se funciona.

System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:cheesygrin:

Já não deu erro, e criou o ficheiro com os dados conforme era suposto, tu dominas isto.

Mas agora umas dúvidas se me permites, o código que me deste, cria o ficheiro, e se eu quizesse apenas abrir um já existente, como seria ?

Outra coisa, com este código temos que ter o Excel instalado no computador onde correr esta aplicação certo? Mas pode ser qualquer versão do exel? Não há maneira de fazer com que seja independente do Excel (ou seja que dê sem o ter instalado), se não for, tem que se definir em que lingua está o excel instalado né?

Obrigado por tudo!

worthy.gif

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para abrir é da seguinte forma

Option Strict On
Option Explicit On

Imports Microsoft.Office.Interop.Excel

Dim objExcel As Microsoft.Office.Interop.Excel.Application
Dim Books As Microsoft.Office.Interop.Excel.Workbooks
Dim Book As Microsoft.Office.Interop.Excel.Workbook
Dim Sheet As Microsoft.Office.Interop.Excel.Worksheet


'' selecciona o ficheiro excel a abrir
ficheiro = String.Empty
Me.OpenFileDialog1.Filter = "Ficheiros Excel|*.xls"
Me.OpenFileDialog1.ShowDialog()
ficheiro = Me.OpenFileDialog1.FileName
'' se precionou 'cancel' entao sai fora
If ficheiro.Trim = String.Empty Then Return

'' cria uma nova instancia do Excel
objExcel = New Microsoft.Office.Interop.Excel.Application
objExcel.Visible = True
Books = objExcel.Workbooks
'' abre o livro
Book = Books.Open(ficheiro)
Sheet = DirectCast(Book.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet)
DirectCast(Book.Sheets("Sheet1"), Microsoft.Office.Interop.Excel.Worksheet).Activate()
Sheet = DirectCast(Book.ActiveSheet, Microsoft.Office.Interop.Excel.Worksheet)

O código deve de funcionar com versões anteriores a 2003 , talvez funcione no 2007. Tens que adicionar um projecto de setup que vai acrescentar o excel.exe na instalação.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Funcionou Tudo, Muitissimo obrigado, vou trabalhar nisto, qualquer coisa, eu aviso ;)

Só um detalhe, tu dizes para usar o setup para acrescentar o excel.exe na instalação, basta esse ficheiro ? e a aplicação que eu estou a fazer vái ir buscar o excel.exe caso este não esteja instalado no sistema ?

Mais uma vez Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

instala sempre o excel.exe e as dll necessárias na directoria de instalação  mesmo que tenhas o  office  instalado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Asgorath, olá mais uma vez  :-[

É assim, eu estava aqui a tentar fazer o "meu" projecto mas quando chegou a hora de "separar o código, não consegui, quando eu digo separar o código quero dizer, por exemplo um comando abre o ficheiro XLS, mas depois noutro, por exemplo, para salvar, e ainda noutro para ler...

Tenho o código actualmente assim (basicamente como me deste)

Option Strict On
Option Explicit On
Imports Microsoft.Office.Interop.Excel

Public Class Form1

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")
        Dim objExcel As Microsoft.Office.Interop.Excel.Application
        Dim Books As Microsoft.Office.Interop.Excel.Workbooks
        Dim Book As Microsoft.Office.Interop.Excel.Workbook
        Dim Sheet As Microsoft.Office.Interop.Excel.Worksheet
        Dim ficheiro As String

        '' selecciona o ficheiro excel a abrir
        ficheiro = String.Empty
        Me.OpenFileDialog1.Filter = "Ficheiros Excel|*.xls"
        Me.OpenFileDialog1.ShowDialog()
        ficheiro = Me.OpenFileDialog1.FileName
        '' se precionou 'cancel' entao sai fora
        If ficheiro.Trim = String.Empty Then Return
        '' cria uma nova instancia do Excel
        objExcel = New Microsoft.Office.Interop.Excel.Application
        objExcel.Visible = False
        Books = objExcel.Workbooks
        '' abre o livro
        Book = Books.Open(ficheiro)
        Sheet = DirectCast(Book.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet)
        DirectCast(Book.Sheets(1), Microsoft.Office.Interop.Excel.Worksheet).Activate()
        Sheet = DirectCast(Book.ActiveSheet, Microsoft.Office.Interop.Excel.Worksheet)
        ''Sheet.Range("A5").Value = "ola" '' escreve na celula a5
        lblstatus1.Text = Sheet.Range("B11").Text.ToString
        ''MessageBox.Show(Sheet.Range("A1").Text.ToString) '' le valor celula a1
        Book.SaveAs("c:\teste.xls") '' grava como
        Book.Close()
    End Sub
End Class

Mas se separar o código dá logo erros de variaveis não declaradas e etc... estou a nora  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem a única coisa que me ocorre é que tens que adicionar ao teu form um OpenFileDialog chamado OpenFileDialog.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem a única coisa que me ocorre é que tens que adicionar ao teu form um OpenFileDialog chamado OpenFileDialog.

Sim, eu fiz isso, o teu código funciona 100% worthy.gif

Eu coloquei esse código (para testar) no Form1_Load, e deu tudo 100%, o problema foi quando tentei "separar" o código, ou seja, por exemplo no btnAbrir_Click Abria o ficheiro XLS, ao Clicar no btnSalvar Salva o ficheiro.... mas ao separar o código dá erros, pq diz que as variaveis não foram declaradas, tentei coloca-las na Class do Form1 (Public Class Form1) mas a linha :System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")

dá erro diz: Declaration Expected.

A minha dúvida é como posso fazer para separar o codigo, sem ter que correr o codigo todo sempre que quero fazer algo com o ficheiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estive a separar o código , ve se funciona

Option Explicit On 
Option Strict On

Imports Microsoft.Office.Interop.Excel

Public Class Form1
Private objExcel As Microsoft.Office.Interop.Excel.Application
Private Books As Microsoft.Office.Interop.Excel.Workbooks
Private Book As Microsoft.Office.Interop.Excel.Workbook
Private Sheet As Microsoft.Office.Interop.Excel.Worksheet

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US")
End Sub
Private Sub btnAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAbrir.Click
'' abre ficheiro
Dim ficheiro As String = String.Empty
Me.OpenFileDialog1.Filter = "Ficheiros Excel|*.xls"
Me.OpenFileDialog1.ShowDialog()
ficheiro = Me.OpenFileDialog1.FileName
'' se precionou 'cancel' entao sai fora
If ficheiro.Trim = String.Empty Then Return
'' cria uma nova instancia do Excel
objExcel = New Microsoft.Office.Interop.Excel.Application
objExcel.Visible = False
Books = objExcel.Workbooks
'' abre o livro
Book = Books.Open(ficheiro)
Sheet = DirectCast(Book.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet)
DirectCast(Book.Sheets(1), Microsoft.Office.Interop.Excel.Worksheet).Activate()
Sheet = DirectCast(Book.ActiveSheet, Microsoft.Office.Interop.Excel.Worksheet)
''Sheet.Range("A5").Value = "ola" '' escreve na celula a5
lblstatus1.Text = Sheet.Range("B11").Text.ToString
End Sub

Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
'' grava e fecha
Book.SaveAs("c:\teste.xls") 
Book.Close()
End Sub
End Class

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:tomato:  voltei mais depressa do que contava....

Como podemos "ver" se o ficheiro foi aberto? Estava a fazer isto para por exemplo se o user sair do programa, caso o ficheiro tenha sido aberto, ele faz Book.Close(), mas caso não esteja aberto, apenas sai...é que se meter o Book.Close() sem o ficheiro estar aberto vái dar erro.

Tentei

If (Book) Then

mas o Book não é boolean...  :shocking:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Basta definir uma variavel booleana JaAbriLivro e mete-la a true no fim do abrir.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Basta definir uma variavel booleana JaAbriLivro e mete-la a true no fim do abrir.

E hoje ainda não é sexta, eu fiz isso para verificar se já salvou...

Obrigado ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora