Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как из С++ получить значение ячейки в файле Excel  (Прочитано 36617 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eugene771
Интересующийся

ru
Offline Offline

« : 08-04-2011 10:53 » 

хотелось бы наиболее простым способом получить значение из открытого файла в Excel значение в заданной ячейке.
Записан
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #1 : 08-04-2011 11:43 » 

Глянь тут
http://www.cyberforum.ru/com-ole/thread137398.html
http://www.cyberforum.ru/cpp-builder/thread41112.html

Ищи в хелпе Excel слова OLE и COM
Записан
eugene771
Интересующийся

ru
Offline Offline

« Ответ #2 : 08-04-2011 11:53 » 


По С# все расписано везде, а вот как в C++ подключить Microsoft.Office.Interop.Excel?

Я в references и путь к dll указал, но сами references не появились.


Добавлено через 8 часов, 31 минуту и 21 секунду:
Хочу добавить Visual studio 2008 C++, именно в нем мне необходимо выполнить задачу.
« Последнее редактирование: 08-04-2011 20:25 от eugene771 » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 08-04-2011 20:51 » 

Лучше сразу с этого начинать, а ещё лучше указать, что С++ .NET. Кроме него ещё есть вагон и маленькая тележка разных С++.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
eugene771
Интересующийся

ru
Offline Offline

« Ответ #4 : 08-04-2011 21:36 » 

Я не знаю что такое NET вообще,  у меня есть dll именно на VS2008 c++, есть опеределенные данные которые лежат в ячейках Excel,они туда динамически выводятся и мне нужно наиболее быстрым способом их получать, можно через текстовый файл, а правильно через Microsoft.Office.Interop.Excel.dll. Для начала ее нужно присоединить к проекту. У меня есть пример на C#, но пока не пропишу
using Excel=  Microsoft.Office.Interop.Excel....
дело дальше не продвинется.
По идее просто доступ получить должно быть достаточно просто.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 08-04-2011 22:04 » 

1.
Я не знаю что такое NET вообще

Придётся узнать, ведь именно с этой платформой ты работаешь. А как же иначе?

2. VS 2008 С++ есть среда разработки. В ней можно создать разные проекты dll на С++. Например, простую Win32-dll, экспортирующую ф-ции. Можно создать библиотеку расширения MFC, статическую или динамическую.
Пока ты ни словом не обмолвился, какой именно тип проекта есть твоя dll. Судя по "using Excel=  Microsoft.Office.Interop.Excel" это всё-таки .NET, и если ты не знаешь что это такое, то ты понятия не имеешь, что ты вобще делаешь.
Если же у тебя не .NET, то причём здесь references? И откуда уверенность в том, что:

а правильно через Microsoft.Office.Interop.Excel.dll

Почему это есть правильно?

Цитата
По идее просто доступ получить должно быть достаточно просто.

По идее - да.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
eugene771
Интересующийся

ru
Offline Offline

« Ответ #6 : 08-04-2011 22:10 » 

Потому что быстрее намного))) А при больших вычислительных операциях и когда скорость критична стараешься на  всем повышать эффективность. С++  мне очень нравится своей производительностью и простотой реализации расчетных модулей, не хочу на C# переходить и как назло везде примеры не такие. По сути я Excel как DDE сервер хочу использовать.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 09-04-2011 06:25 » 

Цитата: eugene771
С++  мне очень нравится своей производительностью и простотой реализации расчетных модулей, не хочу на C#
Если рассматривать только эти аспекты, то C# ещё проще и ничем не уступает по производительности Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
eugene771
Интересующийся

ru
Offline Offline

« Ответ #8 : 09-04-2011 07:08 » 

Скажем так тогда, API нужной мне программы написан на C++,  плюс в универе я изучал Паскаль, C++ и мне вид кода на этих языках понятнее(лучше воспринимается и без веских причин меняться не охота),  сейчас и у меня модуль уже написан на VS2008 C++. Просто некторые данные через API получить невозможно и брать их можно только через DDE.

