不使用OLEDB在c#中显示所有Excel单元格值

在ac#listbox上显示Excel单元格值时出现此问题。

我有这个Employees.xls文件,其中包含四(4)列(“代码”,“姓氏”,“名字”,“中间名”)。

这是确切的内容:

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(); } } } 

将conExcel方法中的连接string更改为期望的标题。

 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); } 

尝试更改IMEX=-1IMEX=1

如果它仍然不起作用,然后尝试谷歌关于治疗Excel文本的数据。

编辑:

为XLS文件, Excel 8.0; 应在扩展属性中使用

来源: http : //www.connectionstrings.com/ace-oledb-12-0/