Array
(
)

Importar arquivo excel .net

Renato
|
MVP
Pontos: 1000
    23 jul 2014

Prezados,
Me deparei com o seguinte problema "a empresa onde trabalho possui um sistema externo que está com problemas para exportar uma grande quantidade de colunas de um relatório num total de 20 colunas, assim, é preciso efetuar a exportação duas vezes, um exemplo seria exportar 12 colunas em um arquivo e 8 colunas em outro arquivo". Devido a esta situação foi designado para a equipe desenvolver uma aplicação C# e Asp .NET que importasse os dois arquivos e automaticamente estes fossem juntados, ou seja, eu faria um FileUpload destes dois arquivos e mandava importar, nesse mesmo botão "importar" terá que ser feito com que o arquivo de 8 colunas se junte ao de 12 colunas de modo sequencial e gere um único arquivo com as 20 colunas. Alguém poderia me ajudar de como fazer essa junção de colunas?
OBS: Entramos em contato com a empresa que desenvolveu o sistema, mas este está morto. Ninguém mais o desenvolve.
Desde já agradeço.

Faabiianooc
   - 23 jul 2014

Voces não possuem acesso ao banco de dados? Acredito que seja mais facil realizar a importação diretamente do banco, mas também acredito que seja possível realizar a tarefa que voce sugeriu.

Renato
|
MVP
Pontos: 1000
    23 jul 2014

Infelizmente não temos acesso ao banco de dados, a empresa não liberou o acesso. O problema está nisso, pois não tenho relacionamento entre entre as colunas, é uma consulta dinâmica. A questão é em como dar continuidade ao primeiro arquivo a partir da 13ª coluna seguindo o exemplo na primeira mensagem sem o vinculo dos campos? no meu ponto de vista é impossível.

Joel Rodrigues
   - 23 jul 2014

Você pode abrir os dois arquivos, fazer um loop sobre as linhas de um deles (já que ambos possuem a mesma quantidade de linhas) e acessar as colunas de ambos na mesma iteração. Algo do tipo:
#Código

valorColuna1 = arquivo1[0];
valorColuna2 = arquivo1[1];
...
valorColuna13 = arquivo2[0];
valorColuna14 = arquivo2[1];
...

Renato
|
MVP
Pontos: 1000
    25 jul 2014

Joel, os arquivos excel não possuem o mesmo números de linhas, pois alguns campos tem relacionamento e gera mais de uma informação. Um exemplo seria uma OS para "manutenção" e "instalação", no segundo arquivo será exibido duas linhas referente a esta OS gerando assim um maior número de linhas do que primeiro arquivo. Devido as circunstâncias na aplicação que será desenvolvida será criado um banco de dados para a junção dos arquivos. Agora a dúvida é como fazer a importação destes dois arquivos de uma vez, alguém poderia me ajudar?

Renato
|
MVP
Pontos: 1000
    25 jul 2014

Joel, os arquivos excel não possuem o mesmo números de linhas, pois alguns campos tem relacionamento e gera mais de uma informação. Um exemplo seria uma OS para "manutenção" e "instalação", no segundo arquivo será exibido duas linhas referente a esta OS gerando assim um maior número de linhas do que primeiro arquivo. Devido as circunstâncias na aplicação que será desenvolvida será criado um banco de dados para a junção dos arquivos. Agora a dúvida é como fazer a importação destes dois arquivos de uma vez, alguém poderia me ajudar?

Joel Rodrigues
   - 28 jul 2014

Então não entendi bem. Deu a impressão de que são dois arquivos que se complementam. Um com algumas colunas, e outro com o restante das colunas da mesma tabela. Então não é isso? São arquivos separados, com dados distintos?

Joel Rodrigues
   - 28 jul 2014

Se forem arquivos separados, qual é sua dificuldade? Basta ler um arquivo, depois o outro e enviar os dados para o seu banco, um arquivo de cada vez.

Renato
|
MVP
Pontos: 1000
    28 jul 2014

