Qu'est-ce qu'une bibliothèque C simple et fiable pour travailler avec des fichiers Excel? [fermé]

Eh bien... c'est tout.

J'ai besoin de quelque chose simple et fiable (ne doit pas avoir de fonctionnalités fantaisistes-j'ai besoin d'écrire et de lire du texte et des nombres à partir de cellules Excel)

Et oui, je voudrais un exemple "Bonjour Cellule" code...

Que recommandez-vous?

27
demandé sur pnuts 2009-01-29 22:50:24

5 réponses

Fortement déconseillé. Je recommande d'utiliser un format C-friendly (par exemple CSVs) au lieu de XLS, ou d'utiliser les nouveaux formatsXML (Choisissez les bibliothèques XML et ZIP).

Pourtant, pour une solution rapide, vous pouvez exporter au format CSV cité, puis importer en utilisant VBScript . Quelque chose comme CE , bien que j'essaierais de le faire fonctionner en VBA en premier.

Notez que cela nécessitera une copie D'Office, et ne sera pas bien mis à l'échelle (mais vous pouvez Cacher L'Excel fenêtre).


Je viens de trouver xlsLib , donc si vous avez vraiment besoin d'écrire directement en C, essayez-le! Soyez prudent cependant, car il est très difficile de bien faire, surtout si vous écrivez dans des fichiers déjà existants.

Il existe aussi LibExcel, mais c'est C++, donc vous devez compiler un wrapper autour, ou réécrire pour C.


Une dernière mise en garde: la raison pour laquelle je n'ai pas cherché ceux-ci au début est qu'il est extrêmement difficile d'obtenir le droit. Je Je n'ai pas utilisé les bibliothèques ci-dessus, mais je soupçonne qu'ils vont casser de manière étrange et inhabituelle. J'espère que vous avez lu la prise de Joel sur les formats de bureau.

12
répondu Mark 2009-02-01 13:36:07

Excel, comme d'autres produits de bureau, exporte ses tripes sur COM. Ceci est disponible pour une utilisation en C++, VB, C#, et toutes les autres langues ont COM interop-à condition que vous exécutez dans Windows et avez installé Excel. (Vous ne pouvez pas arriver à COM de plain C. que ce soit chanceux ou malheureux est à vous.)

COM est une douleur sanglante pour les langues non gérées, cependant. Le VB suivant:

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

Traduit approximativement en C++suivant:

#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;
}
11
répondu ephemient 2009-01-30 03:53:30

Une bibliothèque gratuite, mais encore une fois c'est C++, pas C: ExcelFormat

3
répondu dtw 2009-12-26 05:52:58

J'ai une petite extension à la substance ephemient a posté. Il y a une bibliothèque très pratique disponible avec facilite le paind avec L'interface IDispatch. http://disphelper.sourceforge.net/

C'est juste un fichier que vous ajoutez à vos projets mais cela rend la programmation IDispatch avec C presque amusante ; -)

2
répondu Friedrich 2009-02-01 13:46:18

Une autre option consiste à utiliser libxlsxwriter, une bibliothèque C pour écrire des fichiers Excel XLSX. Cependant, il ne peut pas Lire les fichiers Excel et il ne prend pas en charge les fichiers XLS.

1
répondu Zenadix 2015-07-08 15:49:58