Добавлено через 2 часа, 10 минут и 6 секунд:
Пишут что с нижеприведенным кодом можно работать напрямую с функциями Excel, но у меня
using namespace std;
Это не помешает?, будет  два пространства имен, извините если вопрос не очень умный)))
И как после этого присвоить переменной значение ячейки A1 например?
И для 2003 Office все без изменений с именами файлов?
Я так понимаю что могу делать что то такое:vTemp=wSheet1.OlePropertyGet("Range", "A1:M150");
вот как выбрать нужную книгу нужный лист и нужную ячейку в C++?


 #define _WIN32_DCOM
      //#define USES_MSO97
      //#define USES_MSO2000
      //#define USES_MSO2002
      //#define USES_MSO2003
      #define USES_MSO2007
      
      #ifdef USES_MSO97
      #import "C:\Program Files\Microsoft Office\Office\Excel8.OLB" auto_search auto_rename
      #endif
      
      // бла-бла бла
      
      #ifdef USES_MSO2007
      #import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE12\\MSO.DLL" auto_rename no_namespace
      #import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB" auto_rename no_namespace
      #import "C:\\Program Files\\Microsoft Office\\OFFICE12\\EXCEL.EXE" auto_rename
      #endif

после чего можно работать с функциями ex

Добавлено через 1 час, 47 минут и 59 секунд:
Только заметил.  У меня обычный WIN32 project, DLL, empty. Проект содержит три заголовочных файла,  1.h, 1.c,    и 2.h для связи с другой dll. Ну и файл .cpp.
Этот проект есть плагин, который взаимодействует с основной программой получая и отправляяя данные, и плюс некоторые данные необходимо брать из Excel из открытого в данный момент файла.  Так как со словом NET я при работе с данным плагином в течении полугода ни разу не сталкивался, то наверное этого у меня и нет.
по другому можно назвать это SDK.
« Последнее редактирование: 09-04-2011 09:18 от eugene771 » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 09-04-2011 13:42 » 

Цитата: eugene771
Скажем так тогда, API нужной мне программы написан на C++,  плюс в универе я изучал Паскаль, C++ и мне вид кода на этих языках понятнее(лучше воспринимается и без веских причин меняться не охота),  сейчас и у меня модуль уже написан на VS2008 C++. Просто некторые данные через API получить невозможно и брать их можно только через DDE.
Если тебе нравится C++ - ну и наздоровье. Непонятно, зачем вообще приводить псевдоаргументы за тот или иной язык, если альтернатив ты просто не знаешь? К чему вообще эта тема? Если ты не хочешь связываться с .NET, зачем вообще полез в него? Ну и работай себе с C++ и COM, а через него - с Excel. Только это совсем другой раздел форума.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
eugene771
Интересующийся

ru
Offline Offline

« Ответ #10 : 09-04-2011 15:48 » 

Проблема в том что ни на NET ни через COM никто рабочих вариантов не предложил. Тему администратор сюда перенес))  Сейчас временно сделал через txt файл, буду искать варианты дальше. Если бы я был программист то наверное вопросов у меня не было вообще.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 09-04-2011 17:43 » 

eugene771, http://support.microsoft.com/kb/216686/

Но послушай лучше совета программиста. Гораздо быстрее будет разобраться с интеграцией чистого C++ и C++.NET, чем разбираться с COM на C++ и использованием interop. И кода будет меньше, и сам код будет более вменяемым.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 10-04-2011 08:30 » new

eugene771, проблема данной темы заключается в том, что ты наистаиваешь на ответе, навязывая свой несуразный путь решения. Ты хочешь сделать это на чистом С++, без .NET, но обязательно с использованием .NET библиотеки Microsoft.Office.Interop.Excel.dll.
С таким же успехом, ты можешь нас спросить как заставить летать некий объект, но это объект должен быть непременно чугунной болванкой.

В своём первом сообщении ты не указал ни платформы, ни языка, разместив тему в native С++, что само по себе является чушью. Когда ты упомянул VS 2008 и Microsoft.Office.Interop.Excel.dll, единственный вывод, который можно было сделать: ты работаешь с CLR С++. Т.е. с .NET версией С++ (да, такое тоже бывает, и это тоже твой любимый С++). Поэтому я перенёс тему сюда. Таким образом "полез" отностится не к перенесоу темы "сюда", а к твоему патологическому упорству решить задачу "правильно":

