Подтвердить что ты не робот

Что такое простая и надежная библиотека C для работы с файлами Excel?

Хорошо... это.

Мне нужно что-то просто и надежное (не обязательно иметь причудливые функции - мне нужно писать и читать текст и цифры из ячеек Excel)

И да, мне бы хотелось образец кода Hello Cell...

Что вы рекомендуете?

4b9b3361

Ответ 1

Сильно обескуражен. Я бы рекомендовал использовать C-friendly формат (например, CSV) вместо XLS или использовать новые форматы XML (выберите свой выбор в XML и ZIP-библиотеки).

Тем не менее, для быстрого исправления вы можете экспортировать в цитируемый CSV, а затем импортировать с помощью VBScript. Что-то вроде this, хотя я бы попытался заставить его работать в VBA в первую очередь.

Обратите внимание, что для этого потребуется копия Office и не будет хорошо масштабироваться (но вы можете скрыть окно Excel).


Я только что нашел xlsLib, так что, если вам действительно нужно писать прямо на C, дайте ему идти! Будьте осторожны, потому что это очень сложно, особенно если вы пишете уже существующие файлы.

Существует также LibExcel, но это С++, поэтому вам нужно будет скомпилировать обертку или переписать для C.


Одна заключительная оговорка: причина, по которой я не искала их в начале, заключается в том, что ее очень сложно добиться. Я не использовал библиотеки выше, но я подозреваю, что они порвутся странными и необычными способами. Я надеюсь, вы прочитали Joel's в форматах Office.

Ответ 2

Excel, как и другие продукты Office, экспортирует свои кишки через COM. Это доступно для использования на С++, VB, С#, и любые другие языки имеют COM-взаимодействие - при условии, что вы работаете в Windows и установите Excel. (Вы не можете добраться до COM из простого C. Будь это удачливый или неудачный, зависит от вас.)

COM - кровавая грязная боль для неуправляемых языков. Следующий VB:

Set objExcel = CreateObject("Excel.Application")  ' start or use existing Excel
objExcel.Visible = True                           ' show the window
objExcel.Workbooks.Add                            ' create an empty workbook

грубо переводит на следующий С++:

#include <assert.h>
#include <ole2.h>
#include <tchar.h>

int main() {
    HRESULT hr;
    IDispatch *objExcel, *objWorkbooks;
    CLSID clsid;
    DISPID id, id2;
    DISPPARAMS p;
    VARIANT v;
    TCHAR *name;

    CoInitialize(NULL);

    hr = CLSIDFromProgID(_T("Excel.Application"), &clsid);
    assert(SUCCEEDED(hr));
    hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,
            IID_IDispatch, (LPVOID *)&objExcel);
    assert(SUCCEEDED(hr));

    id2 = DISPID_PROPERTYPUT;
    name = _T("Visible");
    hr = objExcel->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &id);
    assert(SUCCEEDED(hr));
    VariantInit(&v);
    v.vt = VT_I4;
    v.lVal = 1;
    p.cArgs = 1;
    p.rgvarg = &v;
    p.cNamedArgs = 1;
    p.rgdispidNamedArgs = &id2;
    hr = objExcel->Invoke(id, IID_NULL, LOCALE_SYSTEM_DEFAULT,
            DISPATCH_PROPERTYPUT, &p, NULL, NULL, NULL);
    assert(SUCCEEDED(hr));

    name = _T("Workbooks");
    hr = objExcel->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &id);
    assert(SUCCEEDED(hr));
    p.cArgs = 0;
    p.rgvarg = NULL;
    p.cNamedArgs = 0;
    p.rgdispidNamedArgs = NULL;
    hr = objExcel->Invoke(id, IID_NULL, LOCALE_SYSTEM_DEFAULT,
            DISPATCH_PROPERTYGET, &p, &v, NULL, NULL);
    assert(SUCCEEDED(hr));
    objWorkbooks = v.pdispVal;

    name = _T("Add");
    hr = objWorkbooks->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &id);
    assert(SUCCEEDED(hr));
    p.cArgs = 0;
    p.rgvarg = NULL;
    p.cNamedArgs = 0;
    p.rgdispidNamedArgs = NULL;
    hr = objWorkbooks->Invoke(id, IID_NULL, LOCALE_SYSTEM_DEFAULT,
            DISPATCH_PROPERTYGET, &p, NULL, NULL, NULL);
    assert(SUCCEEDED(hr));

    return 0;
}

Ответ 3

Свободная библиотека, но опять же это С++, а не C: ExcelFormat

Ответ 4

У меня небольшое расширение, которое опубликовал материал ephemient. Там очень удобная библиотека, доступная с облегчением с интерфейсом IDispatch. http://disphelper.sourceforge.net/

Это только один файл, который вы добавляете к своим проектам, но он делает программирование IDispatch с C почти забавой; -)

Ответ 5

Другой вариант - использовать libxlsxwriter, библиотеку C для записи файлов Excel XLSX. Однако он не может читать файлы Excel и не поддерживает файлы XLS.