none
LINQ RRS feed

  • Pergunta

  • Bom dia ! Estou desenvolvendo uma aplicação para o meu estagio que vai ler varias sheets(são 5 sheets) de uma planilha e importar os dados processados na ultima sheet "Result". Bom estou conseguindo ler elas (usando somente a memoria e não usando o excel como banco), mas na hora de escrever os resultados esta a parte complicada...consigo fazer isso com a primeira parte somente que me falaram que o LINQ e o jeito mais rapido de fazer uma busca e gostaria de saber se voces podem me ajudar. Vou mostrar como estou lendo uma sheet assim voces podem entender o que estou fazendo.
    //Lendo sheet da Ordem
                    #region Leitura Ordem
                    wSheet = (Worksheet)wBook.Sheets[1];
    
                    
                    //A leitura da sheet comeca pela linha 2
                    int linhaOrdem = 2;
    
                    bool testeOrdem = true;
    
                    while (testeOrdem)
                    {
                        wRange = wSheet.get_Range("A" + linhaOrdem, "A" + linhaOrdem);
    
                        //Teste que verifica se tem algo nas linhas
                        if (wRange.Value != null && wRange.Value.ToString() != "")
                        {
                            Order order = new Order();
    
                            order.IdOrdem = Convert.ToInt32(wSheet.get_Range("A" + linhaOrdem, "A" + linhaOrdem).Value);
                            order.SalesModel = (wSheet.get_Range("B" + linhaOrdem, "B" + linhaOrdem).Value.ToString());
                            order.Qtd = Convert.ToInt32(wSheet.get_Range("C" + linhaOrdem, "C" + linhaOrdem).Value);
    
                            //Jogando os valores na lista
                            orders.Add(order);
                        }
                        else
                        {
                            testeOrdem = false;
                        }
                        linhaOrdem++;
                    }
                    
                    #endregion
    e na hora de escrever os dados estou fazendo isso abaixo :
    //Escrevendo os Resultados no sheet Result
                    #region Escrevendo Resultados
                    
                    wSheet = (Worksheet)wBook.Sheets[5];
    
                    int linhaResult = 2;
    
                    foreach (Order order in orders)
                    {
                        wRange = wSheet.get_Range("A" + linhaResult, "A" + linhaResult);
                        wRange.Value2 = order.IdOrdem;
    
                        wRange = wSheet.get_Range("B" + linhaResult, "B" + linhaResult);
                        wRange.Value2 = order.Qtd;
    
                        wRange = wSheet.get_Range("C" + linhaResult, "C" + linhaResult);
                        wRange.Value2 = order.SalesModel;
    linhaResult++;
                    }


    tem como agilizar isso com o LINQ ????

     

    Obrigado

    terça-feira, 1 de novembro de 2011 13:09

