Не открывается .xlsx в datagrid

171
17 ноября 2018, 00:40

Возникла проблема с WPF: в приложении у меня при нажатии кнопки должен открыться файл с расширением .xlsx и его содержимое перенестись в DataGrid, что не происходит, всё так пустым и остаётся.

    private void btnOpen_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "XML Files (*.xml; *.xls; *.xlsx; *.xlsm; *.xlsb) |*.xml; *.xls; *.xlsx; *.xlsm; *.xlsb";
            openFileDialog1.FilterIndex = 3;
            openFileDialog1.Multiselect = false;
            openFileDialog1.InitialDirectory = @"Desktop";
            Nullable<bool> result = openFileDialog1.ShowDialog();
            if (result == true)
            {
                string pathName = openFileDialog1.FileName;
                string fileName = System.IO.Path.GetFileNameWithoutExtension(openFileDialog1.FileName);
                DataTable tbContainer = new DataTable();
                string strConn = string.Empty;
                string sheetName = fileName;
                FileInfo file = new FileInfo(pathName);
                if (!file.Exists) { throw new Exception("Error, file doesn't exists!"); }
                string extension = file.Extension;
                switch (extension)
                {
                    case ".xls":
                        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                        break;
                    case ".xlsx":
                        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
                        break;
                    default:
                        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
                        break;
                }
                OleDbConnection cnnxls = new OleDbConnection(strConn);
                OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("select * from [{0}$]", sheetName), cnnxls);
                oda.Fill(tbContainer);
                gridStudents.SetBinding(ItemsControl.ItemsSourceProperty, new Binding { Source = tbContainer });
            }
        }
        catch (Exception)
        {
        }
    }
Answer 1
  1. Вы указываете в запросе имя файла, а нужно - имя листа

  2. Вы игнорируете все исключения, поэтому вы не можете даже увидеть сообщение об ошибке

Вывести содержимое первого листа можно так:

OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "XML Files (*.xml; *.xls; *.xlsx; *.xlsm; *.xlsb) |*.xml; *.xls; *.xlsx; *.xlsm; *.xlsb";
openFileDialog1.FilterIndex = 3;
openFileDialog1.Multiselect = false;
openFileDialog1.InitialDirectory = @"Desktop";
Nullable<bool> result = openFileDialog1.ShowDialog();
if (result == true)
{
    string pathName = openFileDialog1.FileName;
    string fileName = System.IO.Path.GetFileNameWithoutExtension(openFileDialog1.FileName);
    DataTable tbContainer = new DataTable();
    string strConn = string.Empty;                    
    string sheetName;
    FileInfo file = new FileInfo(pathName);
    if (!file.Exists) { throw new Exception("Error, file doesn't exists!"); }
    string extension = file.Extension;
    switch (extension)
    {
        case ".xls":
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
            break;
        case ".xlsx":
            strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + pathName + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
            break;
        default:
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathName + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
            break;
    }
    OleDbConnection cnnxls = new OleDbConnection(strConn);
    using (cnnxls)
    {
        cnnxls.Open();
        DataTable dtSchema = cnnxls.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
        sheetName = dtSchema.Rows[0].Field<string>("TABLE_NAME");                        
        OleDbDataAdapter oda = new OleDbDataAdapter(string.Format("select * from [{0}]", sheetName), cnnxls);
        oda.Fill(tbContainer);
    }
    grid1.SetBinding(ItemsControl.ItemsSourceProperty, new Binding { Source = tbContainer });
}
READ ALSO
Не работает async|await в visual studio 2010

Не работает async|await в visual studio 2010

В 2010 студии не работает async | awaitКак показали зарубежные источники, не хватает обновления (т е библиотеки)

241
PHP функция pack() на пальцах

PHP функция pack() на пальцах

Читаю книгу Котерова, там описание функции pack, я ни разу ее не использовал на практике и как мне кажется даже в чужом коде не встречалМожет...

163
Zend 3 есть ли способ доступа к ServiceManager без фабрик?

Zend 3 есть ли способ доступа к ServiceManager без фабрик?

До недавнего времени писал на zend 2, сейчас смотрю zend 3, и ситуация с отсутствием доступа к serviceManager в контроллерах напрямую и вообще работа через...

194