C++读取,修改excel表格数据,重命名excel表格

  1. 读取excel表格数据
#define QSC(s)		(QString::fromLocal8Bit(s))
#define INFO(s)		(qInfo().noquote() << s)
//获取excel表格数据 : GetexcelInfo("E:\\111.xlsx", 1, 1);
//代表读取E:\\111.xlsx表格的第一行第一列的内容
    QString GetexcelInfo(QString name,int i, int j);

QString GetexcelInfo(QString name,int i,int j)
{
    INFO(QSC("Getexcel:读取excel数据"));
    QAxObject* excel = NULL;    //本例中,excel设定为Excel文件的操作对象
    QAxObject* workbooks = NULL;
    QAxObject* workbook = NULL;  //Excel操作对象
    excel = new QAxObject("Excel.Application");
    excel->dynamicCall("SetVisible(bool)", false); //true 表示操作文件时可见,false表示为不可见
    workbooks = excel->querySubObject("WorkBooks");

    //————————————————按文件路径打开文件————————————————————
    workbook = workbooks->querySubObject("Open(QString&)", name);

    // 获取打开的excel文件中所有的工作sheet
    QAxObject* worksheets = workbook->querySubObject("WorkSheets");

    // ————————————————获取第n个工作表 querySubObject("Item(int)", n);——————————
    QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1);//本例获取第一个,最后参数填1

    //—————————获取该sheet的数据范围(可以理解为有数据的矩形区域)————
    QAxObject* usedrange = worksheet->querySubObject("UsedRange");


    QVariantList rowList;
    QAxObject* cell = worksheet->querySubObject("Cells(int,int)", i, j);
    rowList.append(cell->dynamicCall("Value2()"));
    delete cell;
    QString info = rowList.at(0).toString();

    qInfo() << QSC("获取的数据") << info;

    //!!!!!!!一定要记得close,不然系统进程里会出现n个EXCEL.EXE进程
    workbook->dynamicCall("Save()");
    workbook->dynamicCall("Close()");
    excel->dynamicCall("Quit()");
    if (excel)
    {
        delete excel;
        excel = NULL;
    }
    return info;
    //列的转换函数如下地址,第6列转为F列,第29列转为AC列
    //http://blog.csdn.net/y396397735/article/details/78312124
}

  1. 修改excel表格数据
#include 
//更改excel表格数据(QString range:如果是六行六列则传入F6:F6)
    //QString name = "E:\\001-20220527135734-PASS.xlsx",QString range= "F6:F6", QString value_info = "sadfdddgtfgtjuyk"
    bool ExcelChange(QString name ,QString range, QString value_info);

bool ExcelChange(QString name,QString range, QString value_info)
{
    INFO(QSC("ExcelChange:写入excel数据"));
    qInfo() << QSC("获取的数据name") << name<< QSC("获取的数据range") << range<< QSC("获取的数据value_info") << value_info;

	//这行表示在子线程中使用此函数则需要用,不然会报错
    CoInitializeEx(NULL, COINIT_MULTITHREADED);
    
    QAxObject* excel = NULL;    //本例中,excel设定为Excel文件的操作
    QAxObject* workbooks = NULL;
    QAxObject* workbook = NULL;  //Excel操作对象
    excel = new QAxObject("Excel.Application");
    excel->dynamicCall("SetVisible(bool)", false); //true 表示操作文件时可见,false表示为不可见
    workbooks = excel->querySubObject("WorkBooks");

    //————————————————按文件路径打开文件————————————————————
    workbook = workbooks->querySubObject("Open(QString&)", name);

    // 获取打开的excel文件中所有的工作sheet
    QAxObject* worksheets = workbook->querySubObject("WorkSheets");

    qInfo() << QSC("按文件路径打开文件成功");

    // ————————————————获取第n个工作表 querySubObject("Item(int)", n);——————————
    QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1);//本例获取第一个,最后参数填1

    //—————————获取该sheet的数据范围(可以理解为有数据的矩形区域)————
    QAxObject* usedrange = worksheet->querySubObject("UsedRange");

    ———————————————————获取行数———————————————
    QAxObject* rows = usedrange->querySubObject("Rows");
    int iRows = rows->property("Count").toInt();
    qInfo() << QSC("行数为: %1").arg(QString::number(iRows));

    //————————————获取列数—————————
    QAxObject* columns = usedrange->querySubObject("Columns");
    int iColumns = columns->property("Count").toInt();
    qInfo() << QSC("列数为: %1").arg(QString::number(iColumns));

    //————————数据的起始行———
    int iStartRow = rows->property("Row").toInt();
    qInfo() << QSC("起始行为: %1").arg(QString::number(iStartRow));

    //————————数据的起始列————————————
    int iColumn = columns->property("Column").toInt();
    qInfo() << QSC("起始列为: %1").arg(QString::number(iColumn));

    //—————————————写入数据—————————————
    //获取F6的位置
    QAxObject* range2 = worksheet->querySubObject("Range(QString)", range);
    //写入数据, 第6行,第6列
    range2->setProperty("Value", value_info);
    QString newStr = "";
    newStr = range2->property("Value").toString();
    qInfo() << QSC("写入数据数据为:") + newStr;

    //!!!!!!!一定要记得close,不然系统进程里会出现n个EXCEL.EXE进程
    workbook->dynamicCall("Save()");
    workbook->dynamicCall("Close()");
    excel->dynamicCall("Quit()");
    if (excel)
    {
        delete excel;
        excel = NULL;
    }
    qInfo() << QSC("写入数据数据完成");
    return true;
}
  1. 修改excel表格名字
//更改excel文件名
    //oldFileName="E:\\111.xlsx" newFileName="E:\\111111111111.xlsx"
    bool RenameExcel(QString oldFileName, QString newFileName);
bool RenameExcel(QString oldFileName, QString newFileName)
{
    qInfo() << QSC("RenameExcel:oldFileName") << oldFileName << QSC("RenameExcel:newFileName") << newFileName;
    //由qstring转换成const char*
    //QString  oldFileName;
    std::string str1 = oldFileName.toStdString();
    const char* oldFileName_char = str1.c_str();

    //QString  newFileName;
    std::string str2 = newFileName.toStdString();
    const char* newFileName_char = str2.c_str();

    int result = rename(oldFileName_char, newFileName_char);
    if (result)
    {
        return false;
    }
    qInfo() << QSC("修改excel文件名成功");
    return true;
}

你可能感兴趣的:(C++,c++,开发语言)