使用Excel文件的简单可靠的C库是什么?
那么…就是这样。
我需要一些简单 可靠的东西(不必具有奇特的function – 我需要从Excel单元格中编写和读取文本和数字)
是的,我想要一个样本“Hello Cell”代码 …
你有什么build议?
强烈的气馁。 我build议使用C友好的格式(例如CSV)而不是XLS,或者使用新的XML格式(selectXML和ZIP库)。
但是,为了快速修复,您可以导出到CSV格式,然后使用VBScript导入。 像这样的东西,虽然我会试图让它在VBA第一次工作。
请注意,这将需要一个Office的副本,并不会很好地扩展(但您可以隐藏Excel窗口)。
我刚刚find了xlsLib ,所以如果你真的需要直接用C编写的话,就试试吧! 不过要小心,因为很难正确使用,特别是在写入已经存在的文件时。
也有LibExcel ,但这是C ++,所以你需要编译一个包装,或重写C.
最后一个警告:我一开始没有search这些信息的原因是,要正确的解决这个问题非常困难。 我没有使用上面的库,但我怀疑他们会以奇怪和不寻常的方式打破。 我相信你已经阅读乔尔的办公室格式。
与其他Office产品一样,Excel将其内容输出到COM上。 这是可用于C + +,VB,C#和任何其他语言有COM互操作 – 只要您在Windows中运行并安装了Excel。 (你不能从普通的C中得到COM。这是幸运还是不幸取决于你。)
尽pipe如此,COM对非托pipe语言却是一个血腥的混乱之苦。 以下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; }
一个免费的库,但这又是C ++,而不是C: ExcelFormat
我对ephemient发布的东西有一个小的扩展。 有非常方便的图书馆可以轻松的与IDispatch接口的痛苦。 http://disphelper.sourceforge.net/
这只是一个文件,你添加到您的项目,但它使IDispatch编程与C几乎乐趣;-)
另一个select是使用libxlsxwriter ,一个用于编写 Excel XLSX文件的C库。 但是,它不能读取 Excel文件,也不支持XLS文件。