Forum
See question

Importar dados de um ficheiro de excel   

84 views
0
0

Boa noite,

Fiz um formulário de utilizador para importar dados de um ficheiro de excel para uma gridview.

Estou a ter um erro no seguinte:

OleDbConnection myConnection = new OleDbConnection(@”Provider=Microsoft.ACE.OLEDB.12.0;Data Source='” + file + “‘;Extended Properties=\”Excel 12.0;HDR=YES;\””);
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(“Select * from [sheet1$]”, myConnection);
DataSet myDataSet = new DataSet();
myDataAdapter.Fill(myDataSet);

O programa corre bem até preencher o Dataset.

Acredito que esteja a faltar alguma referência. No Visual Studio a referência que utilizo é using System.Data.OleDb; mas no primavera V10 não estou a conseguir correr

Alguém tem alguma ideia?

Faça login para poder traduzir
V10
Marked as spam
Created 1 year and 2 months ago nunodomingues
nunodomingues Iniciante
2 answers
0
Private answer

Olá @nunodomingues,

Para evitar problemas de drivers a afins eu uso referência ao OfficeOpenXml - EPPlus.dll (https://epplussoftware.com/docs/5.8/api/OfficeOpenXml.html).

Podes utilizar o método abaixo para transformar em datatable, que servirá de source para o teu fim.

 

public static DataTable GetDataTableFromExcel(string path, string sheet, bool hasHeader = true)
{

    DataTable tbl = new DataTable();
    try
    {
        byte[] bin = File.ReadAllBytes(path);
        using (MemoryStream stream = new MemoryStream(bin))
        using (ExcelPackage excelPackage = new ExcelPackage(stream))
        {
            ExcelWorksheet ws = null;
            ws = excelPackage.Workbook.Worksheets[sheet];

            if (ws == null)
            {
                throw new Exception("A folha não existe no ficheiro carregado");
            }

            foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
            {
               // tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Coluna{0}", firstRowCell.Start.Column));
                tbl.Columns.Add(string.Format("Coluna{0}", firstRowCell.Start.Column));
            }
            var startRow = hasHeader ? 2 : 1;
            for (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
            {
                var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
                DataRow row = tbl.Rows.Add();
                foreach (var cell in wsRow)
                {
                    row[cell.Start.Column - 1] = cell.Text;
                }
            }

        }
 
        return  tbl;
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message.ToString());
    }
 
}

 

Faça login para poder traduzir
Marked as spam
Created 1 year and 2 months ago nunogonalves-2
n
nunogonalves-2 Iniciante
    Comments
    Obrigado Nuno. Deste-me uma excelente ideia.
    1 year and 2 months ago
    nunodomingues
      Funcionou perfeitamente. Maravilha.
      1 year and 2 months ago
      nunodomingues
        0
        Private answer

        Boas @nunodomingues

         

        Se estas a utilizar o oledb 12, verifique o aplicativo microsoft access database engine.

        Normalmente o windows service instala a versão 32 e 64 bit deste aplicativo. O que tens de fazer é garantir que apenas esteja instalado o 32 bit.(Alguns casos apenas o 64 bits)

        Eu já tive este erro e continuo a ter quando o windows service decide que deve instalar estas duas versões que por engraçado, se tentares instar as duas versões manualmente o windows não permite.

        Faça login para poder traduzir
        Marked as spam
        Created 1 year and 2 months ago inciotandonzage
          Comments
          Boa tarde, Obrigado pela dica. No entanto seguindo o concelho do Nuno acima, acabei por concluir que a melhor forma é usar uma referência externa e depois ao instalar o projecto instalo também a dependência. É muito mais fácil e fiável do que estarmos a depender do que está instalado no computador. Cumprimentos
          1 year and 2 months ago
          nunodomingues