Upload de arquivo .xlsx para banco através de Aplicação Java

Você disse:

Imaginei que você quisesse fazer algum tipo de ação com o arquivo, além de, unicamente, colocar o mesmo numa tabela.
Se é essa a ideia, o EclipseLink até torna isso bem mais fácil para ti.

Eu não preciso fazer nenhuma alteração no mesmo, somente o upload.

De que maneira eu faço isso então?

Entendi.
Estamos falando de aplicação web, certo? Está usando o que nesta aplicação? JSF? Rest?

Aplicação web.
Utilizo JSF primefaces.
Servidor GlassFish
Banco Oracle
EclipseLink

O primefaces possui um componente para upload. Creio que o exemplo deles seja o mais simples de implementar.
Dá uma olhada e tenta aí.

O primefaces me dá apenas o front-end.

Eu quero saber como passar da aplicação pro banco…

Quais as outras exigências que o sr tem a fazer mesmo?

Eu não quero nada pronto amigo, eu disse que não achei em nenhum lugar algo que se aplique ao que eu quero e vim aqui atrás de um norte de como fazer. :slight_smile:

Chegou a ver esse link??

1 curtida

Assim fica melhor.
Primeiro, você entende que todo e qualquer arquivo é, nada mais, que um grande array de bytes?
Sendo assim, quando você realizar o upload deste arquivo, o primefaces envia um amontoado de dados, junto a algumas coisas (informações que ele acha necessárias).
Veja o exemplo que sugeri, lá tem o objeto que transporta o arquivo e como recuperar ele no managed bean.

Além disso, você precisa ter uma entidade em que um dos atributos seja um array de bytes, mapeado como @Lob, se não me engano.
A partir daí, é só associar uma coisa a outra e mandar gravar no banco.

Conforme a documentação do UploadedFile do primefaces, ele contém um método que permite obter só o array de bytes.
Ou seja, é moleza fazer a parte de gravar.

Vi a documentação aqui e não entendi uma coisa, o array de bytes é de cada coluna ou do arquivo todo como um só?

Ele faz exatamente o que eu não quero, passa na aplicação o aquivo e manda pro banco linha por linha, eu gostaria de mandar o arquivo todo e o banco realizar as inserções…

Deixa eu tentar explicar melhor.
Como eu disse antes, cada arquivo é um imenso array de bytes. O array em si é o arquivo.
Assim sendo, você dificilmente armazena um arquivo numa coluna do tipo varchar ou text (mysql ainda tem este tipo?).
O correto é inserir em uma coluna do tipo BLOB (existem outros, mas este é o mais utilziado).
Assim sendo, o array de bytes deve ser armazenado em uma única coluna.

Entendi o que você quis dizer agora, mas acho que eu que me dei a entender mal…

Eu disse que não iria haver a manipulação do arquivo, mas era durante o processo de inserção, depois eu irei precisar sim manipular todos os dados que eram contidos naquele arquivo.

Desculpe.

Estou achando que a solução vai ser passar linha por linha como se estivesse fazendo um cadastro na aplicação…

O arquivo salvo no BD, mesmo sendo um array de bytes, ainda é o arquivo.
Assim sendo, a qualquer tempo, você pode carregar esse array em memória e criar um arquivo temporário, o qual poderá ser lido, alterado, etc.

Entendi, que pena… mals ai!

O que eu estou querendo fazer é o seguinte.

Um arquivo excel que tenha por exemplo:

Coluna1 | Coluna2
Teste | Exemplo
Teste1 | Exemplo1
Teste2 | Exemplo2

Seja passado pra um banco que vai ter as mesmas colunas como espelho e vai receber esses dados.
Coluna1 | Coluna2

Para fazer isso eu achei inúmeras soluções, só que eu percebi que iria reter uma grande requisição do servidor da aplicação, pois todas pegavam uma linha, mandavam pro banco, pegavam a próxima…

Ai me ocorreu que se fosse possível mandar o arquivo pro banco e ele interpretasse tudo e fizesse os inserts nas colunas, como se fosse a aplicação.
Para depois pela aplicação eu conseguir acessar esses dados e realizar manipulações…

Fui mais claro agora?
Foi apenas uma ideia que eu tive e quis saber se era possível fazer :slight_smile:

É, se é esta a situação, a coisa fica mais complicada. Todas as ações demandam ler o arquivo, linha a linha, montar uma query gigantesca e mandar inserir (isso se não for inserindo linha a linha) no banco de dados.

1 curtida

Entendi, muito obrigado pelo seu tempo :slight_smile: