【问题标题】:What is a simple and reliable C library for working with Excel files? [closed]什么是用于处理 Excel 文件的简单可靠的 C 库? [关闭]
【发布时间】:2009-01-29 19:50:24
【问题描述】:

嗯……就是这样。

我需要简单可靠的东西(不一定要有花哨的功能 - 我需要在 Excel 单元格中写入和读取文本和数字)

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

你有什么推荐的?

【问题讨论】:

  • 如果可能是 Windows 和 Linux,但如果不是 Windows,因为我想与 Windows 上的 Excel 交互。
  • Linux 上的 Excel,我会很惊讶地找到它。 OpenOffice 就在那里,并且有一个可用的 C++ 界面......也许这就是你想要尝试的
  • “大提琴地狱”,这就是所有糟糕的大提琴手一起发出可怕噪音的地方......:/我会看看 gnumeric 源代码,它可能是模块化的。如果你筹集资金付给我 1000 美元,我会把它修成图书馆;)
  • 我不明白为什么这个“推荐图书馆”的问题得到了 26 票赞成,而不是因为离题而被关闭:(所以非常不一致..
  • @MartinJames 错过了。我专门单击了您元帖子中的链接以关闭另一侧的任何内容。

标签: c excel


【解决方案1】:

强烈反对。我建议使用 C 友好格式(例如 CSV)而不是 XLS,或者使用新的 XML 格式(选择 XML 和 ZIP 库)。

不过,为了快速修复,您可以导出为引用的 CSV,然后使用 VBScript 导入。 this 之类的东西,虽然我会先尝试让它在 VBA 中工作。

请注意,这将需要 Office 的副本,并且无法很好地扩展(但您可以隐藏 Excel 窗口)。


我刚刚找到xlsLib,所以如果你真的需要直接用C 编写,试试吧!不过要小心,因为很难做到正确,尤其是在写入已经存在的文件时。

还有LibExcel,但那是 C++,所以你需要编译一个包装器,或者为 C 重写。


最后一个警告:我一开始没有搜索这些的原因是很难找到正确的。我没有使用上面的库,但我怀疑它们会以奇怪和不寻常的方式破坏。我相信您已经阅读了Joel's 采用 Office 格式。

【讨论】:

  • 谢谢!您对新的 Open XML 格式非常有帮助(我不知道它存在)
  • libExcel 似乎是商业 libxl
  • 其他方式,我认为
【解决方案2】:

Excel 与其他 Office 产品一样,通过 COM 导出其内容。这可用于 C++、VB、C# 和任何其他具有 COM 互操作性的语言——前提是您在 Windows 中运行并安装了 Excel。 (您无法从普通 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;
}

【讨论】:

  • 我承认我没有在谷歌上搜索这个问题,但这就是 stackoverflow 的用途:) 说真的,我知道找到这个库会有问题,但我不知道 没有人能够编写或读取没有功能、格式、只有文本和数字的普通 Excel 单元格。你去吧!
  • 难怪C++会走上渡渡鸟的路。
  • 您可以使用 COM 做很多事情,但您想要使用 COM 做的事情并不多。
  • @kliketa - 不,不是:(
  • @dreamlax 你是什么意思? COM 真的很简单,而且容易理解的 TLB 很有趣……呵呵,好吧不是真的:)
【解决方案3】:

一个免费的库,但同样是 C++,而不是 C: ExcelFormat

【讨论】:

  • 我现在在用,很容易集成使用。
【解决方案4】:

我对 ehemient 发布的内容做了一个小扩展。有一个非常方便的库,可以减轻 IDispatch 接口的痛苦。 http://disphelper.sourceforge.net/

这只是您添加到项目中的一个文件,但它使使用 C 进行 IDispatch 编程几乎很有趣;-)

【讨论】:

  • 看起来很有趣,但有点老(2004)项目
  • 哇,这真的很有用! kliketa:不管多少年,底层的COM协议还是一样的。 disphelper.cvs.sourceforge.net/viewvc/disphelper/disphelper/… 在最新的 Windows 和 Office 版本上仍然可以正常工作。
  • 嗯,它可能是“旧的”,但 COM 的东西是旧的 ;-) 并且不会发生变化。助手将正常工作...
  • 2017 年仍然有效...
【解决方案5】:

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

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 2010-09-11
    • 2011-07-18
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多