locked
CSV or Excel to SQLLite RRS feed

  • Вопрос

  • Windows 8 приложение. Есть в системе Excel 2013

    Локальная база SQLLite есть модель в public Class которая соответствует полям базы

    Требуется переписать данные либо прямо из excel файла (что предпочтительнее), либо хотя бы из csv (т.к. в студии ссылки на Office типа Interrop не нашёл как добавить)

    Чтение из csv файла с разделителем ; пытаюсь сделать так

            private async void Button_Click_5(object sender, RoutedEventArgs e)
            {
                var dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "data.db");
                var openPicker = new FileOpenPicker();
                openPicker.FileTypeFilter.Add(".csv");
                StorageFile file = await openPicker.PickSingleFileAsync();
                if (file != null)
                {
                    //string[] str = { ";" };
                    var text = await FileIO.ReadTextAsync(file);
                    IList<string> parsed = new List<string>();
                    parsed = await FileIO.ReadLinesAsync(file);
    
    
                    for (int i = 0; i < parsed.Count; i++)
                    {
                        List<string> sn = parsed[i];
                        var lines = sn.Select(a => a.Split(';'));
                        var csv = from line in lines
                                  select (from piece in line select piece).ToList();
    
                        using (var db = new SQLiteConnection(dbPath))
                        {
                            var product = new Me01UgolR()
                            {
                                idMe01UgolR = csv[0],
                                name = csv[1]                            
                            };
                            db.Insert(product);
                        }
                    }
    
                    var dlg = new Windows.UI.Popups.MessageDialog(parsed.Count.ToString(), "Что в файле?");
                    await dlg.ShowAsync();
                }

    Но, выдаёт ошибку на попытке прочитать в цикле построчно одну строку и на записи в базу данных.


    Спасибо

    20 декабря 2012 г. 2:17

Ответы

  • Привет.

    Что-то вы запутались в циклах. Вот посмотрите:

                var openPicker = new FileOpenPicker();
                openPicker.FileTypeFilter.Add(".csv");
                StorageFile file = await openPicker.PickSingleFileAsync();
                if (file != null)
                {
                    // читаем в список строк
                    var parsed = await FileIO.ReadLinesAsync(file);
                    // идем построчно по файлу
                    foreach (var line in parsed)
                    {
                        // в каждой строке значения разделены по ячейчам с помощью символа ;
                        var values = line.Split(';');
                        // читаем значения
                        foreach (var value in values)
                        {
                            // вывод сначала A1, B1, C1 ... A2, B2, C2 ... A3, B3, C3
                            Debug.WriteLine(value); 
                        }
                    }
                }


    Для связи [mail]

    • Помечено в качестве ответа developers_s 25 декабря 2012 г. 9:46
    24 декабря 2012 г. 11:32

Все ответы

  • Читать данные из экселя можно используя dynamic, тогда Office.Interop не нужен.
    20 декабря 2012 г. 4:31
  • А для Metro есть ссылка как использовать? А то здесь и здесь только с подключёнными Interrop


    Спасибо

    20 декабря 2012 г. 5:16
  • 8ки на работе нет, но под 7кой примерно так:

                string filename = @"c:\temp\data.xlsx";
                dynamic excel = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
                //Это наверно лучше выключить
                excel.Visible = true;
                excel.Workbooks.Open(filename);
                //Считываем значение указывая ячйку по имени
                var a1value = excel.Range["A1"].Value;
                Console.WriteLine(a1value);
                //Или считываем изначение указывая ячйку по индексу            
                var a2value = excel.Cells[1, 2].Value;
                Console.WriteLine(a2value);
                //Закрыавем 
                excel.Quit();

    20 декабря 2012 г. 6:11
  • Ошибка 1 "System.Type" не содержит определение для "GetTypeFromProgID" D:\Программирование\Bazes\SqliteApp\SqliteApp\MainPage.xaml.cs 432 59 SqliteApp

    Это вот эта строчка

    dynamic excel = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));

    Когда набирал

    using System.Type 
    

    нет такого usinga


    Спасибо

    20 декабря 2012 г. 6:59
  • Оказывается, он (GetTypeFromProgID) Windows Store не поддерживается.

    Видимо CSV, или посмотри библиотеки которые поваляют читать данные из xlsx файлов используя открытость его формата.


    • Изменено ulcer 20 декабря 2012 г. 9:56
    20 декабря 2012 г. 9:55
  • Ок тогда начнём сначала. Что с кодом сделать чтобы стал читать csv файл? Или просто в чём ошибка?


    Спасибо

    21 декабря 2012 г. 3:04
  • Привет.

    Что-то вы запутались в циклах. Вот посмотрите:

                var openPicker = new FileOpenPicker();
                openPicker.FileTypeFilter.Add(".csv");
                StorageFile file = await openPicker.PickSingleFileAsync();
                if (file != null)
                {
                    // читаем в список строк
                    var parsed = await FileIO.ReadLinesAsync(file);
                    // идем построчно по файлу
                    foreach (var line in parsed)
                    {
                        // в каждой строке значения разделены по ячейчам с помощью символа ;
                        var values = line.Split(';');
                        // читаем значения
                        foreach (var value in values)
                        {
                            // вывод сначала A1, B1, C1 ... A2, B2, C2 ... A3, B3, C3
                            Debug.WriteLine(value); 
                        }
                    }
                }


    Для связи [mail]

    • Помечено в качестве ответа developers_s 25 декабря 2012 г. 9:46
    24 декабря 2012 г. 11:32