2015-02-03 3 views
1

ВведениеXLW: как использовать новые ЬурейеЕ получить зЬй :: строку из ячеек Excel (и, возможно, заполнить зЬй :: карта)

Я имею в виду 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, ни к какому-либо файлу заголовок моего проекта.

Вопросы

  1. Как я могу заполнить, что std::map< std::string, int> читая диапазон строк из Excel?
  2. Как определить новые контейнеры через typedef согласно моим желаемым типам/классам, чтобы управлять все возможные входы из Excel?
+0

Является ли mycontainers.h частью шаблона образца? Похоже, что он не является частью документации xlw. Я думаю, вы можете просто изменить typedef. – NathanOliver

+0

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

+1

Вы пытались использовать 'typedef std :: vector MyStrArray;'? Строки Excel будут unicode. –

ответ

2

Класс MyArray предназначен только для представления массивов двойников. Typedef - значит, вы можете использовать свой любимый такой класс.

Класс CellMatrix позволяет вводить данные любого типа. Вы просто проверяете каждый элемент CellMatrix для его типа, а затем выполняете то, что хотите.

 Смежные вопросы

  • Нет связанных вопросов^_^