а правильно через Microsoft.Office.Interop.Excel.dll

Возникло противоречие. С одной стороны ты говоришь, что:

Потому что быстрее намного

С другой:

С++  мне очень нравится своей производительностью и простотой реализации расчетных модулей

Имея ввиду native C++.  Неувязочка.

Поэтому, лучшим решением будет, если ты ещё раз чётко и ясно сформулируешь задачу, указав все исходные условия (среду разработки, целевую платформу, ограничения, например, версии Excel, ведь у них разный формат) и желаемый конечный результат. После этого ты можешь расчитывать получить различные решения, их которых ты можешь выбрать наиболее тебя устраивающий. Забыв про "наилучшие" решения с твоей точки зрения, тем более, что ты сам говоришь, что не программист.
А пока ты пришёл к хирургу с приступом аппендицита, но требуешь от него, чтобы он удалил тебе его через пятку (мягко сказано). Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
eugene771
Интересующийся

ru
Offline Offline

« Ответ #13 : 10-04-2011 08:41 » 

Вот внизу вариант решения предложенный на другом форуме первым же ответом(только ответ два дня ждал), впоолне будет работоспособно я думаю. Текст вопроса едентичен.
Не пойму только как мне указатель направить на нужный файл excel: например balance.xls и на лист с именем Test
Excel 2003.

Код:

// Include standard header files
#include <iostream>
#include <cmath>
// Office XP Objects (2002)
#import \
"C:\Program Files\Common Files\Microsoft Shared\OFFICE11\mso.dll" \
rename("DocumentProperties", "DocumentPropertiesXL") \
rename("RGB", "RBGXL")
//Microsoft VBA objects
#import \
"C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\vbe6ext.olb"
//Excel Application objects
#import "C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" \
rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") \
rename("DocumentProperties", "DocumentPropertiesXL") \
rename("ReplaceText", "ReplaceTextXL") \
rename("CopyFile", "CopyFileXL") \
exclude("IFont", "IPicture") no_dual_interfaces
//Use the standard namespace
using namespace std;
//Define our own function, e^{-x} sin(x)
//In general this could be the result of a simulation, etc.
double f(const double &x) {return (sin(x)*exp(-x));}
//Main driver program
int main()
{
//Surround the entire interfacing code with a try block
try
{
//Initialise the COM interface
CoInitialize(NULL);
//Define a pointer to the Excel application
Excel::_ApplicationPtr xl;
//Start one instance of Excel
xl.CreateInstance(L"Excel.Application");
//Make the Excel application visible
xl->Visible = true;
//Add a (new) workbook
xl->Workbooks->Add(Excel::xlWorksheet);
//Get a pointer to the active worksheet
Excel::_WorksheetPtr pSheet = xl->ActiveSheet;
//Set the name of the sheet
pSheet->Name = "Chart Data";
//Get a pointer to the cells on the active worksheet
Excel::RangePtr pRange = pSheet->Cells;
//Define the number of plot points
unsigned Nplot = 100;
//Set the lower and upper limits for x
double x_low = 0.0, x_high = 20.0;
//Calculate the size of the (uniform) x interval
//Note a cast to an double here
double h = (x_high - x_low)/(double)Nplot;
//Create two columns of data in the worksheet
//We put labels at the top of each column to say what it contains
pRange->Item[1][1] = "x"; pRange->Item[1][2] = "f(x)";
//Now we fill in the rest of the actual data by
//using a single for loop
for(unsigned i=0;i<Nplot;i++)
{
//Calculate the value of x (equally-spaced over the range)
double x = x_low + i*h;
//The first column is our equally-spaced x values
pRange->Item[i+2][1] = x;
//The second column is f(x)
pRange->Item[i+2][2] = f(x);
}
//The sheet "Chart Data" now contains all the data
//required to generate the chart
//In order to use the Excel Chart Wizard,
//we must convert the data into Range Objects
//Set a pointer to the first cell containing our data
Excel::RangePtr pBeginRange = pRange->Item[1][1];
//Set a pointer to the last cell containing our data
Excel::RangePtr pEndRange = pRange->Item[Nplot+1][2];
//Make a "composite" range of the pointers to the start
//and end of our data
//Note the casts to pointers to Excel Ranges
Excel::RangePtr pTotalRange =
pSheet->Range[(Excel::Range*)pBeginRange][(Excel::Range*)pEndRange];
// Create the chart as a separate chart item in the workbook
Excel::_ChartPtr pChart=xl->ActiveWorkbook->Charts->Add();
//Use the ChartWizard to draw the chart.
//The arguments to the chart wizard are
//Source: the data range,
//Gallery: the chart type,
//Format: a chart format (number 1-10),
//PlotBy: whether the data is stored in columns or rows,
//CategoryLabels: an index for the number of columns
// containing category (x) labels
// (because our first column of data represents
// the x values, we must set this value to 1)
//SeriesLabels: an index for the number of rows containing
// series (y) labels
// (our first row contains y labels,
// so we set this to 1)
//HasLegend: boolean set to true to include a legend
//Title: the title of the chart
//CategoryTitle: the x-axis title
//ValueTitle: the y-axis title
pChart->ChartWizard((Excel::Range*)pTotalRange,
(long)Excel::xlXYScatter,
6L,(long)Excel::xlColumns, 1L, 1L, true,
"My Graph", "x", "f(x)");
//Give the chart sheet a name
pChart->Name = "My Data Plot";
}
//If there has been an error, say so
catch(_com_error & error)
{
cout << "COM ERROR" << endl;
}
//Finally Uninitialise the COM interface
CoUninitialize();
//Finish the C++ program
return 0;
}
« Последнее редактирование: 10-04-2011 11:47 от eugene771 » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 10-04-2011 11:23 » 

