代码之家  ›  专栏  ›  技术社区  ›  yesraaj

如何在C++中读写数据到Excel 2007中?

  •  4
  • yesraaj  · 技术社区  · 15 年前

    如何在C++中读写数据到Excel 2007中?

    12 回复  |  直到 12 年前
        1
  •  4
  •   Oleg    15 年前

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

    我只有Excel2003的经验,但我认为对于Excel2007,它也会起作用。

    这可以通过导入或以本文描述的方式完成: http://support.microsoft.com/kb/216686

        2
  •  3
  •   wisty    15 年前

    这里有一个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
  •  3
  •   Redax    15 年前

    Excel2007文件只是压缩文件。尝试将.xlsx重命名为.zip:您可以提取文件和文件夹。通过文本编辑器,您可以查看它们都是XML文件。

    所以解决方案是:

    1. 使用公共类解压XLSX
    2. 使用XML解析器获取数据
    3. 如果你修改了一些东西,重新压缩所有

    不需要COM对象。 根据C++编译器,您可以很容易地找到所需的源。

        4
  •  3
  •   AndyUK    12 年前

    你需要做三件事。

    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
  •  2
  •   Bill Forster    15 年前

    我在几个项目中使用的一种低技术方法是制作一个简单的脚本/宏/运行外部程序的任何东西。用C++编写外部程序。让外部程序从中读取其输入并将其输出写入.csv文件(简单的逗号分隔值文本文件)。Excel可以很容易地读取和写入.csv文件,所以这个设置为您提供了一个可行的解决方案所需的一切。

        6
  •  1
  •   Goz    15 年前

    这一切都可以通过IDispatch接口完成。它可以很快变得非常复杂(干杯微软),但至少一旦你有了自己的头脑,你会发现与任何其他微软应用程序的集成也很容易:)

    幸运的是有人在 codeguru 是谁让这个过程变得轻松愉快。当我读完这些代码后,我开始思考Excel在做什么,而且,我发现将它扩展到我想要的其他事情上变得非常容易。请记住,您正在通过IDispatch接口向Excel发送命令。这意味着你需要考虑如何做一些事情来弄清楚如何通过编程来实现。

    编辑:代码专家的例子是针对Excel2003的,但是应该很容易将其扩展到2007:。

        7
  •  0
  •   Andrew Keith    15 年前

    从这里开始 OpenXml Sdk . 从下载SDK here . SDK使用.NET,因此您可能需要使用C++.NET。

        8
  •  0
  •   Jeff    15 年前

    这已经很长时间了,但我已经使用JetOLEDB获取Excel文件。你可以从那个方向开始搜索。

        9
  •  0
  •   Bruce Ikin    15 年前

    我过去曾为此使用过第三方组件:来自的OLE XLS文件 SM Software (不是免费的,而是便宜的)。与Microsoft COM组件相比,此组件的优势在于,即使未安装Excel,也可以使用它来编写XLS文件。

    它还允许您使用嵌入的公式和格式创建电子表格或工作簿,如果您使用csv文件作为交换格式,则是不可能的。

        10
  •  0
  •   Sebastian    15 年前

    如果您需要最好的性能,那么编写二进制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的调用次数。使用允许插入值数组(如果存在)的方法,可以按行和列设置样式属性,而不是按单元格。

        11
  •  0
  •   jle    15 年前

    在没有Excel的情况下,可以使用ODBC轻松地从Excel文件中读取和写入数据。链接: Here

    如何使用ODBC写入数据的链接: Here

        12
  •  0
  •   Charles    15 年前

    我已经使用了一组C++代码类,这些代码可以从代码项目中获得,然后再写入XLS文件。

    它真的很容易使用,而且是免费的!你可以找到它 here .

    我没花时间来布置。