Я имею в виду xlw, то API обертка Excel C Марк Джоши и другие.
Прежде чем начать с моего примера, мои испытания и мой вопрос, пару слов о том, как воспроизводить эти коды: после того, как вы загрузили и установили xlw
со своего сайта, вы должны найти папку с именем XLL_Project
, содержимое которой решение Visual Studio («Template.sln»), если эта IDE/платформа была выбрана во время установки; это решение составлено из cppinterface.h
, то есть файла заголовка, который определяет, какие функции должны присутствовать в вашем окончательном .xll, и source.cpp
, который определяет, как должны работать эти функции.
Код
Пусть функция интерфейса, как следующий один в cppinterface.h
и его поведение в source.cpp
:
// ===== cppinterface.h =====
std::string // Asks the user to enter the number of pancakes eaten for breakfast by different people. Analyzes the data and output which person ate the most pancakes
PancakeGlutton(const MyArray& people, // Range of people
const MyArray& pancakeNumber // Range of pancakes eaten by each person
);
// ===== source.pp =====
std::string PancakeGlutton(const MyArray& people, const MyArray& pancakeNumber)
{
if (people.size() != pancakeNumber.size())
throw("Error: arrays must have the same dimension!");
std::map< std::string, int > myMap;
for (unsigned long i = 0; i < people.size(); i++)
{
myMap.insert(std::pair< std::string, int >(people[i], pancakeNumber[i]));
}
return "x"; // Of course this a strange output just for the sake of this example
}
Как вы можете видеть, что есть попытка для заполнения std::map< std::string, int >
с использованием класса xlw
: in таблица Excel people
может представлять собой ряд строк, поэтому код C++ должен видеть что-то вроде std::vector<std::string>
, и поэтому он должен использовать его для заполнения myMap
с надлежащим std::pair< std::string, int >
.
Однако это не строится.
Основной проблемой является то, что является typedef
определено в mycontainers.h
:
// ===== mycontainers.h =====
// Line 68
// ...
typedef std::vector<double> MyArray;
Поэтому, никоим образом не может быть переведен в контейнер, способный управлять строками: просто удваивается. Даже если в главе his book «s связанные с xlw
Joshi говорит ...
[...] Класс также определяется через
typedef
вMyContainers.h
. Значение по умолчанию:typedef
-std::vector
. Он должен иметь.size()
, размер конструктора и размерoperator[]
.
... это не достаточно, чтобы добавить
typedef std::vector<std::string> MyStrArray;
ни mycontainers.h
, ни к какому-либо файлу заголовок моего проекта.
Вопросы
- Как я могу заполнить, что
std::map< std::string, int>
читая диапазон строк из Excel? - Как определить новые контейнеры через
typedef
согласно моим желаемым типам/классам, чтобы управлять все возможные входы из Excel?
Является ли mycontainers.h частью шаблона образца? Похоже, что он не является частью документации xlw. Я думаю, вы можете просто изменить typedef. – NathanOliver
Это внешняя зависимость. Я попытался изменить код, добавив это определение, но он все равно не строится. Я предполагаю, что что-то еще нужно сделать в другом месте, но я не могу понять, где и как. –
Вы пытались использовать 'typedef std :: vector MyStrArray;'? Строки Excel будут unicode. –