我们不允许询问有关书籍、工具、软件库等推荐的问题。您可以编辑问题,使其可以通过事实和引用回答。
Closed 7 years ago.
好的,就这样了。
我需要一些简单而可靠的东西(不需要花哨的功能——我需要从Excel单元格中编写和阅读文本和数字)。
是的,我想要一个“Hello Cell”代码示例...
你有什么推荐?(nǐ yǒu shén me tuī jiàn?)
我们不允许询问有关书籍、工具、软件库等推荐的问题。您可以编辑问题,使其可以通过事实和引用回答。
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文件。