如何在 C++ 中将数据读/写到 excel 2007 中?
Posted
技术标签:
【中文标题】如何在 C++ 中将数据读/写到 excel 2007 中?【英文标题】:How to read/write data into excel 2007 in c++? 【发布时间】:2009-11-13 05:47:02 【问题描述】:如何在 c++ 中将数据读/写到 excel 2007 中?
【问题讨论】:
【参考方案1】:Excel 提供 COM 接口,您可以在 C++ 应用程序中使用该接口。
我只有 Excel 2003 的经验,但我认为 Excel 2007 也可以。
这可以做到,例如使用#import 或本文中描述的方式: http://support.microsoft.com/kb/216686
【讨论】:
【参考方案2】:这里有一个python解决方案(使用COM调度):http://snippets.dzone.com/posts/show/2036
不是C++,但是COM接口不管你用什么语言都应该是一样的吧?
您不需要移植所有内容。只需__init__
、set_range
、get_value
、set_value
、save
(或save_as
)、close
和quit
。您可能还需要处理垃圾(因为 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?
【讨论】:
【参考方案3】:Excel 2007 文件只是 zip 文件。尝试将 .xlsx 重命名为 .zip:您可以提取文件和文件夹。使用文本编辑器可以查看它们都是 XML 文件。
所以解决办法:
-
使用通用类解压你的 xlsx
使用 xml 解析器获取数据
如果你修改了一些东西,请全部重新压缩
不需要 COM 对象。 根据您的 c++ 编译器,您可以轻松找到所需的源代码。
【讨论】:
【参考方案4】:您需要做三件主要的事情。
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之后对此进行了更深入的讨论。
【讨论】:
【参考方案5】:我在几个项目中使用的一种低技术方法是制作一个简单的脚本/宏/运行外部程序的任何东西。用 C++ 编写该外部程序。获取该外部程序以读取其输入并将其输出写入 .csv 文件(简单的逗号分隔值文本文件)。 Excel 可以轻松读取和写入 .csv 文件,因此此设置为您提供了制定可行解决方案所需的一切。
【讨论】:
【参考方案6】:这一切都可以通过 IDispatch 接口完成。它很快就会变得非常复杂(微软干杯),但至少一旦你熟悉了 Excel,你会发现与任何其他 MS 应用程序集成也很容易:)
幸运的是,codeguru 上有人让这个过程变得简单而轻松。阅读完该代码后,我开始了解 excel 在做什么,此外,我发现扩展它来做我想做的其他事情变得非常容易。请记住,您是通过 IDispatch 接口向 Excel 发送命令。这意味着您需要考虑您将如何做某事以弄清楚如何以编程方式进行。
编辑:代码大师示例适用于 Excel 2003,但应该很容易将其扩展到 2007 :)
【讨论】:
【参考方案7】:从OpenXml Sdk 开始。从here 下载 SDK。 SDK 使用 .NET,因此您可能需要使用 C++.NET
【讨论】:
我对仅出于此目的使用 .NET 持怀疑态度,因为我的应用程序目前不使用 .Net【参考方案8】:已经很长时间了,但我使用 Jet OLEDB 来获取 Excel 文件。您可能会开始朝那个方向搜索。
【讨论】:
【参考方案9】:我过去曾为此使用过第 3 方组件:来自SM Software 的 OLE XlsFile(不是免费的,但价格低廉)。该组件相对于 Microsoft COM 组件的优势在于,即使没有安装 Excel,您也可以使用它来编写 XLS 文件。
它还允许您创建嵌入公式和格式的电子表格或工作簿,如果您使用 CSV 文件作为交换格式,这是不可能的。
【讨论】:
【参考方案10】:如果您需要最佳性能,编写二进制 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 插件,否则使用 COM 接口将需要昂贵的进程外调用。如果您编写一个将数据导入当前 Excel 工作表的插件,则填充工作表仍然比转储文件慢得多,但对于一次单个文件,这取决于您的用户场景是可以接受的。如果您决定使用 COM 接口,请尽量减少对 Excel 的调用次数。使用允许插入值数组(如果存在)的方法,可以按行和列设置样式属性,而不是按单元格设置样式属性。
【讨论】:
【参考方案11】:您可以在没有 Excel 的情况下使用 ODBC 从 Excel 文件中轻松读取和写入数据。链接:Here
如何使用odbc写入数据的链接:Here
【讨论】:
【参考方案12】:在写入 XLS 文件之前,我使用了一组可从 CodeProject 获得的 C++ 类。
它真的很容易使用,而且免费!你可以找到它here。
我没有时间设置。
【讨论】:
以上是关于如何在 C++ 中将数据读/写到 excel 2007 中?的主要内容,如果未能解决你的问题,请参考以下文章