Не отображает все значения ячеек Excel в c #, используя OLEDB

1

У меня есть эта проблема при отображении значений ячейки Excel в aС# listbox.

У меня есть файл Employees.xls, который содержит четыре (4) столбца ("Код", "LastName", "FirstName", "MiddleName").

Здесь точное содержание:

Code   LastName   FirstName   MiddleName

1      Dela Cruz  Juan        Santos

2      Severino   Miguel      Reyes

Теперь, используя Openfiledialog, я просмотрел файл и хочу отображать заголовки столбцов в списке.

Это должно быть результатом:

Code

LastName

FirstName

MiddleName

Проблема в том, что когда я просматриваю файл, заголовок столбца "Код" не отображается.

Он отображает только:

      <--- (Blank Space)

LastName

FirstName

MiddleName

Я заметил, что есть место для первого значения, но текст "Код" не отображается.

Это код, который я использовал для получения значений ячейки:

  private void btn_Browse_Click(object sender, EventArgs e) // Browse Button

     {
        Stream myStream = null;
        OpenFileDialog openFileDialog1 = new OpenFileDialog();

        openFileDialog1.InitialDirectory = "c:\\";
        openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        openFileDialog1.FilterIndex = 2;
        openFileDialog1.RestoreDirectory = true;
        this.lbl_Path.Text = openFileDialog1.FileName;
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
         {
             try
             {
                 if ((myStream = openFileDialog1.OpenFile()) != null)
                 {
                     using (myStream)
                     {
                         this.lbl_Path.Text = openFileDialog1.FileName;
                         source = openFileDialog1.FileName.Replace(@"\", @"\\");
                         this.lbl_Path.Visible = true;
                         GetExcelSheetNames(source);
                         lst_Fields.Items.Clear();
                         string SheetName = sheet;
                         string query = "Select * From ["+SheetName+"]";
                         DataTable table = conExcel(query);
                         int i = 0;
                         lst_Fields.Items.Add(Convert.ToString(table.Rows[i][0]));
                         lst_Fields.Items.Add(Convert.ToString(table.Rows[i][1]));
                         lst_Fields.Items.Add(Convert.ToString(table.Rows[i][2]));
                         lst_Fields.Items.Add(Convert.ToString(table.Rows[i][3]));
                         lst_Fields.Items.Add(Convert.ToString(table.Rows[i][4]));
                         lst_Fields.Items.Add(Convert.ToString(table.Rows[i][5]));
                         lst_Fields.Items.Add(Convert.ToString(table.Rows[i][6]));
                         lst_Fields.Items.Add(Convert.ToString(table.Rows[i][7]));
                         lst_Fields.Items.Add(Convert.ToString(table.Rows[i][8]));
                         lst_Fields.Items.Add(Convert.ToString(table.Rows[i][9]));
                     }

                 }
             }
             catch (Exception ex)
             {
                 MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
             } 
         }
    }

    private DataTable conExcel(string query) // Connection to Excel
    {
        OleDbConnection conn = new OleDbConnection();
        conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + source + ";Extended Properties=\"Excel 12.0;HDR=NO;IMEX=-1;\"";
        conn.Open();
        OleDbDataAdapter da = new OleDbDataAdapter(query, conn);
        DataTable table = new DataTable();
        da.Fill(table);
        conn.Close();
        return table;
    }

    private String[] GetExcelSheetNames(string excelFile) //Getting the sheet name
    {
        OleDbConnection objConn = null;
        System.Data.DataTable dt = null;

        try
        {
            // Connection String. Change the excel file to the file you
            // will search.
            String connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + source + ";Extended Properties=\"Excel 12.0;HDR=NO;IMEX=-1;\"";
            // Create connection object by using the preceding connection string.
            objConn = new OleDbConnection(connString);
            // Open connection with the database.
            objConn.Open();
            // Get the data table containg the schema guid.
            dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

            if (dt == null)
            {
                return null;
            }

            String[] excelSheets = new String[dt.Rows.Count];
            int i = 0;

            // Add the sheet name to the string array.
            foreach (DataRow row in dt.Rows)
            {
                excelSheets[i] = row["TABLE_NAME"].ToString();
                i++;
            }

            // Loop through all of the sheets if you want too...
            for (int j = 0; j < excelSheets.Length; j++)
            {
                sheet = excelSheets[0];
            }

            return excelSheets;
        }
        catch (Exception ex)
        {
            return null;
        }
        finally
        {
            // Clean up.
            if (objConn != null)
            {
                objConn.Close();
                objConn.Dispose();
            }
            if (dt != null)
            {
                dt.Dispose();
            }
        }
    }
Теги:
excel

2 ответа

2
Лучший ответ

Измените строку соединения в методе conExcel, чтобы ожидать заголовки.

conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + source + ";Extended Properties=Excel 12.0;HDR=YES;";
// OR
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + source + ";Extended Properties=Excel 12.0;HDR=YES;IMEX=1";
//conn.ConnectionString = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" + source + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=-1;\"";

Затем вы можете изменить:

lst_Fields.Items.Add(Convert.ToString(table.Rows[i][0]));
lst_Fields.Items.Add(Convert.ToString(table.Rows[i][1]));
lst_Fields.Items.Add(Convert.ToString(table.Rows[i][2]));
lst_Fields.Items.Add(Convert.ToString(table.Rows[i][3]));
lst_Fields.Items.Add(Convert.ToString(table.Rows[i][4]));
lst_Fields.Items.Add(Convert.ToString(table.Rows[i][5]));
lst_Fields.Items.Add(Convert.ToString(table.Rows[i][6]));
lst_Fields.Items.Add(Convert.ToString(table.Rows[i][7]));
lst_Fields.Items.Add(Convert.ToString(table.Rows[i][8]));
lst_Fields.Items.Add(Convert.ToString(table.Rows[i][9]));

чтобы:

foreach (DataColumn dc in table.Columns)
{
    lst_Fields.Items.Add(dc.ColumnName);
}
  • 0
    Работает как шарм Марк. Ты спас мне жизнь, мужик! Спасибо вам большое!
  • 0
    Отметьте, когда я пытался перенести проект на другой компьютер, я получаю ошибку «Внешняя таблица не в ожидаемом формате». Он отлично работает на другом компьютере. Пожалуйста помоги..
Показать ещё 2 комментария
2

Попробуйте изменить IMEX=-1 на IMEX=1

Если он все еще не работает, попробуйте google об обработке данных Excel в виде текста.

Редактировать:

для файла XLS, Excel 8.0; следует использовать в расширенных свойствах

Источник: http://www.connectionstrings.com/ace-oledb-12-0/

  • 0
    Я уже пробовал это исправление, сэр, но там написано: «Внешняя таблица не в ожидаемом формате». Вот почему я вернул его к -1. Я точно не знаю, почему использовать IMEX = -1 вместо IMEX = 1, но это единственный способ отобразить значения в моем списке.
  • 0
    Попробуйте использовать Excel 8.0; , Если это все еще не хорошо, попробуйте установить Provider=Microsoft.Jet.OLEDB.4.0; . Кажется, xls и xlsx используют разные строки подключения: stackoverflow.com/a/2242720/2419922

Ещё вопросы

Сообщество Overcoder
Наверх
Меню