Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2011, 08:24   #1
D@rkD@iver
Форумчанин
 
Регистрация: 28.07.2009
Сообщений: 189
По умолчанию Как работать с Excel из C#.NET?

перерыл весь интернет там есть вот такой метод
Код C#

using Microsoft.Office.Interop.Excel;
...

Excel.Application excel = new Excel.Apllication();


но проблема в том что нет класса Application в библиотеки Excel
хотел использовать OLE но ничего хорошего тоже не нашел
с OLE работал на Delphi, а тут запара какая-то
есть у кого кусок кода как прочитать и записать что-нибдуь в ячейку?

P.S. OS- Windows XP, Office 2010
пишу программы для студентов и школьников на Pascal, Delphi, C++, WINAPI, assembler
обучаю программированию на паскале(дистанционно);mail: hruslow@gmail.com
D@rkD@iver вне форума Ответить с цитированием
Старый 05.02.2011, 14:32   #2
Splin
 
Аватар для Splin
 
Регистрация: 28.01.2011
Сообщений: 3
По умолчанию

Я нашел 2 способа:
1. Тот же что и вы, но не стал с ним разбираться т.к. он подразумевает наличие у пользователя exel на компьютере и помоему привязывается к версии + на самом деле он открывает сам exel(хотя этот факт можно скрыть от пользователя, но время на открытие exel бывает не малым) и работает как пользователь, но без участия последнего.
2. Приведен ниже:
Код:
        #region OleLoadFile
        private void loadFile(string filename) //Открываем файл
        {
            // Строка подключения
            string ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0;HDR=NO\"; Data Source={0}", filename);
            // открываем соединение
            myOleDbConnection = new OleDbConnection(ConnectionString);
            myOleDbConnection.Open();
            getData();
            myOleDbConnection.Close();
        }
        private void getData() //Извлекаем информацию из файла
        {
            // схема листов в документе
            schemaTable =
              myOleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
            // Берем имя первого листа
            string sheet1 = (string)schemaTable.Rows[0].ItemArray[2];

            //Задаем команду выборки данных
            string select = String.Format("SELECT * FROM [{0}]", sheet1);

            // Выбираем все данные с листа
            myOleDbDataAdapter = new OleDbDataAdapter(select, myOleDbConnection);

            //Связываем данные из файла с датасетом
            myDataSet = new DataSet("EXCEL");
            myOleDbDataAdapter.Fill(myDataSet);
        } 
        #endregion
Код:
        #region Save
        private void createOleNewBook(string fileName)
        {
            try
            {
                string ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0;HDR=NO\"; Data Source={0}", fileName);
                OleDbConnection myODCon = new OleDbConnection(ConnectionString);
                myODCon.Open();

                OleDbCommand myOleDbCommand = new OleDbCommand();
                myOleDbCommand.Connection = myODCon;
                myOleDbCommand.CommandText = String.Format("CREATE TABLE [Лист1] ({0})", getSaveCommandData(-1));
                myOleDbCommand.ExecuteNonQuery();

                for (int i = 0; i < resDS.Tables[0].Rows.Count; i++)
                {
                    myOleDbCommand.CommandText = String.Format("INSERT INTO [Лист1$] values ({0})", getSaveCommandData(i));
                    myOleDbCommand.ExecuteNonQuery();
                }
                myODCon.Close();
                MessageBox.Show("Файл сохранен");
            }
            catch { }
        }
        public string getSaveCommandData(int rowIndex) 
        {
            for (int i = 0; i < resDS.Tables[0].Columns.Count-1; i++) 
            {
                data += String.Format("{0}", rowIndex!=-1 ? getValue(resDS, i, rowIndex) +", " : (i+1)+" integer, ");
            }
            data += String.Format("{0}", rowIndex != -1 ? getValue(resDS, resDS.Tables[0].Columns.Count-1, rowIndex).ToString() : (resDS.Tables[0].Columns.Count) + " integer");
            return data;
        }
        #endregion
Работает без установленного на компьютере exel, но по средством запросов, что при записи предполагает наличие в документе(непосредственно в документе) полей-ключей.
Приведен кусок из программы, если что непонятно - спрашивайте.
Есть несколько способов реализации подобного соединения. В хелпе VS2080 есть справка по этому поводу на русском посмотрите OleDbConnection.
Если ты упал... поднимись, если все не так... изменись, если ставишь цель... достигай, нет предела в твоих силах так и знай...

Последний раз редактировалось Splin; 05.02.2011 в 15:13.
Splin вне форума Ответить с цитированием
Старый 05.02.2011, 16:42   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, добавлю ещё ссылки на темы на форуме:

http://www.programmersforum.ru/showthread.php?t=69969

