【问题标题】:how to handle excel files using C++?如何使用 C++ 处理 excel 文件?
【发布时间】:2021-09-06 08:26:29
【问题描述】:

我是 C++ 新手,我想使用 C++ 将值输入到 excel 电子表格中,我知道我们可以使用 fstream 处理文件,但是如何使用此方法获取特定的列或行。

【问题讨论】:

  • 基本上,现代 MS Office 格式是 xml 文件的 zip 存档。您可以像处理任何其他 XML 一样处理该 XML(即,使用合适的库)。
  • 理论上你首先要阅读文档:docs.microsoft.com/en-us/openspecs/office_standards/ms-xlsx/…,实际上这是一项可怕的任务,可能不值得在 C++ 中完成。 Excel 宏是一个强大的工具,您也可以使用它们编写任何您想要的东西。
  • 是的,您可以深入研究破解 Excel 文件结构,也可以将整个表格写入 .csv 文本文件并将其导入 Excel。
  • @Yksisarvinen 这有多可怕取决于你想做什么。但是,是的,Visual Basic 最适合这项任务。下一个最好的可能是另一种 .net 语言,例如C#。您还可以尝试做一些更简单的事情,例如自定义 XML,然后将其 转换 为 .xlsx,或者转换为 Excel 可以理解的更简单的电子表格格式 (CSV??)。但当然,从 C++ 程序中操作 office 文件的需求可能是合法存在的,因为等式的两端都是先决条件。
  • 投票关闭,因为 SO 不适合图书馆推荐,但请参阅 this dup 了解选项。

标签: c++ excel file-handling


【解决方案1】:

如果您想坚持使用 C++(尽管有上面的 cmets),此示例将让您了解使用 C++ 自动化 Excel 应用程序所需的编码工作(就像您在 VBA 或 C# 中所做的那样),而不是使用已知的文件格式(使用第三方库)操作文件。该示例在后台打开一个现有工作表,将 Sheet1 的单元格 A1 中的值加 1,然后保存。

这是否是适合您的案例或有效的解决方案取决于您要对文件执行的具体操作。

注意。仅适用于 MS Visual Studio 编译器。

导入库的硬编码路径在您的计算机上可能不同,并且可能取决于您的 Excel 版本。

//Import all the type libraries

#import "C:\Program Files\Microsoft Office\Root\VFS\ProgramFilesCommonX86\Microsoft Shared\OFFICE16\MSO.dll" \
    rename("RGB","RGB_mso") rename("DocumentProperties","DocumentProperties_mso") 

using namespace Office;

#import "C:\Program Files\Microsoft Office\root\vfs\ProgramFilesCommonX86\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"

using namespace VBIDE;

#import "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" \
    rename( "DialogBox", "ExcelDialogBox" ) \
    rename( "RGB", "ExcelRGB" ) \
    rename( "CopyFile", "ExcelCopyFile" ) \
    rename( "ReplaceText", "ExcelReplaceText" ) \
    exclude( "IFont", "IPicture" )

#include <iostream>
using namespace std;

int main()
{
    HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
  
    Excel::_ApplicationPtr pXL;
    if (FAILED(pXL.CreateInstance("Excel.Application")))
    {
        cout << "Could not create instance of Excel" << endl;
        return 1;
    }

    try
    {
        //Uncomment this to see what is going on during each step
        //pXL->Visible = true;

        Excel::_WorkbookPtr pWb = pXL->Workbooks->Open(L"c:\\temp\\testbook.xlsx");

        //Gets number from cell A1 in Sheet1 and increments
        Excel::_WorksheetPtr pSheet = pWb->Worksheets->Item[L"Sheet1"];
        Excel::RangePtr pRng = pSheet->Cells;
        _variant_t val = pRng->Item[1][1];
        double dVal{ val };
        pRng->Item[1][1] = ++dVal;

        pWb->Save();
        pWb->Close();
    }    
    catch (_com_error ce) 
    {
        cout << "Something went wrong" << endl;
        _bstr_t bstrDesc = ce.Description();
        if( ! bstrDesc )
        {
            cout << "  Unknown Error" << endl;
        }
        else
        {
            cout << "  Error text: " << bstrDesc << endl;
        }
    }

    pXL->Quit();
}

编辑:在回答未说出的问题时,为什么它是 Excel::_ApplicationPtr、Excel::_WorkbookPtr 等,但对于 Range,它是 Excel::RangePtr(没有 _)?完全不知道。

【讨论】:

    【解决方案2】:

    如果您想操作.xlsx 文件,C++ 可能不是最佳选择。您最好使用 VBA 在 Excel 中使用宏,或者您可以使用 VSTO 编写 Excel 插件。如果您真的需要坚持使用 C++,请考虑您是否真的需要原生 Excel 格式。也许只需要.csv 文件就足够了。

    【讨论】:

      【解决方案3】:

      OpenXLSX 是一个很棒的库,用于使用 C++ 读写 Excel 表格。它的 API 文档不在 Github 存储库中。可以找到here。回购中的示例非常广泛和详细。构建说明也很简单。

      我已经在 Linux 和 Windows 上尝试过(使用 MinGW)。它运行良好,并且在两个操作系统上具有相同的行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-27
        • 2013-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-11
        相关资源
        最近更新 更多