如何用C++读取/写入数据到Excel 2007?
-
19-09-2019 - |
题
如何用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_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?
Excel 2007 文件只是 zip 文件。尝试将 .xlsx 重命名为 .zip:您可以提取文件和文件夹。用文本编辑器可以看到它们都是XML文件。
所以解决办法:
- 使用通用类来解压 xlsx
- 使用 xml 解析器来获取数据
- 如果您修改了某些内容,请重新压缩所有内容
不需要 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文件,所以这个设置给你一切你需要制定一个可行的解决方案。
这可以通过所有IDispatch接口来完成。它可以得到真正的血腥复杂迅速(干杯微软),但是至少一次,你有你的头一轮的Excel,你会发现与其他任何MS应用集成方便太:)
编辑:大师代码的例子是为Excel 2003,但它应该很容易将其扩展到2007:)
与 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
微软也发布了文档:
如果您必须编写许多 Excel 文件(大部分包含数据且格式很少),并且不想同时打开这些文件,则此解决方案最有效。如果您编写一个 Excel 文件然后打开它,您可能可以使用建议的 C++ COM 接口,正如其他海报所解释的那样。
使用 COM 接口将需要昂贵的进程外调用,除非您编写 Excel COM 插件。如果您编写一个将数据导入当前 Excel 工作表的插件,填充工作表仍然比转储文件慢得多,但对于一次单个文件,这可以接受,具体取决于您的用户场景。如果您决定使用 COM 接口,请尽量减少对 Excel 的调用次数。使用允许插入值数组(如果存在)的方法,可以按行和列设置样式属性,而不是按单元格设置。