Os arquivos são contínuos, um complementa o outro. Mas, é uma consulta dinâmica onde podem solicitar vários campos de tabelas diferentes. No primeiro arquivo eu possuo 10 colunas e no outro outras 10. Porém, o número de registro alteram nestes arquivos.
Exemplo: No primeiro arquivo excel eu possuo algumas informações sobre as ordens de serviço (OS). No segundo, tem colunas que são referentes a cada serviço que é composta por "manutenção, instalação, reparação, entre outras" das OS. Com isso, no segundo arquivo eu possuo uma média 3 registros por OS de um determinado contrato, ou seja, no segundo arquivo posso ter registros repetidos nas colunas "contrato" e "OS" e diferentes na coluna "serviço".
No contrato "xxx" da os "yyy" possuo serviço "zzz".
No contrato "xxx" da os "yyy" possuo serviço "www".

Entendeu o processo Joel?

Creio que a solução mais prática para da junção dos arquivos seja salvar os dados no banco separadamente em suas respectivas tabelas, depois fazer uma consulta e salvar todos os dados em uma tabela a parte.

Hoje preciso de uma solução para fazer a importação do arquivo excel, vi alguns exemplos utilizando o OLEDB e não obtive sucesso, saberia me ajudar quanto a isso?

Joel Rodrigues
   - 31 jul 2014

Agora entendi.
Os arquivos contém dados distintos, e pelo que vi há uma relação de mestre-detalhes entre eles.
Não vejo problema nenhum em ler um arquivo de cada vez, a começar pelo "mestre" ou "tabela pai", que é o das OS. Em seguida lê o outro com os serviços (detalhes ou tabela filha).
E com relação ao banco, com certeza a melhor estrutura a ser usada é a de duas tabelas), que se relacionam pelo campo chave da OS.

Joel Rodrigues
   - 31 jul 2014

Com relação a como importar, com OLE DB deveria dar certo. Você obteve algum erro?

Renato
|
MVP
Pontos: 1000
    05 ago 2014

Joel, tive o erro de "não foi possível localizar ISAM instalável". Tanto desktop como Web. Saberia me informar como resolver?

Joel Rodrigues
   - 06 ago 2014

Na sua string de conexão, o parâmetro DataSource está escrito junto (DataSource) ou separado (Data Source)? Se estiver junto, separe e teste.
Parece besteira, mas já vi em algum fórum algo sobre isso.

Renato
|
MVP
Pontos: 1000
    08 ago 2014

Joel, consegui solucionar o problema. Todas as minhas ferramentas são 64 bits, por lógica a biblioteca Microsoft Access Database também deveria ser. Porém, tive que instalar a versão 32 para o OleDb funcionasse. Estranho mais ta rodando, kkkk! Obrigado pelas dicas.

Renato
|
MVP
Pontos: 1000
    08 ago 2014

Joel, consegui fazer a importação de um arquivo através do código abaixo:

#Código

            string conexao = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source='D:\Ramon\planilha.xlsx';Extended Properties='Excel 12.0; HDR=Yes\";
            OleDbConnection origem = default(OleDbConnection);
            origem = new OleDbConnection(conexao);

            OleDbCommand selecao = default(OleDbCommand);
            selecao = new OleDbCommand("SELECT * FROM [Plan$]", origem);

            OleDbDataAdapter adaptador = new OleDbDataAdapter();
            adaptador.SelectCommand = selecao;

            DataSet ds = new DataSet();
            adaptador.Fill(ds);

            gdvDados.DataSource = ds.Tables[0];

            origem.Close();

            SqlConnection destino = new SqlConnection();
            destino.ConnectionString = @"Server=.\SQLEXPRESS; Database=Importacao; Trusted_Connection = True";

            destino.Open();

            SqlBulkCopy importar = default(SqlBulkCopy);
            importar = new SqlBulkCopy(destino);
            importar.DestinationTableName = "Teste";
            importar.WriteToServer(ds.Tables[0]);
            destino.Close();


Com isso, gostaria de saber se você saberia me informar como ler um segundo arquivo?
Criei uma tabela para cada arquivo e insiro o mesmo comando no segundo botão com os dados da tabela referente ao arquivo.

*Não me recordo o nome do erro, depois posto aqui. Mas, sei que acontece na linha "importar.WriteToServer(ds.Tables[0]);"

Renato
|
MVP
Pontos: 1000
    15 ago 2014

Resolvido, obrigado pela ajuda de todos.

Joel Rodrigues
   - 15 ago 2014

Opa, desculpe a demora. Andei meio ausente do fórum.
Fico feliz que tenha conseguido.
Abraço.