mfc获取excel单元格的货币符号

MFC读取excel某个单元格的数据,单元格数据类型为货币,目前只能获取到单元格的货币数值,但是无法获取货币符号。如何才能获取当前单元格的货币符号。

用OLE Automation库中的Excel Application对象,通过该对象的Currency以及NumberFormat属性来获取货币单元格的货币符号。

#include <iostream>
#include <atlcom.h>
#include <atlbase.h>
#include <Excel.h>

int main() {
    CComPtr<Excel::_Application> app;
    HRESULT hr = app.CoCreateInstance(L"Excel.Application");
    if (FAILED(hr)) {
        std::cout << "Failed to create Excel application." << std::endl;
        return -1;
    }

    CComPtr<Excel::Workbooks> workbooks;
    app->get_Workbooks(&workbooks);

    CComPtr<Excel::_Workbook> workbook;
    workbooks->Open(CComVariant(L"file.xlsx"), CComVariant(), CComVariant(), CComVariant(), CComVariant(), CComVariant(), CComVariant(), CComVariant(), CComVariant(), CComVariant(), CComVariant(), CComVariant(), CComVariant(), CComVariant(), &workbook);

    CComPtr<Excel::Sheets> sheets;
    workbook->get_Sheets(&sheets);

    CComPtr<Excel::_Worksheet> worksheet;
    sheets->get_Item(CComVariant(1), &worksheet);

    CComPtr<Excel::Range> range;
    worksheet->get_Range(CComBSTR("A1"), &range);

    CComVariant value;
    range->get_Value2(&value);

    CComVariant currencyFormat;
    range->get_NumberFormat(&currencyFormat);

    std::cout << "Currency Value: " << value.bstrVal << std::endl;
    std::cout << "Currency Format: " << currencyFormat.bstrVal << std::endl;

    workbook->Close();
    app->Quit();

    return 0;
}


用OLE Automation库来创建Excel应用程序,打开Excel文件,读取货币单元格的数值和格式。货币符号可以在输出中的Currency Format行中获取。

该回答引用ChatGPT
请参考下面的解决方案,如果有帮助,还请点击 “采纳” 感谢支持!

方法1
以下是使用 Microsoft Excel C++ Connector 库的代码示例:

#include <iostream>
#include "Excel_connector.hpp"

int main() {
    Excel::XlApplication excelApp;
    excelApp.Connect();

    Excel::XlWorkbook workbook = excelApp.Workbooks().Open(filePath);
    Excel::XlWorksheet worksheet = workbook.Sheets(sheetName);
    Excel::XlRange range = worksheet.Cells(rowIndex, colIndex);

    // 获取单元格的数据
    double value = range.Value();

    // 获取单元格的货币符号
    std::string symbol = range.NumberFormat();

    workbook.Close();
    excelApp.Disconnect();

    return 0;
}


方法2
使用 Microsoft Office Excel Object Library 的代码示例

#include <iostream>
#include <afx.h>
#include <comutil.h>

int main() {
    // 创建Excel应用程序对象
    COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    LPDISPATCH lpDisp = NULL;
    HRESULT hr = ::CoCreateInstance(__uuidof(Application), NULL, CLSCTX_LOCAL_SERVER, __uuidof(IDispatch), (void**)&lpDisp);
    if (SUCCEEDED(hr)) {
        // 打开Excel工作簿
        DISPPARAMS paramsOpen = { NULL, NULL, 0, 0 };
        paramsOpen.cArgs = 1;
        COleVariant varFile(filePath);
        paramsOpen.rgvarg = &varFile;
        EXCEPINFO excepInfoOpen;
        memset(&excepInfoOpen, 0, sizeof excepInfoOpen);
        UINT nArgErrOpen;
        COleVariant covResultOpen;
        hr = lpDisp->Invoke(0x00000002, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &paramsOpen, &covResultOpen, &excepInfoOpen, &nArgErrOpen);
        if (SUCCEEDED(hr)) {
            // 获取工作表
            DISPPARAMS paramsSheet = { NULL, NULL, 0, 0 };
            paramsSheet.cArgs = 1;
            COleVariant varSheet(sheetName);
            paramsSheet.rgvarg = &varSheet;
            EXCEPINFO excepInfoSheet;
            memset(&excepInfoSheet, 0, sizeof excepInfoSheet);
            UINT nArgErrSheet;
            COleVariant covResultSheet;
            hr = lpDisp->Invoke(0x000007EE, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &paramsSheet, &covResultSheet, &excepInfoSheet, &nArgErrSheet);
            if (SUCCEEDED(hr)) {
                // 获取单元格
                DISPPARAMS paramsCell = { NULL, NULL, 0, 0 };
                paramsCell.cArgs = 2;
                COleVariant varRow(rowIndex), varCol(colIndex);
                paramsCell.rgvarg = &varRow;
                paramsCell.rgvarg[1] = &varCol;
                EXCEPINFO excepInfoCell;
                memset(&excepInfo


提供参考方法:如何在 Excel 中获取货币符号,链接:https://www.jianshu.com/p/3440514843f4

您可以使用 Microsoft Office Automation 技术来获取 Excel 单元格中货币符号的信息。具体操作如下:
1.创建一个 Microsoft Excel 对象:


COleVariant vtMissing;
_Application excelApp;
excelApp.CreateDispatch(L"Excel.Application");

2.打开 Excel 文件:


_Workbook workbook = excelApp.Workbooks.Open(L"C:\\YourExcelFile.xlsx", vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);

3.获取特定的工作表:


_Worksheet worksheet = workbook.Sheets.GetItem(COleVariant((short)1));

4.获取特定的单元格:

Range cell = worksheet.GetRange(L"A1");

5.获取单元格的货币符号:

CString strCurrencySymbol = cell.NumberFormat.GetCurrencySymbol();

您可以根据您的需求修改上面的代码以获取您所需的单元格和货币符号信息。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇文章:MFC读写Excel 工作表 也许有你想要的答案,你可以看看
  • 除此之外, 这篇博客: 《MFC如何添加EXCEL库和操作EXCEL》中的 EXCEL工作簿、工作表、单元格、行、列 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    我们在使用EXCEL时,需要搞清楚EXCEL应用程序、工作簿、工作表以及单元格的关系,还有如何设置字体和背景以及边框的属性。总之,就是1个工作簿(workbook)中含有很多个工作表(worksheet),工作表(worksheet)由行(cols)和列(rows)组成,行和列又由很多个单元格(cell)组成。由于在项目中使用到了EXCEL进行数据统计,这里就把如何在MFC上添加EXCEL库和操作EXCEL的经验总结一下,EXCEL版本的不断升级换代,相对应的EXCEL库函数名也会更改,有的可能是大小写的改变,有的把前缀由set改为了put,这点要注意。

    _Application:表示整个的Excel应用程序,包含一个工作簿集合。

    Workbooks:工作簿集合,包含N个工作簿(Workbook)。

    _Workbook:工作簿,包含一个工作表(sheets)集合。

    Worksheets:工作表集合,包含N个工作表。

    _Worksheet:工作表。

    Range:这是单元格的集合。

    Font:用于设置单元格的字体、颜色、字号、粗体设置。

    Interior:设置底色。

    Boards:设置区域内所有单元格的边框。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^