Respostas

  • Bruno eu tentei aqui, até que estava indo tudo bem, eu estava utilizando um componente que permite implementar LINQ no worksheets do Excel, até que na ordem deu tudo certo: 

    (http://code.google.com/p/linqtoexcel/)

    var bookOrdem = (from x in book.Worksheet(1)
                     select new Order()
                    {
                        //Coluna 1
                        IdOrdem = Convert.ToInt32(x[0].Value),
                        //Coluna 2
                        SalesModel = Convert.ToString(x[1].Value),
                        //Coluna 3
                        Qtd = Convert.ToInt32(x[2].Value)
                    }).ToList();
    
    orders.AddRange(bookOrdem);
    

     Mais quando fui fazer a estrustura, o componenete nao permite fazer join...

     
    var bookEstrutura = (from es in book.Worksheet(2)
                                         join o in orders
                                         on es[0].Value equals o.SalesModel
                                         select new Estrutura()
                                         {
                                             //Coluna 1
                                             SalesModelEstr = Convert.ToString(es[0].Value),
                                             //Coluna 2
                                             PartNumberEstr = Convert.ToString(es[1].Value),
                                             //Coluna 3
                                             DescricaoEstr = Convert.ToString(es[1].Value)
                                         }).ToList();
    





    Existe realmente a necessidade passar este código para LINQ, pois boa parte do LINQ roda em cima de foreach, mais que suporte coleções genericas e tipo genericos.
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    terça-feira, 1 de novembro de 2011 20:21

Todas as Respostas

  • Bruno teria como você posta o código inteiro que é utilizado para leitura do excel, até das classes e suas propriedades ?? aguardo um retorno se possivel, tentarei fazer um exemplo com LINQ ai você pode medir a perfomace com o StopWath e ver qual é mais rapido, o seu método ou com LINQ
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    terça-feira, 1 de novembro de 2011 13:19
  • Vitor obrigado pela ajuda...segue o codigo inteiro com classes.

    Classe Order

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace SPD_v3.Classes
    {
        class Order
        {
            public int IdOrdem { get; set; }
            public string SalesModel { get; set; }
            public int Qtd { get; set; }
    
            public IList<Estrutura> Estruturas { get; set; }
            public IList<Entrega> Entregas { get; set; }
            public List<Inventario> Inventarios { get; set; }
        }
    }

     


    classe Estrutura

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace SPD_v3.Classes
    {
        class Estrutura
        {
            public string SalesModelEstr { get; set; }
            public string PartNumberEstr { get; set; }
            public string DescricaoEstr { get; set; }
    
            public List<Inventario> Inventarios { get; set; }
        }
    }
    

     


    classe Inventario

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace SPD_v3.Classes
    {
        class Inventario
        {
            public string PartNumberInv { get; set; }
            public string DescricaoInv { get; set; }
            public int QtdInv { get; set; }
    
            public IList<Estrutura> Estruturas { get; set; }
        }
    }
    

     


    classe Entrega

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace SPD_v3.Classes
    {
        class Entrega
        {
            public string PNumberEntr { get; set; }
            public string DescricaoEntr { get; set; }
            public int QtdEntr { get; set; }
            public DateTime DataEntr { get; set; }
        }
    }
    

     


    agora segue o codigo

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Microsoft.Office.Interop.Excel;
    using SPD_v3.Classes;
    
    namespace SPD_v3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                System.Windows.Forms.Application.Exit();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                ApplicationClass excel = null;
                Workbook wBook = null;
                Worksheet wSheet = null;
                Range wRange = null;
    
                //Impostando metodo de abertura dos arquivos
                OpenFileDialog fileDialog = new OpenFileDialog();
                fileDialog.Filter = "Arquivos Excel | *.xlsx";
    
                if (DialogResult.OK != fileDialog.ShowDialog())
                {
                    return;
                }
    
                try
                {
                    excel = new ApplicationClass();
    
                    //Impostando o que sera wBook
                    wBook = excel.Workbooks.Open(fileDialog.FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    
                    IList<Order> orders = new List<Order>();
    
                    //Lendo sheet da Ordem
                    #region Leitura Ordem
                    wSheet = (Worksheet)wBook.Sheets[1];
    
                    //A leitura da sheet comeca pela linha 2
                    int linhaOrdem = 2;
    
                    bool testeOrdem = true;
    
                    while (testeOrdem)
                    {
                        wRange = wSheet.get_Range("A" + linhaOrdem, "A" + linhaOrdem);
    
                        //Teste que verifica se tem algo nas linhas
                        if (wRange.Value != null && wRange.Value.ToString() != "")
                        {
                            Order order = new Order();
    
                            order.IdOrdem = Convert.ToInt32(wSheet.get_Range("A" + linhaOrdem, "A" + linhaOrdem).Value);
                            order.SalesModel = (wSheet.get_Range("B" + linhaOrdem, "B" + linhaOrdem).Value.ToString());
                            order.Qtd = Convert.ToInt32(wSheet.get_Range("C" + linhaOrdem, "C" + linhaOrdem).Value);
    
                            //Jogando os valores na lista
                            orders.Add(order);
                        }
                        else
                        {
                            testeOrdem = false;
                        }
                        linhaOrdem++;
                    }
    
                    #endregion
    
                    //Lendo sheet da Estrutura
                    #region Leitura da Estrutura
    
                    wSheet = (Worksheet)wBook.Sheets[2];
    
                    foreach (Order order in orders)
                    {
                        order.Estruturas = new List<Estrutura>();
    
                        int linhaEstr = 2;
    
                        bool testeEstr = true;
    
                        while (testeEstr)
                        {
                            wRange = wSheet.get_Range("A" + linhaEstr, "A" + linhaEstr);
    
                            if (wRange.Value != null && wRange.Value.ToString() != "")
                            {
                                if (wRange.Value.ToString() == order.SalesModel)
                                {
                                    Estrutura estrutura = new Estrutura();
    
                                    estrutura.SalesModelEstr = wSheet.get_Range("A" + linhaEstr, "A" + linhaEstr).Value.ToString();
                                    estrutura.PartNumberEstr = wSheet.get_Range("B" + linhaEstr, "B" + linhaEstr).Value.ToString();
                                    estrutura.DescricaoEstr = wSheet.get_Range("C" + linhaEstr, "C" + linhaEstr).Value.ToString();
    
                                    order.Estruturas.Add(estrutura);
                                }
                            }
                            else
                            {
                                testeEstr = false;
                            }
                            linhaEstr++;
                        }
                    }
    
                    #endregion
    
                    //Lendo sheet do Inventario
                    #region Leitura Inventario
    
                    wSheet = (Worksheet)wBook.Sheets[3];
    
                    foreach (Order order in orders)
                    {
                        foreach (Estrutura estrutura in order.Estruturas)
                        {
                            order.Inventarios = new List<Inventario>();
    
                            int linhaInv = 2;
    
                            bool testeInv = true;
    
                            while (testeInv)
                            {
                                wRange = wSheet.get_Range("A" + linhaInv, "A" + linhaInv);
    
                                if (wRange.Value != null && wRange.Value.ToString() != "")
                                {
                                    if (wRange.Value.ToString() == estrutura.PartNumberEstr)
                                    {
                                        Inventario inventario = new Inventario();
    
                                        inventario.PartNumberInv = wSheet.get_Range("A" + linhaInv, "A" + linhaInv).Value.ToString();
                                        inventario.DescricaoInv = wSheet.get_Range("B" + linhaInv, "B" + linhaInv).Value.ToString();
                                        inventario.QtdInv = Convert.ToInt32(wSheet.get_Range("C" + linhaInv, "C" + linhaInv).Value);
    
                                        order.Inventarios.Add(inventario);
                                    }
                                    else
                                    {
                                        testeInv = false;
                                    }
                                    linhaInv++;
                                }
                                linhaInv++;
                            }
                        }
                    }
    
                    #endregion
    
                    //Escrevendo os Resultados no sheet Result
                    #region Escrevendo Resultados
    
                    wSheet = (Worksheet)wBook.Sheets[5];
    
                    int linhaResult = 2;
    
                    foreach (Order order in orders)
                    {
                        wRange = wSheet.get_Range("A" + linhaResult, "A" + linhaResult);
                        wRange.Value2 = order.IdOrdem;
    
                        wRange = wSheet.get_Range("B" + linhaResult, "B" + linhaResult);
                        wRange.Value2 = order.Qtd;
    
                        wRange = wSheet.get_Range("C" + linhaResult, "C" + linhaResult);
                        wRange.Value2 = order.SalesModel;
    
                        foreach (Estrutura estrutura in order.Estruturas)
                        {
                            wRange = wSheet.get_Range("D" + linhaResult, "D" + linhaResult);
                            wRange.Value2 = estrutura.PartNumberEstr;
    
                            wRange = wSheet.get_Range("E" + linhaResult, "E" + linhaResult);
                            wRange.Value2 = estrutura.DescricaoEstr;
    
                            foreach (Inventario inventario in order.Inventarios)
                            {
                                wRange = wSheet.get_Range("F" + linhaResult, "F" + linhaResult);
                                wRange.Value2 = inventario.QtdInv;
    
                                wRange = wSheet.get_Range("G" + linhaResult, "G" + linhaResult);
                                wRange.Value2 = inventario.QtdInv - order.Qtd;
    
                                linhaResult++;
                            }
    
                            linhaResult++;
                        }
                        linhaResult++;
                    }
                    #endregion
    
                    MessageBox.Show("OK");
                }
    
                catch (Exception ex)
                {
                    throw;
                }
                finally
                {
                    if (wBook != null)
                        wBook.Close(XlSaveAction.xlDoNotSaveChanges, Type.Missing, Type.Missing);
    
                    if (excel != null)
                        excel.Quit();
                }
            }
        }
    }
    
    
    

     


    Vitor o programa esta conseguindo ler somente ate a Classe estrutura, na hora de ler o inventario ele trava mas na estrutura ele consegue escrever tudo na planilha direitinho entao acho melhor isolar a parte do inventario.

    Obrigado !!!


    • Editado BrunoM9 terça-feira, 1 de novembro de 2011 13:57
    terça-feira, 1 de novembro de 2011 13:54
  • Bruno eu tentei aqui, até que estava indo tudo bem, eu estava utilizando um componente que permite implementar LINQ no worksheets do Excel, até que na ordem deu tudo certo: 

    (http://code.google.com/p/linqtoexcel/)

    var bookOrdem = (from x in book.Worksheet(1)
                     select new Order()
                    {
                        //Coluna 1
                        IdOrdem = Convert.ToInt32(x[0].Value),
                        //Coluna 2
                        SalesModel = Convert.ToString(x[1].Value),
                        //Coluna 3
                        Qtd = Convert.ToInt32(x[2].Value)
                    }).ToList();
    
    orders.AddRange(bookOrdem);
    

     Mais quando fui fazer a estrustura, o componenete nao permite fazer join...

     
    var bookEstrutura = (from es in book.Worksheet(2)
                                         join o in orders
                                         on es[0].Value equals o.SalesModel
                                         select new Estrutura()
                                         {
                                             //Coluna 1
                                             SalesModelEstr = Convert.ToString(es[0].Value),
                                             //Coluna 2
                                             PartNumberEstr = Convert.ToString(es[1].Value),
                                             //Coluna 3
                                             DescricaoEstr = Convert.ToString(es[1].Value)
                                         }).ToList();
    





    Existe realmente a necessidade passar este código para LINQ, pois boa parte do LINQ roda em cima de foreach, mais que suporte coleções genericas e tipo genericos.
    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/
    terça-feira, 1 de novembro de 2011 20:21