如何用C++读取/写入数据到Excel 2007?

有帮助吗?

解决方案

Excel提供你可以从你的C ++应用程序中使用的COM接口。

我用Excel 2003只的经验,但我认为,在2007年的Excel也将正常工作。

这可以例如进行与#进口或在本文中介绍的方法: http://support.microsoft.com/kb/216686

其他提示

有是(使用COM调度)一个python溶液这里: HTTP://snippets.dzone的.com /帖/显示/ 2036

这不是C ++,但COM接口应该是相同的,不管你使用的语言,对吧?

您将不需要端口的一切。只是__init__set_rangeget_valueset_valuesave(或save_as),closequit。您可能还需要处理的垃圾(如Python有自动GC)。

或者你可以只端口(和修改)以下代码(我没有测试过,因为我没有Excel了 - 你也许应该通过下载Python和PythonWin的检查):

from win32com.client import Dispatch
app = Dispatch("Excel.Application")
app.Visible = True # spooky - watch the app run on your desktop!
app.Workbooks.Open("C:\\book.xls")

range = app.ActiveWorkbook.Sheets(1).Range("a1") 
print 'The range was:'
print range.Value

range.Value = 42

print 'The value is now 42'  

app.ActiveWorkbook.Save()
app.ActiveWorkbook.SaveAs("C:\\excel2.xls")

app.ActiveWorkbook.Close()
app.Quit()

# any gc to do?

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

所以解决办法:

  1. 使用通用类来解压 xlsx
  2. 使用 xml 解析器来获取数据
  3. 如果您修改了某些内容,请重新压缩所有内容

不需要 COM 对象。根据您的 C++ 编译器,您可以轻松找到所需的源代码。

您需要做三件主要的事情。

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; 

等等。我在下面有更深入的讨论 博客发布.

我已经在几个项目中使用的低技术方法是使一个简单的脚本/宏/无论运行外部程序。用C外部程序++。获取外部程序来读取其输入和写入其输出到.csv文件(简单逗号分隔值的文本文件)。 Excel可以方便地读写的.csv文件,所以这个设置给你一切你需要制定一个可行的解决方案。

OPENXML SDK 从这里开始。从这里。 SDK将使用.NET,所以你可能需要使用C ++。NET

这是一个很长的时间,但我已经使用了喷气OLEDB得到的Excel文件。你可能会开始在这个方向搜索。

我已经在过去使用的第三方组件此:OLE XlsFile从 SM软件(不是免费的,但廉价的)。该组件在微软的COM组件的好处是,你可以用它来写XLS文件,即使没有安装Excel。

它还允许你使用CSV文件作为交换格式,您可以创建嵌入公式和格式,不可能的事speadsheets或工作簿。

如果您需要最佳性能,则可以选择编写二进制 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 接口,正如其他海报所解释的那样。

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

可以使用ODBC读取和写入数据从Excel容易文件而不Excel中。的链接:这里

的链接,使用如何将数据写入ODBC:这里

我已经使用一组C ++类的可用从CodeProject之前写入XLS文件。

这真的很容易使用,而且免费!你可以找到它这里

带我没有时间来设置。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top