English 中文(简体)
什么是用于处理Excel文件的简单可靠的C库?[关闭]
原标题:
  • 时间:2009-01-29 19:50:24
  •  标签:

我们不允许询问有关书籍、工具、软件库等推荐的问题。您可以编辑问题,使其可以通过事实和引用回答。

Closed 7 years ago.

好的,就这样了。

我需要一些简单可靠的东西(不需要花哨的功能——我需要从Excel单元格中编写和阅读文本和数字)。

是的,我想要一个“Hello Cell”代码示例...

你有什么推荐?(nǐ yǒu shén me tuī jiàn?)

最佳回答

强烈建议不要使用XLS格式,而是使用C友好的格式(例如CSV),或使用新的XML格式(在XML和ZIP库方面进行选择)。

然而,为了快速修复,您可以将其导出为引用的 CSV,然后使用VBScript进行导入。类似于这样的东西,尽管我会先尝试在VBA中使其正常工作。

请注意,这将需要一份Office副本,并且不会很好地扩展(但是您可以隐藏Excel窗口)。


我刚刚发现了xlsLib,所以如果你真的需要直接用C语言编写,就试试吧!不过要小心,因为它很难正确操作,特别是在向已存在的文件中写入时。

还有一个名为LibExcel的库,但是它是C++编写的,所以您需要编译一个包装器或改写成C语言。


最后一个警告:我之所以没有在开始时搜索这些是因为这非常难做到对。我没有使用上述库,但我怀疑它们会以奇怪和不寻常的方式破裂。我相信您已经阅读了Joel对Office格式的看法。

问题回答

Excel,就像其他办公产品一样,通过COM导出其核心。如果你在Windows系统上且已安装Excel,它可用于C ++,VB,C#和任何其他具有COM互操作性的语言。 (您无法从普通的C语言中访问COM。这是幸运还是不幸,取决于您。)

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

大致翻译成以下C++:

#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;
}

A free library, but again this is C++, not C: ExcelFormat

I ve a small extension to the stuff ephemient has posted. There s very handy library available with eases the paind with the IDispatch interface. http://disphelper.sourceforge.net/

这只是一个你添加进你的项目的文件,但它使得使用C语言进行IDispatch编程变得近乎有趣 ;-)

另一个选项是使用libxlsxwriter,一个用于编写Excel XLSX文件的C库。但是,它无法读取Excel文件并且不支持XLS文件。





相关问题
热门标签