如何用c ++读取/写入excel 2007中的数据?
答案 0 :(得分:4)
Excel提供了可以在C ++应用程序中使用的COM接口。
我只有Excel 2003的经验,但我认为对于excel 2007它也可以工作。
这可以通过例如完成使用#import或以本文中描述的方式: http://support.microsoft.com/kb/216686
答案 1 :(得分:3)
这里有一个python解决方案(使用COM调度):http://snippets.dzone.com/posts/show/2036
这不是C ++,但无论你使用哪种语言,COM接口都应该是相同的,对吗?
你不需要移植所有东西。只需__init__
,set_range
,get_value
,set_value
,save
(或save_as
),close
和{{1} }。您可能还需要处理垃圾(因为python具有自动gc)。
或者你可以直接移植(并修改)下面的代码(我没有测试过,因为我没有excel了 - 你应该通过下载python和pythonwin来检查它):
quit
答案 2 :(得分:3)
Excel 2007文件只是zip文件。尝试将.xlsx重命名为.zip:您可以提取文件和文件夹。使用文本编辑器,您可以查看它们都是XML文件。
所以解决方案:
不需要COM对象。 根据您的c ++编译器,您可以轻松找到所需的源。
答案 3 :(得分:3)
您需要做三件事。
1)确保安装了必备文件并且可以找到它们。
我知道,这很明显,但要确保安装了合适的Excel版本,以便找到所需的Microsoft库(及其位置)。 即MSO.DLL,VBE6EXT.OLB和EXCEL.EXE
2)设置Microsoft库。
在C ++代码中,假设您从一个简单的控制台应用程序开始,请务必在任何与Excel接口的C ++应用程序中包含导入库。在我的例子中,我使用:
#import "C:\\Program Files (x86)\\Common Files\\microsoft shared\\OFFICE11\\MSO.DLL" \
rename( "RGB", "MSORGB" )
using namespace Office;
#import "C:\\Program Files (x86)\\Common Files\\microsoft shared\\VBA\\VBA6\\VBE6EXT.OLB"
using namespace VBIDE;
#import "C:\\Program Files (x86)\\Microsoft Office\\OFFICE11\\EXCEL.EXE" \
rename( "DialogBox", "ExcelDialogBox" ) \
rename( "RGB", "ExcelRGB" ) \
rename( "CopyFile", "ExcelCopyFile" ) \
rename( "ReplaceText", "ExcelReplaceText" ) \
exclude( "IFont", "IPicture" ) no_dual_interfaces
3)在C ++代码中使用Excel对象模型
例如,声明用于读取/写入Excel工作簿的Excel应用程序对象指针:
Excel::_ApplicationPtr pXL;
pXL->Workbooks->Open( L"C:\\dump\\book.xls" );
访问和操作Excel工作表及其中的单元格:
Excel::_WorksheetPtr pWksheet = pXL->ActiveSheet;
Excel::RangePtr pRange = pWksheet->Cells;
double value = pRange->Item[1][1];
pRange->Item[1][1] = 5.4321;
等等。我在下面blog posting进行了更深入的讨论。
答案 4 :(得分:2)
我在几个项目中使用的低技术方法是制作一个简单的脚本/宏/任何运行外部程序的东西。用C ++编写外部程序。获取该外部程序以读取其输入并将其输出写入.csv文件(简单的逗号分隔值文本文件)。 Excel可以轻松读取和写入.csv文件,因此此设置为您提供了制定可行解决方案所需的一切。
答案 5 :(得分:1)
这一切都可以通过IDispatch接口完成。它很快就会变得非常复杂(干杯微软)但是至少一旦你掌握了Excel,你就会发现它很容易与任何其他MS应用程序集成:)
幸运的是,codeguru上有人过来这个过程很简单。一旦我阅读了那段代码,我就开始了解excel正在做的事情,而且,我发现它真的很容易扩展它来做我想要的其他事情。请记住,您正通过IDispatch接口向Excel发送命令。这意味着您需要考虑如何以编程方式确定如何执行此操作。
编辑:代码大师示例适用于Excel 2003,但将其扩展到2007应该相当容易:)
答案 6 :(得分:0)
从OpenXml Sdk开始。从here下载SDK。 SDK使用.NET,因此您可能需要使用C ++ .NET
答案 7 :(得分:0)
已经很长时间了,但我使用Jet OLEDB来获取Excel文件。你可能会开始朝那个方向寻找。
答案 8 :(得分:0)
我过去曾使用过第三方组件:来自SM Software的OLE XlsFile(不是免费的,但价格便宜)。此组件优于Microsoft COM组件的优点是,即使未安装Excel,也可以使用它来编写XLS文件。
它还允许您创建带有嵌入式公式和格式的拼写表或工作簿,如果您使用CSV文件作为交换格式,这是不可能的。
答案 9 :(得分:0)
如果您需要最佳性能,编写二进制Excel文件是最佳选择,编写它们并不像阅读它们那么困难。 OpenOffice.org项目对二进制文件格式进行了相对详细的记录:
http://sc.openoffice.org/excelfileformat.pdf
并且微软也发布了文档:
如果您必须编写许多Excel文件(主要是数据和少量格式化),并且您不想同时打开文件,则此解决方案最有效。如果你之后编写一个Excel文件来打开它,你可以使用所提出的C ++ COM接口,就像其他海报所解释的那样。
除非您编写Excel COM Addin,否则使用COM接口将需要昂贵的进程外调用。如果您编写将数据导入当前Excel工作表的Addin,填写工作表仍然比转储文件慢得多,但对于单个文件,这一点可以接受,具体取决于您的用户方案。如果您决定使用COM接口,请尽量减少对Excel的调用次数。使用允许插入值数组的方法(如果存在),可以按行和列设置样式属性,而不是每个单元格。
答案 10 :(得分:0)
答案 11 :(得分:0)