none
Abrir conexão com arquivo em excel a partir do servidor RRS feed

  • Pergunta

  • Pessoal,

    Fiz uma aplicação em asp.net com C#, .NET 4.5. A aplicação tem uma tela que só lê uma planilha em excel e mostra em um grid. Estou com um problema que acredito ser na hora de abrir a conexão com o arquivo em excel. No entanto esse problema só ocorre quando eu publico a aplicação. Quando rodo da IDE funciona normalmente.

    Acredito que seja no conn.open:

    try
                {
                    IList<ServicoEntidade> lstServico = null;
                    DataTable outputTable = null;
    
                    string strConn;
                    if (pEntidade.nomeArquivo.Substring(pEntidade.nomeArquivo.LastIndexOf('.')).ToLower() == ".xlsx")
                        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Contrato11102013.xlsx;Extended Properties=\"Excel 12.0;HDR=YES;IMEX=2\"";
                    else
                        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pEntidade.nomeArquivo + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=0\"";
    
                    DataSet output = new DataSet();
    
                    using (OleDbConnection conn = new OleDbConnection(strConn))
                    {
                        conn.Open();
                        
                        DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    
                        foreach (DataRow schemaRow in schemaTable.Rows)
                        {
                            string sheet = schemaRow["TABLE_NAME"].ToString();
    
                            if (!sheet.EndsWith("_"))
                            {
                                try
                                {
                                    OleDbCommand cmd = new OleDbCommand("SELECT * FROM [" + sheet + "]", conn);
                                    cmd.CommandType = CommandType.Text;
    
                                    outputTable = new DataTable(sheet);
                                    output.Tables.Add(outputTable);
                                    new OleDbDataAdapter(cmd).Fill(outputTable);
                                }
                                catch (Exception ex)
                                {
                                    throw new Exception(ex.Message + string.Format("Sheet:{0}.File:F{1}", sheet, pEntidade.nomeArquivo), ex);
                                }
                            }
                        }
    
                        conn.Close();
                    }
    
                    // Garantir que a planilha foi encerrada
                    GC.Collect(); // Fecha a Aplicação
                    GC.WaitForPendingFinalizers(); // Fecha a Aplicação
    
                    if (outputTable != null)
                    {
    
                        lstServico = new List<ServicoEntidade>();
                        ServicoEntidade lServico = null;
    
                        for (int i = 2; i < outputTable.Rows.Count; i++)
                        {
                            if (!String.IsNullOrEmpty(outputTable.Rows[i].ItemArray[4].ToString()))
                            {
                                lServico = new ServicoEntidade();
                                lServico.codigo = outputTable.Rows[i].ItemArray[1] == DBNull.Value ? null : outputTable.Rows[i].ItemArray[1].ToString();
                                lServico.descricao = outputTable.Rows[i].ItemArray[2] == DBNull.Value ? null : outputTable.Rows[i].ItemArray[2].ToString();
    
                                lServico.unidade = new UnidadeMedidaEntidade(outputTable.Rows[i].ItemArray[4] == null ? null : outputTable.Rows[i].ItemArray[4].ToString());
                                lServico.valor = outputTable.Rows[i].ItemArray[5] == DBNull.Value ? (float?)null : float.Parse(outputTable.Rows[i].ItemArray[5].ToString());
    
                                lstServico.Add(lServico);
                            }
                        }
                    }
    
                    //vGrade.DataSource = ds.Tables[0];
                    //vGrade.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCellsExceptHeader;
    
                    return lstServico;
                }
                catch (Exception ex)
                {
                    throw ex;
                }

    Vocês conhecem alguma solução? 

    O pior é que nenhum erro ocorre, nada ocorre, simplesmente ele não lê, pois não retorna nada na lista e rodando da IDE ele funciona normalmente.

    Obrigado.



    sábado, 17 de maio de 2014 20:24

Respostas

  • Bom dia,

    Você ja deu uma olhada nesses dois Links? O estranho é que está funcionando normalmente no IDE...Espero que resolva seu problema.

    http://www.macoratti.net/10/05/c_dtxls.htm

    http://www.linhadecodigo.com.br/artigo/1895/lendo-um-arquivo-do-excel-%E2%80%9Cxls%E2%80%9D-com-csharp.aspx

    http://social.msdn.microsoft.com/Forums/pt-BR/4b940356-3845-4dac-a053-3f459cf90361/string-de-conexo-arquivo-excel

    Abraço

    terça-feira, 20 de maio de 2014 11:05