http://www.programmersforum.ru/showthread.php?t=107441
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.02.2011, 16:53   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
C#.NET
А что, бывает какой-то другой?
_-Re@l-_ вне форума Ответить с цитированием
Старый 05.02.2011, 19:59   #5
Splin
 
Аватар для Splin
 
Регистрация: 28.01.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
vasilisk-green, либо открывать через OLE автоматизацию (для этого Excel нужной версии должен быть на той машине, где Вы попытаетесь прочитать данные)
Что то недопонял. Я делал через OleDbCommand. Сейчас с перепугу открыл виртуалку(там офис не установлен) и проверил - все работает. Но в той теме никто не поправил этого высказывания. Хотелось бы разобраться.

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
А что, бывает какой-то другой?
А где написано что небывает???
Если ты упал... поднимись, если все не так... изменись, если ставишь цель... достигай, нет предела в твоих силах так и знай...

Последний раз редактировалось Splin; 05.02.2011 в 20:12.
Splin вне форума Ответить с цитированием
Старый 06.02.2011, 14:07   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Что то недопонял. Я делал через OleDbCommand. Сейчас с перепугу открыл виртуалку(там офис не установлен) и проверил - все работает. Но в той теме никто не поправил этого высказывания. Хотелось бы разобраться.
смотрите. Вы используете не OLE автоматизацию, Вы используете ЗАПРОСЫ к Excel файлам (через Microsoft.Jet.OLEDB ). А это, две больших разности.
Почему? Ну, например, сделайте ширину второго столбца в третьем листе книги в два раза больше имеющейся... Или измените шрифт в любой ячейке книги... Или прочитайте данные если сверху многострочная шапка с объединёнными ячейками...
Кроме того, я могу ошибаться, но таким образом (через запросы) нельзя прочитать XLSX файлы (это файлы MS Excel 2007/2010)

я не хочу сказать, что Ваш способ плох. Просто у него есть свои особенности. Если структура файла (и текущая задача) это позволяет — то таким способом вполне можно пользоваться!


p.s. я не являюсь специалистом в данном вопросе.

p.p.s. я под для себя .NET ещё не нашёл подходящий вариант. Ибо MyXLS, о котором я упоминал в темах в вышеприведённых по ссылкам темах - крайне убог...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.02.2011, 14:53   #7
Splin
 
Аватар для Splin
 
Регистрация: 28.01.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение

p.s. я не являюсь специалистом в данном вопросе.

p.p.s. я под для себя .NET ещё не нашёл подходящий вариант. Ибо MyXLS, о котором я упоминал в темах в вышеприведённых по ссылкам темах - крайне убог...
Я не в претензию, просто чтоб знать для себя.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Почему? Ну, например, сделайте ширину второго столбца в третьем листе книги в два раза больше имеющейся... Или измените шрифт в любой ячейке книги... Или прочитайте данные если сверху многострочная шапка с объединёнными ячейками...
Это да - форматирование не учитывается. Но если делать выборку всего, а не учитывая что структура определена, то шапку такую должно вычитать(хотя не проверял).

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Кроме того, я могу ошибаться, но таким образом (через запросы) нельзя прочитать XLSX файлы (это файлы MS Excel 2007/2010)
Не помню точно но помоему этот вопрос решается в этой строке
Код:
string ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0;HDR=NO\"; Data Source={0}", filename);
Если честно этот вопрос изучал немногим выходя за рамки поставленной задачи. А "в споре рождается истинна", что то вы узнали, что то я. А читатели спасибо скажут что мы спорили, когда найдут тему и не придется задавать вопросов
Если ты упал... поднимись, если все не так... изменись, если ставишь цель... достигай, нет предела в твоих силах так и знай...
Splin вне форума Ответить с цитированием
Старый 06.02.2015, 22:49   #8
specialist_
 
Регистрация: 14.12.2012
Сообщений: 4
По умолчанию

Попробуйте Excel Data Reader - библиотека читает Excel в виде DataSet и работает без установленного Excel
детали
specialist_ вне форума Ответить с цитированием
Старый 06.02.2015, 23:15   #9
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Фу-фу!
Закопай труп обратно!
FPaul вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Excel и Visual C++ .NET tall Общие вопросы .NET 2 29.10.2010 14:23
Excel и Visual C++ .NET tall Visual C++ 0 28.10.2010 20:38
Можно ли работать с .xlsm файлом в Excel 2007? Brucebelg Microsoft Office Excel 2 26.05.2010 14:11
Как работать с видеофайлами в Excel? Евгений ГВС Microsoft Office Excel 8 30.11.2009 23:29
Хелп! Перестали работать все ссылки в excel nniikkmmeenn Microsoft Office Excel 4 20.05.2008 16:57