Colocar Resposta 
 
Avaliação do Tópico:
  • 0 votos - 0 Média
  • 1
  • 2
  • 3
  • 4
  • 5
VB.NET Excel Resource File
28-09-2011, 12:09
Mensagem: #1
VB.NET Excel Resource File
Boas,

Sei que VB não deve ser muito popular mas tenho tido problemas numa aplicação que estou a desenvolver. Eu sou auto didacta, pelo que peço alguma paciência se não perceber à primeira.

Então aqui vai:
Eu desenvolvi uma folha Excel com carradas de macros. Para que o futuro utilizador não possa alterar a folha eu estou a desenvolver uma aplicação no visual studio em visual basic que trabalha sobre o ficheiro. Até agora tenho usado o directório onde está o ficheiro excel e consigo fazer tudo o que quero sobre a folha: inserir dados, retirar dados, correr macros, etc. Mas está na hora de fazer o build e preciso que a aplicação compile o ficheiro. Eu sei que tem a ver com Resource Files mas estes apenas podem ser txt ou binários (na categoria other Resources file types, nas propriedades do projecto).

Alguém me sabe dizer como posso "assemblar" o ficheiro na aplicação e como é que posso chamá-lo no código, definir correctamente o tipo de ficheiro (xlsm) e guardá-lo numa variável, por exemplo, xlbook, para não ter de alterar o resto do código cada vez que este trabalha sobre o ficheiro Excel?

Cumprimentos.

PS: já tentei carregar o ficheiro manualmente no projecto, definir a propriedade "Build Action" as "Embedded Resource", trocar o directório pelo nome do ficheiro, mas ele não reconhece e dá erro.
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
28-09-2011, 13:21 (Esta mensagem foi modificada pela última vez a: 28-09-2011 13:22 por Caça.)
Mensagem: #2
RE: VB.NET Excel Resource File
Se sempre que vais usar essa folha ela tem de estar vazia(tipo um template), adiciona-la aos Resources do projecto e no momento em que vais precisar dela, só tens de a extrair para uma pasta.
Caso contrario coloca-a na pasta onde está o executável ou na pasta AppData do Windows e faz as alterações a partir de lá.
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
28-09-2011, 14:21 (Esta mensagem foi modificada pela última vez a: 28-09-2011 14:33 por MininiM.)
Mensagem: #3
RE: VB.NET Excel Resource File
(não sei se me expliquei bem à primeira)

Mas isso não resolve o problema quando eu tiver que entregar o executável aos utilizadores. Queria evitar que a instalação da aplicação implicasse o copiar de ficheiros externos para pastas especificas. Ou, se não houver alternativa, ao menos que esse processo fosse automático aquando da instalação.

Para que se perceba melhor: neste momento, o load do form principal inclui a execução do Excel e a abertura do ficheiro:

---
xlapp = CreateObject("Excel.Application")
xlbook = xlapp.workbooks.Open("C:\(...)\FolhaExcel.xlsm")
xlapp.Visible = False
---

A inicialização das variáveis públicas como Excel.Application e Excel.workbook estão num módulo à parte para funcionarem em todos os form's. Ora, tal como está a aplicação, esta depende que o ficheiro esteja no directório C:\(...)\FolhaExcel.xlsm . Quando entregar a aplicação, tanto o ficheiro tem de estar compilado conjuntamente, como o código para abertura do ficheiro não pode depender de um directório. Ao configurar o ficheiro como Resource, ele não aceita a identificação do ficheiro com a extensão .xlsm, mas ao contrário, o windows não sabe qual é o ficheiro que estou a chamar.

Ainda pensei nisto, depois de ter configurado o ficheiro como Embedded Resource, mas não funciona porque não tem a extensão, com extensão ele dá erro.

---
xlapp = CreateObject("Excel.Application")
xlbook = xlapp.workbooks.Open.Me.Resources ("FolhaExcel") ' Eu sei que esta linha não faz muito sentido
xlapp.Visible = False
---

Espero ter me explicado melhor.
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
28-09-2011, 16:39
Mensagem: #4
RE: VB.NET Excel Resource File
Bem,

Não queria mas vou resolver a questão com um ficheiro .bat e coloco o ficheiro Excel numa pasta DATA.

Obrigado na mesma.
Se quiserem ir postando sugestões serão sempre bem vindas.