eugene771, оборачивай уже код! Теги: [code]...[/code]
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 10-04-2011 12:24 » 

Цитата: eugene771
Не пойму только как мне указатель направить на нужный файл excel: например balance.xls и на лист с именем Test
А это уже вопрос про API Excel, а не про C++. Очевидно, что сначала нужно открыть нужную книгу - точно так же, как это делалось бы в макросе на VBA.

Цитата: eugene771
#import "C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE"
...и всякий залетевший дятел приведёт к краху цивилизации. Ты задумайся над тем, как это будет собираться на другой машине, на другой версии Windows, на другой версии Office? (Если, конечно, ты пишешь не одноразовое решение.)

Цитата: eugene771
как заставить летать некий объект, но это объект должен быть непременно чугунной болванкой.
Методом грубой силы (brute force) Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
eugene771
Интересующийся

ru
Offline Offline

« Ответ #16 : 10-04-2011 12:41 » 

Я делаю робота(МТС механическую торговую систему) для себя и не планирую что либо менять, если надо будет в коде поменяю.  Cсылку на решение для любой системы мне дали, и обязательно разберусь, но позже.  В данный момент #import предпочтительнее.
Записан
Tesey
Интересующийся

ua
Offline Offline

« Ответ #17 : 17-07-2011 07:31 » 

Я работал с xls файлами как с обычной базой данных. На мой взгляд очень удобно. Одно но, я работал на С#, если интересно могу написать пример кода он не сильно сложный и не думаю что реализация на С++ будет сильно отличаться. там и выбор книги, и листа в книге.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 17-07-2011 14:51 » 

Tesey, Excel - это не база реляционная данных, а простая таблица, пусть и с продвинутыми возможностями. Access позволит тебе создавать реляционные базы, им же можно их обрабатывать и им же отображать. Не нравится Access - выбор широк. GUI писать можно на чем угодно.

Рекомендую для прочтения:
Введение в базы данных.
Теоретические основы реляционных баз данных.
Другие статьи о БД для начинающих.
Статьи по ADO.NET.

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Tesey
Интересующийся

ua
Offline Offline

« Ответ #19 : 18-07-2011 09:11 » 

RXL, а причём здесь
 
Tesey, Excel - это не база реляционная данных
Человеку надо прочитать значение из XL. Есть возможность обратиться к листу как к таблице базы данных. Я не позиционировал ХL как реляционную базу данных. Просто мне такой способ удобнее в некоторых случаях для получения данных из XL. Решил поделиться своим опытом с человеком.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #20 : 18-07-2011 12:01 » 

Tesey, видимо я в темах запутался. Найду ту тему - перенесу туда.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines