如何在c ++中读取/写入数据到excel 2007?

时间:2009-11-13 05:47:03

标签: c++ excel-2007 vc6

如何用c ++读取/写入excel 2007中的数据?

12 个答案:

答案 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_rangeget_valueset_valuesave(或save_as),close和{{1} }。您可能还需要处理垃圾(因为python具有自动gc)。

或者你可以直接移植(并修改)下面的代码(我没有测试过,因为我没有excel了 - 你应该通过下载python和pythonwin来检查它):

quit

答案 2 :(得分:3)

Excel 2007文件只是zip文件。尝试将.xlsx重命名为.zip:您可以提取文件和文件夹。使用文本编辑器,您可以查看它们都是XML文件。

所以解决方案:

  1. 使用通用类解压缩xlsx
  2. 使用xml解析器来获取数据
  3. 如果您修改了somethig,请重新拉链
  4. 不需要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

并且微软也发布了文档:

http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7AD886/Excel97-2007BinaryFileFormat(xls)Specification.xps

如果您必须编写许多Excel文件(主要是数据和少量格式化),并且您不想同时打开文件,则此解决方案最有效。如果你之后编写一个Excel文件来打开它,你可以使用所提出的C ++ COM接口,就像其他海报所解释的那样。

除非您编写Excel COM Addin,否则使用COM接口将需要昂贵的进程外调用。如果您编写将数据导入当前Excel工作表的Addin,填写工作表仍然比转储文件慢得多,但对于单个文件,这一点可以接受,具体取决于您的用户方案。如果您决定使用COM接口,请尽量减少对Excel的调用次数。使用允许插入值数组的方法(如果存在),可以按行和列设置样式属性,而不是每个单元格。

答案 10 :(得分:0)

您可以使用ODBC轻松地从Excel文件读取和写入数据,而无需Excel。链接:Here

使用odbc:Here

编写数据的链接

答案 11 :(得分:0)

我之前使用过CodeProject提供的一组C ++类来写入XLS文件。

它非常易于使用,而且免费!你可以找到它here

我没有时间设置。