Cumprimentos
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
28-09-2011, 23:56
Mensagem: #5
RE: VB.NET Excel Resource File
E então?
Define uma pasta onde vai estar a tua folha.
No arranque da aplicação, verificas se a folha existe, caso não exista, copias-la dos Resources para essa pasta(isto iria acontecer no primeiro arranque da aplicação no cliente ou caso alguém apaga-se a folha e assim prevenias um futuro erro).
A partir daqui, podes trabalhar normalmente.
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
29-09-2011, 00:47
Mensagem: #6
RE: VB.NET Excel Resource File
Viva,

"Sei que VB não deve ser muito popular mas tenho tido problemas numa aplicação que estou a desenvolver."

Quem disse? Em que te baseias? O VB é uma linguagem tão ou mais usada como qualquer outra.

Quanto à tua questão não percebi lá muito bem... O teu problema é a localização do ficheiro ou não queres que ninguém tenha acesso? Quando o ficheiro se encontra nos resources, se não me engano, não consegues guardar informação, somente ler, a num ser que no run time da aplicação a copies para uma pasta. Mesmo que desse para editar dentro do resource não seria boa politica visto que o excel, tal como o access, é um ficheiro simples de dados que está sujeito a ficar danificado e por consequente toda a aplicação ficaria inviabilizada porque depois não daria para reparar o mesmo para salvaguardar os dados.

Experimenta dizeres à aplicação de que esta tem de ir sempre buscar essa dita folha de excel ao directória da própria app, seja ela qual for. Para isso podes usar o seguinte código:

Dim excelFilePath As String = System.Reflection.Assembly.GetExecutingAssembly.Location & "\FolhaExcel.xlsm"

xlapp = CreateObject("Excel.Application")
xlbook = xlapp.workbooks.Open(excelFilePath)
xlapp.Visible = False

Não tenho aqui compilador à mão mas penso que é assim. Experimenta e vê se é isso que necessitas.

Cumps,
Manuel Rocha

[Imagem: pplware_staff.png]
Licenciado em Informática para a Saúde pela ESTG Leiria
Mestrado em Informática - Especialização em Sistemas de Informação na Universidade Portucalense
Especialização em Design Gráfico
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
29-09-2011, 17:03
Mensagem: #7
RE: VB.NET Excel Resource File
(29-09-2011 00:47)rei007 Escreveu:  Dim excelFilePath As String = System.Reflection.Assembly.GetExecutingAssembly.Location & "\FolhaExcel.xlsm"

xlapp = CreateObject("Excel.Application")
xlbook = xlapp.workbooks.Open(excelFilePath)
xlapp.Visible = False

Ok, essa é uma boa solução, mas como é que o ficheiro vai lá parar, como é que publico a aplicação com o ficheiro integrado? E se tiver haver com data files esquece porque só tenho a versão Express.

Eu já tenho uma solução ainda que não seja ideal, .bat:
---
md C:\Qualquercoisa
copy Data\DataExcelFile.xlsm C:\Temp
Data\instal
---

Obrigado,

PS: só disse que não devia ser muito popular porque na minha faculdade falei com muita gente do departamento de informática e todos me diziam que ninguém trabalhava com VBStudio. Fiquei com esta impressão.
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
29-09-2011, 17:08 (Esta mensagem foi modificada pela última vez a: 29-09-2011 17:19 por rei007.)
Mensagem: #8
RE: VB.NET Excel Resource File
Viva,

Agora fiquei ainda mais intrigado. Mas afinal o que é que pretendes fazer? Não pretendes distribuir a aplicação com o ficheiro excel a acompanhar?


Após uma pequena pesquisa encontrei este código que aparentemente faz o que pretendes (Retirado daqui):

Código:
Imports System
Imports System.IO
Imports System.Reflection

Public Class ApplicationEmbeddedFile

      Public Shared Sub SaveToDisk(ByVal resourceName As String, ByVal fileName As String)

            ' Get a reference to the running application.
            Dim assy As [Assembly] = [Assembly].GetExecutingAssembly()

            ' Loop through each resource, looking for the image name (case-insensitive).
    For Each resource As String In assy.GetManifestResourceNames()

      If resource.ToLower().IndexOf(resourceName.ToLower) <> -1 Then

        ' Get the embedded file from the assembly as a MemoryStream.
        Using resourceStream As Stream = assy.GetManifestResourceStream(resource)

          If resourceStream IsNot Nothing Then
            Using reader As New BinaryReader(resourceStream)

              ' Read the bytes from the input stream.
              Dim buffer() As Byte = reader.ReadBytes(CInt(resourceStream.Length))
              Using outputStream As New FileStream(fileName, FileMode.Create)
                Using writer As New BinaryWriter(outputStream)

                  ' Write the bytes to the output stream.
                  writer.Write(buffer)
                End Using
              End Using
            End Using
          End If

        End Using

        Exit For

      End If

    Next resource

  End Sub

