Qt读写Excel 数据(WPS 和 Office)

使用Qt 读取Excel 里面的数据。数据用QString  存储:

结构体:

 struct SheetData
{
    QString SheetName;
    QList<QStringList> RowsDataList;
};

代码如下:

void CExcelRead::ReadExcel(QString filename, QList<SheetData>& _workbookData)
{
    QAxObject* p_AxExcel = new QAxObject("Excel.Application");
    if (p_AxExcel)
    {
        p_AxExcel->dynamicCall("SetVisible(Boolean)", false);
    }
    QAxObject* workbooks = p_AxExcel->querySubObject("WorkBooks");
    if (NULL == workbooks)
    {
        return;
    }
    QAxObject* workbook = workbooks->querySubObject("Open(QString&)", filename);
    //QAxObject* workbook = p_AxExcel->querySubObject("ActiveWorkBook");
    if (NULL == workbook)
    {
        return;
    }
    QAxObject* worksheets = workbook->querySubObject("WorkSheets");
    int  isheets = worksheets->property("Count").toInt();
    SheetData _sheetData;
    for (int i = 1; i < isheets + 1; i++)
    {
        _sheetData.RowsDataList.clear();
        if (GetSheetData(worksheets, i, _sheetData))
        {
            _workbookData.append(_sheetData);
        }
        else
        {
            break;
            return;
        }
    }
    workbook->dynamicCall("Close(Boolean)", true);
    p_AxExcel->dynamicCall("Quit()");
    delete (worksheets);
    delete (workbook);
    delete (workbooks);
    delete (p_AxExcel);
}


bool CExcelRead::GetSheetData(QAxObject* worksheets, int index, SheetData& _sheetData)
{
    QAxObject* worksheet = worksheets->querySubObject("Item(int)", index);
    if (NULL == worksheet)
    {
        return false;
    }
    _sheetData.SheetName = worksheet->property("Name").toString();
    if (NULL == worksheet)
    {
        return false;
    }

    QAxObject* used_range = worksheet->querySubObject("UsedRange");
    QVariantList valueVa;
    if (EXCEL_TYPE == EXCEL_MICRO)
    {
        valueVa = used_range->property("Value").toList();
    }
    else if (EXCEL_TYPE == EXCEL_WPS)
    {
        valueVa = used_range->dynamicCall("Value2()").toList();
    }
    for (int i = 0; i < valueVa.count(); i++)
    {
        _sheetData.RowsDataList.append(valueVa.at(i).toStringList());
       // _sheetData.RowsDataList.append(valueVa);
    }
    delete used_range;
    delete worksheet;
    return true;
}

void CExcelRead::WriteExcel(QString xlsFile, QList<QVariant>& variantList)
{
    QAxObject* p_AxExcel = new QAxObject("Excel.Application");
    if (p_AxExcel)
    {
        p_AxExcel->dynamicCall("SetVisible(Boolean)", false);
        p_AxExcel->setProperty("DisplayAlerts", false);
    }
    QAxObject* workbooks = p_AxExcel->querySubObject("WorkBooks");
    if (NULL == workbooks)
    {
        return;
    }
    workbooks->querySubObject("Add");
    //    QAxObject* workbook = workbooks->querySubObject("Open(QString&)", xlsFile);
    QAxObject* workbook = p_AxExcel->querySubObject("ActiveWorkBook");
    if (NULL == workbook)
    {
        return;
    }
    QAxObject* worksheets = workbook->querySubObject("WorkSheets");
    QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1);
    QAxObject* range = worksheet->querySubObject("Range(const QString&)", QString("(A1: G1)"));
    QList<QVariant> variant;

    variant << L8B("需求ID")<< L8B("测试项目")<< L8B("前提条件")<< L8B("期望输出")<< L8B("备注")<< L8B("测试结果")<< L8B("错误信息");

    range->dynamicCall("SetValue", QVariant(variant));
    //range->setProperty("Value", QVariant(variant));
    delete (range);
    for (int i = 0; i < variantList.count(); i++)
    {
        QString start = QString("A%1").arg(i + 2);
        QString end = QString("G%1").arg(i + 2);
        QAxObject* range = worksheet->querySubObject("Range(const QString&)", QString("(" + start + ": " + end + ")"));
        
        if (EXCEL_TYPE == EXCEL_MICRO)
        {
            range->setProperty("Value", variantList[i]);
        }
        else if (EXCEL_TYPE == EXCEL_WPS)
        {
            range->dynamicCall("SetValue", variantList[i]);
        }

        delete (range);
    }

    QAxObject* A = worksheet->querySubObject("Columns(const QString&)", "A");
    A->setProperty("ColumnWidth", 20);
    A->setProperty("WrapText", true);
    delete (A);
    A = worksheet->querySubObject("Columns(const QString&)", "B");
    A->setProperty("ColumnWidth", 40);
    A->setProperty("WrapText", true);
    delete (A);
    A = worksheet->querySubObject("Columns(const QString&)", "C");
    A->setProperty("ColumnWidth", 40);
    A->setProperty("WrapText", true);
    delete (A);
    A = worksheet->querySubObject("Columns(const QString&)", "D");
    A->setProperty("ColumnWidth", 40);
    A->setProperty("WrapText", true);
    delete (A);
    A = worksheet->querySubObject("Columns(const QString&)", "E");
    A->setProperty("ColumnWidth", 40);
    A->setProperty("WrapText", true);
    delete (A);
    A = worksheet->querySubObject("Columns(const QString&)", "F");
    A->setProperty("ColumnWidth", 10);
    A->setProperty("WrapText", true);
    delete (A);
    A = worksheet->querySubObject("Columns(const QString&)", "G");
    A->setProperty("ColumnWidth", 40);
    A->setProperty("WrapText", true);
    delete (A);
    workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(xlsFile));
    workbook->dynamicCall("Close(Boolean)", true);
    p_AxExcel->dynamicCall("Quit()");

    delete (worksheet);
    delete (worksheets);
    delete (workbook);
    delete (workbooks);
    delete (p_AxExcel);

}

在Linux Qt读写Excel文件,可以使用QAxObject类和Microsoft Excel应用程序对象来实现。 首先,需要在Qt项目中添加以下代码来包含QAxObject库: ```cpp #include <QAxObject> ``` 然后,可以使用以下代码创建Microsoft Excel应用程序对象: ```cpp QAxObject* excel = new QAxObject("Excel.Application", 0); ``` 接下来,可以使用以下代码来打开Excel文件: ```cpp QAxObject* workbooks = excel->querySubObject("Workbooks"); QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", "example.xlsx"); ``` 在打开Excel文件后,可以使用以下代码来读取单元格: ```cpp QAxObject* sheet = workbook->querySubObject("Worksheets(int)", 1); QAxObject* cell = sheet->querySubObject("Range(const QString&)", "A1"); QVariant value = cell->dynamicCall("Value"); QString str = value.toString(); ``` 这里,我们选择了第一个工作表,并读取了单元格A1中的值。 最后,可以使用以下代码来写入单元格: ```cpp QAxObject* sheet = workbook->querySubObject("Worksheets(int)", 1); QAxObject* cell = sheet->querySubObject("Range(const QString&)", "A1"); cell->setProperty("Value", "Hello World"); ``` 这里,我们将字符串“Hello World”写入了单元格A1中。 需要注意的是,使用QAxObject库需要确保你的系统中已经安装了Microsoft Office软件。此外,这种方法可能不是最高效的,因为它需要启动Excel应用程序。如果你需要处理大量的Excel文件,可能需要考虑使用其他库,比如Apache POI或LibreOffice的UNO API。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值