У меня есть эта проблема при отображении значений ячейки 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();
}
}
}
Измените строку соединения в методе 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);
}
Попробуйте изменить IMEX=-1
на IMEX=1
Если он все еще не работает, попробуйте google об обработке данных Excel в виде текста.
Редактировать:
для файла XLS, Excel 8.0;
следует использовать в расширенных свойствах
Excel 8.0;
, Если это все еще не хорошо, попробуйте установить Provider=Microsoft.Jet.OLEDB.4.0;
. Кажется, xls и xlsx используют разные строки подключения: stackoverflow.com/a/2242720/2419922