End Class

Depois para usares isto basta chamares a seguinte linha de código:

Código:
ApplicationEmbeddedFile.SaveToDisk("MyWave.wav", "C:\Temp\MyWave.wav")

O que isto faz é simplesmente ir buscar o ficheiro excel que se encontra nos resources do programa e copiar para uma determinada localização.

Para copiares para a localização da aplicação, basta fazeres o seguinte:

Código:
ApplicationEmbeddedFile.SaveToDisk("MyWave.wav", System.Reflection.Assembly.GetExecutingAssembly.Location & "\MyWave.wav")

Era isto que pretendias?

No google apenas pesquisei por "embeb excel file with vb.net resources" e foi logo o primeiro resultado, ou melhor, o segundo.

Tinha um prof na universidade que numa cadeira de C# ele disse, as ferramentas estão em tal parte e os exercícios estão em tal sitio. Nesse ponto eu perguntei ao professor "O professor não vai explicar?" ao que ele me respondeu "O google é teu amigo. Repara que nem eu preciso ir ao quiosque para ler o jornal."

A partir desse dia o google passou a ser o meu professor para tudo. Na escola o Google é mais que teu amigo. É preciso é ter vontade de lhe ir perguntar.

Cumps,
Manuel Rocha

[Imagem: pplware_staff.png]
Licenciado em Informática para a Saúde pela ESTG Leiria
Mestrado em Informática - Especialização em Sistemas de Informação na Universidade Portucalense
Especialização em Design Gráfico
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
29-09-2011, 18:02
Mensagem: #9
RE: VB.NET Excel Resource File
"Não pretendes distribuir a aplicação com o ficheiro excel a acompanhar?" - Yup. Mas o cliente é único - Mas queria que fosse tudo automático, não vou dizer, instale isto, crie uma pasta ali, passe o ficheiro para aculá...o que seria.

- Na solução que falei uso um ficheiro bat, ponho tudo numa pasta \Data - o ficheiro excel e os ficheiros de instalação da aplicação. O nome do ficheiro bat vai como "instalar" e o código que coloquei antes faz tudo o que se deveria fazer à pata. Mas é uma solução um pouco "ordinária".

--

Irei olhar com atenção e testar embora apenas pense que falte uma pequena coisa, o ficheiro enquanto resource (other) tem extensão? Ele na pasta resources tem, mas quando o chamava por exemplo com o método My.Resources(ExcelFile) assim já não sabia que era um ficheiro Excel. Dava - Action on binary file was unhandable... ou coisa parecida

Seria necessário, na tua solução, concatenar .xlsm quando copiasse para o output directory?

De resto, o google tem sido o meu único professor, tudo o que sei surgiu de lá. Mas estava a falhar, quer dizer, trouxe-se me até aqui.... Eu tentava "VB excel as resource file" e variações mas nunca cheguei lá.

Obrigado
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
29-09-2011, 18:19
Mensagem: #10
RE: VB.NET Excel Resource File
Para te facilitar a vida fiz-te um pequeno projecto utilizando o que eu te dei.

Vê anexo.

Para replicares basta fazeres tal e qual como vês. Depois é só adicionares o teu ficheiro excel ao teu projecto mas não como resource. Adiciona-o como se fosse um ficheiro normal. Depois vais às propriedades do ficheiro (no visual studio) e no Build Action colocas Embeb resource. Vais ver que vai funcionar.

Para conseguires abrir o meu projecto tens de ter o visual studio 2010 premium e a .NET framework 4 instalada.

Mas podes sempre abrir o Form1.vb no bloco de notas e ver como está o código. Na pasta bin\debug tens lá um exe de exemplo para poderes ver o produto a funcionar.


Ficheiro(s) anexado(s)
.zip  WindowsApplication1.zip (Tamanho: 88,09 KB / Downloads: 11)

Cumps,
Manuel Rocha

[Imagem: pplware_staff.png]
Licenciado em Informática para a Saúde pela ESTG Leiria
Mestrado em Informática - Especialização em Sistemas de Informação na Universidade Portucalense
Especialização em Design Gráfico
Visitar Website de este utilizador Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
Colocar Resposta 


Saltar Fórum:


Utilizadores a ver este tópico: 4 Visitante(s)