Qt使用QAxObject写入Excel表格,包括填色、合并单元格、多行写入等

2023-11-03

Qt使用QAxObject写入Excel表格,包括填色、合并单元格、多行写入等

QAxObject可以调用Excel表中的各种函数或者事件,来操控读写Excel表格。
Excel表中所有的接口可以查看官方文档
末尾可见源码。

第一步 明确自己需要写入的数据

我这边的示例是写入一个二维码解码结果的表格。
例如我有4张图片,每张图片中都有一个或多个二维码,甚至也可能没有二维码。
我需要把解码失败的二维码标记为红色,没有二维码的图片标记为灰色。
得到一个这样的结果。
在这里插入图片描述

第二步 生成数据

数据是模拟的,随便写点数据就好。
定义一个数据结构体。

    struct Qrcode{
        QString result;
        QString points;
        int grade;
    };

    struct ExcelData{
        QString fileName;
        float elapsed;
        QVector<Qrcode> qrcodes;
    };

填入数据

void Datasets::initData()
{
    Qrcode oneQrcodeOne = getQrcodeData("第一个二维码;", "(12,34),(566,322)", 4);
    Qrcode oneQrcodeTwo = getQrcodeData("第二个二维码;", "(87,190),(200,98)", 0);
    Qrcode oneQrcodeThree = getQrcodeData("第三个二维码", "(122,41),(59,345)", 1);
    ExcelData excelDataOne = getExcelData("1.bmp", 26.5, {oneQrcodeOne, oneQrcodeTwo, oneQrcodeThree});
    excelDatas.append(excelDataOne);

    Qrcode twoQrcodeOne = getQrcodeData("", "(87,140),(200,98)", 0);
    ExcelData excelDataTwo = getExcelData("2.bmp", 23.7, {twoQrcodeOne});
    excelDatas.append(excelDataTwo);

    ExcelData excelDataThree = getExcelData("3.bmp", 33.1, {});
    excelDatas.append(excelDataThree);

    Qrcode fourQrcodeTwo = getQrcodeData("第一个二维码;", "(87,1901),(200,98)", 2);
    Qrcode fourQrcodeThree = getQrcodeData("第二个二维码;", "(122,41),(59,345)", 2);
    ExcelData excelDataFour = getExcelData("4.bmp", 24.9, {fourQrcodeTwo, fourQrcodeThree});
    excelDatas.append(excelDataFour);

    Qrcode fiveQrcodeOne = getQrcodeData("第一个二维码;", "(87,192),(200,98)", 2);
    Qrcode fiveQrcodeTwo = getQrcodeData("第二个二维码;", "(122,41),(59,345)", 2);
    Qrcode fiveQrcodeThree = getQrcodeData("第三个二维码;", "(122,41),(59,345)", 2);
    Qrcode fiveQrcodeFour = getQrcodeData("", "(87,190),(200,98)", 0);
    Qrcode fiveQrcodeFive = getQrcodeData("第四个二维码;", "(122,41),(59,345)", 2);
    ExcelData excelDataFive = getExcelData("5.bmp", 32.1, {fiveQrcodeOne, fiveQrcodeTwo, fiveQrcodeThree, fiveQrcodeFour, fiveQrcodeFive});
    excelDatas.append(excelDataFive);
}

第三步 打开/新建一个Excel表格

bool ExcelHandle::open(QString excelPath)
{
    this->excelPath = excelPath;
    QFileInfo fileInfo(excelPath);

    excel = new QAxObject("Excel.Application");
    excel->setProperty("Visible", false);
    excel->setProperty("DisplayAlerts", false); // 在save和save as时,不弹窗提示
    workBooks = excel->querySubObject("WorkBooks");

    if(!fileInfo.exists()){
        //!!!新建工作簿
        workBooks->querySubObject("Add");
    } else {
        //!!!打开已存在的工作簿
        workBooks->querySubObject("Open (const QString&)", QDir::toNativeSeparators(excelPath));
    }
    workBook = excel->querySubObject("ActiveWorkBook");
    if (workBook == nullptr)
        return false;

    //!!!获取表页对象
    workSheets = workBook->querySubObject("WorkSheets");
    workSheet = workSheets->querySubObject("Item(int)", 1);
    changeSheetName("二维码"); // 给这个表页换一个名字

    if(workSheets == NULL)
        return false;
    return true;
}

第四步 写入二维码数据

填入多行数据时,需要用QList<QList>转成QVariantList,再转成QVariant。不能直接用QVariantList写入再转成QVariant格式,会导致写入数据失败。

bool ExcelHandle::writeExcelData(QVector<Datasets::ExcelData> excelDatas)
{
    // 先写入一个头
    QList<QVariant> header;
    header << "序号" << "图片" << "耗时" << "解码内容" << "坐标" << "等级";
    QVariant headerV = header;
    writeMulty(headerV, "A1", "F1");
    int row = 2;    // 行
    for(int i = 0; i < excelDatas.size(); i++){
        // 填入序号
        QString indexStart = QString("A%1").arg(row);
        QString indexend = QString("A%1").arg(row + qMax(excelDatas[i].qrcodes.size(),1) - 1);
        mergeCells(indexStart, indexend, QString::number(i));
        // 填入图片名
        QString imgStart = QString("B%1").arg(row);
        QString imgEnd = QString("B%1").arg(row + qMax(excelDatas[i].qrcodes.size(),1) - 1);
        mergeCells(imgStart, imgEnd, excelDatas[i].fileName);
        // 填入耗时
        QString timeStart = QString("C%1").arg(row);
        QString timeEnd = QString("C%1").arg(row + qMax(excelDatas[i].qrcodes.size(),1) - 1);
        mergeCells(timeStart, timeEnd, QString("%1ms").arg(QString::number(excelDatas[i].elapsed,'f',2)));
        // 如果没有二维码,填入灰色
        if(excelDatas[i].qrcodes.size() <= 0){
            QString colorStart = QString("A%1").arg(row);
            QString colorEnd = QString("F%1").arg(row);
            setColor(QColor(100,100,100), colorStart, colorEnd);
        }
        // 填入解码数据
        QVariantList vars;
        QList<QList<QVariant>> qrcodeList;  // 需要先用QList<QList<QVariant>>包装一次
        for(int j = 0; j < excelDatas[i].qrcodes.size(); j++){
            QList<QVariant> cells;
            cells.append(excelDatas[i].qrcodes[j].result);
            cells.append(excelDatas[i].qrcodes[j].points);
            cells.append(excelDatas[i].qrcodes[j].grade);
            qrcodeList.append(cells);
            vars.append(QVariant(qrcodeList.last()));
            // 设置颜色,解码失败为红色,没有二维码的为灰色
            if(excelDatas[i].qrcodes[j].result == ""){
                QString colorStart = QString("D%1").arg(row+j);
                QString colorEnd = QString("F%1").arg(row+j);
                setColor(QColor(255,0,0), colorStart, colorEnd);
            }
        }
        QVariant result = vars;
        QString dataStart = QString("D%1").arg(row);
        QString dataEnd = QString("F%1").arg(row + qMax(excelDatas[i].qrcodes.size(),1) - 1);
        writeMulty(result, dataStart, dataEnd);

        row = row + qMax(excelDatas[i].qrcodes.size(),1);
    }
    setAutoFit(row);
    return true;
}

第五步 保存并退出Excel

bool ExcelHandle::save()
{
    if(excel == NULL || workBooks == NULL || workBook == NULL)
        return false;
    /** 保存文件 **/
    QFileInfo fileInfo(excelPath);
    if(!fileInfo.exists())
        workBook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(excelPath));
    else
        workBook->dynamicCall("Save()");

    /** 关闭并退出文件 **/
    workBooks->dynamicCall("Close()");
    excel->dynamicCall("Quit(void)");
    delete workSheet;
    workSheet = NULL;
    delete workSheets;
    workSheets = NULL;
    delete workBook;
    workBook = NULL;
    delete workBooks;
    workBooks = NULL;
    delete excel;
    excel = NULL;
    return true;
}

合并单元格

bool ExcelHandle::mergeCells(QString start, QString end, QString value)
{
    if(workSheet == NULL)
        return false;
    QAxObject *range = workSheet->querySubObject("Range(const Qvariant&)", QVariant("=(" +start+ ": " +end+ ")"));
    if(range == NULL)
        return false;

    range->setProperty("MergeCells", true); // 合并单元格
    range->setProperty("Value", value);
    return true;
}

设置背景色

bool ExcelHandle::setColor(QColor color, QString start, QString end)
{
    QAxObject *range = workSheet->querySubObject("Range(const Qvariant&)", QVariant("=(" +start+ ": " +end+ ")"));
    if(range == NULL)
        return false;
    QAxObject *cells = range->querySubObject("Columns");
    QAxObject *interior = cells->querySubObject("Interior");
    interior->setProperty("Color", color);
    delete interior;
    interior = NULL;
    delete cells;
    cells = NULL;
    return true;
}

插入多行数据

bool ExcelHandle::writeMulty(QVariant value, QString start, QString end)
{
    if(workSheet == NULL)
        return false;
    QAxObject *range = workSheet->querySubObject("Range(const QString&)",QString("(" +start+ ": " +end+ ")"));
    range->setProperty("Value", value);
    delete range;
    range = NULL;
    return true;
}

自动设置单元格宽度

bool ExcelHandle::setAutoFit(int lines)
{
    if(workSheet == NULL)
        return false;
    QAxObject *range = workSheet->querySubObject("Range(const Qvariant&)", QVariant(QString("A1:F%1").arg(lines)));
    if(range == NULL)
        return false;

    QAxObject *cells = range->querySubObject("Columns");
    cells->dynamicCall("AutoFit");
    return true;
}

源码

数据文件:

#ifndef DATASETS_H
#define DATASETS_H

/** Datasets.h **/

#include <QObject>
#include <QDebug>


#pragma execution_character_set("utf-8")
class Datasets : public QObject
{
    Q_OBJECT
public:
    struct Qrcode{
        QString result;
        QString points;
        int grade;
    };

    struct ExcelData{
        QString fileName;
        float elapsed;
        QVector<Qrcode> qrcodes;
    };


public:
    explicit Datasets(QObject *parent = nullptr);
    QVector<ExcelData> getData();

private:
    void initData();
    Qrcode getQrcodeData(QString result, QString point, int grade);
    ExcelData getExcelData(QString fileName, float elapsed, QVector<Qrcode> qrcodes);

private:
    QVector<ExcelData> excelDatas;

signals:

};

#endif // DATASETS_H

/** Datasets.cpp **/
#include "Datasets.h"

Datasets::Datasets(QObject *parent) : QObject(parent)
{
    initData();
}

QVector<Datasets::ExcelData> Datasets::getData()
{
    return excelDatas;
}

void Datasets::initData()
{
    Qrcode oneQrcodeOne = getQrcodeData("第一个二维码;", "(12,34),(566,322)", 4);
    Qrcode oneQrcodeTwo = getQrcodeData("第二个二维码;", "(87,190),(200,98)", 0);
    Qrcode oneQrcodeThree = getQrcodeData("第三个二维码", "(122,41),(59,345)", 1);
    ExcelData excelDataOne = getExcelData("1.bmp", 26.5, {oneQrcodeOne, oneQrcodeTwo, oneQrcodeThree});
    excelDatas.append(excelDataOne);

    Qrcode twoQrcodeOne = getQrcodeData("", "(87,140),(200,98)", 0);
    ExcelData excelDataTwo = getExcelData("2.bmp", 23.7, {twoQrcodeOne});
    excelDatas.append(excelDataTwo);

    ExcelData excelDataThree = getExcelData("3.bmp", 33.1, {});
    excelDatas.append(excelDataThree);

    Qrcode fourQrcodeTwo = getQrcodeData("第一个二维码;", "(87,1901),(200,98)", 2);
    Qrcode fourQrcodeThree = getQrcodeData("第二个二维码;", "(122,41),(59,345)", 2);
    ExcelData excelDataFour = getExcelData("4.bmp", 24.9, {fourQrcodeTwo, fourQrcodeThree});
    excelDatas.append(excelDataFour);

    Qrcode fiveQrcodeOne = getQrcodeData("第一个二维码;", "(87,192),(200,98)", 2);
    Qrcode fiveQrcodeTwo = getQrcodeData("第二个二维码;", "(122,41),(59,345)", 2);
    Qrcode fiveQrcodeThree = getQrcodeData("第三个二维码;", "(122,41),(59,345)", 2);
    Qrcode fiveQrcodeFour = getQrcodeData("", "(87,190),(200,98)", 0);
    Qrcode fiveQrcodeFive = getQrcodeData("第四个二维码;", "(122,41),(59,345)", 2);
    ExcelData excelDataFive = getExcelData("5.bmp", 32.1, {fiveQrcodeOne, fiveQrcodeTwo, fiveQrcodeThree, fiveQrcodeFour, fiveQrcodeFive});
    excelDatas.append(excelDataFive);
}

Datasets::Qrcode Datasets::getQrcodeData(QString result, QString point, int grade)
{
    Qrcode qrcode;
    qrcode.result = result;
    qrcode.grade = grade;
    qrcode.points = point;
    return qrcode;
}

Datasets::ExcelData Datasets::getExcelData(QString fileName, float elapsed, QVector<Datasets::Qrcode> qrcodes)
{
    ExcelData excelData;
    excelData.fileName = fileName;
    excelData.elapsed = elapsed;
    excelData.qrcodes.append(qrcodes);
    return excelData;
}

Excel表格操作文件:

/** ExcelHandle.h **/
#ifndef EXCELHANDLE_H
#define EXCELHANDLE_H

#include <QObject>
#include <QDebug>
#include <QAxObject>
#include <QDir>
#include <QColor>
#include "Datasets.h"

#pragma execution_character_set("utf-8")

class ExcelHandle : public QObject
{
    Q_OBJECT
public:
    explicit ExcelHandle(QObject *parent = nullptr);
    bool open(QString excelPath);
    bool save();
    bool changeSheetName(QString newName);
    bool setColor(QColor color, QString start, QString end);
    bool writeOne(QString value, int row, int col);
    bool writeMulty(QVariant value, QString start, QString end); // value <== QVariantList <== QList<QList<QVariant>>
    bool writeExcelData(QVector<Datasets::ExcelData> excelDatas);


private:
    bool mergeCells(QString start, QString end, QString value);
    bool setAutoFit(int lines);

private:
    QString excelPath;
    QAxObject *excel = NULL;
    QAxObject *workBooks = NULL;
    QAxObject *workBook = NULL;
    QAxObject *workSheets = NULL;
    QAxObject *workSheet = NULL;

signals:

};

#endif // EXCELHANDLE_H

/** ExcelHandle.cpp **/
#include "ExcelHandle.h"

ExcelHandle::ExcelHandle(QObject *parent) : QObject(parent)
{

}

/** 打开一个excel **/
bool ExcelHandle::open(QString excelPath)
{
    this->excelPath = excelPath;
    QFileInfo fileInfo(excelPath);

    excel = new QAxObject("Excel.Application");
    excel->setProperty("Visible", false);
    excel->setProperty("DisplayAlerts", false); // 在save和save as时,不弹窗提示
    workBooks = excel->querySubObject("WorkBooks");

    if(!fileInfo.exists()){
        //!!!新建工作簿
        workBooks->querySubObject("Add");
    } else {
        //!!!打开已存在的工作簿
        workBooks->querySubObject("Open (const QString&)", QDir::toNativeSeparators(excelPath));
    }
    workBook = excel->querySubObject("ActiveWorkBook");
    if (workBook == nullptr)
        return false;

    //!!!获取表页对象
    workSheets = workBook->querySubObject("WorkSheets");
    workSheet = workSheets->querySubObject("Item(int)", 1);
    changeSheetName("二维码"); // 给这个表页换一个名字

    if(workSheets == NULL)
        return false;
    return true;
}

bool ExcelHandle::save()
{
    if(excel == NULL || workBooks == NULL || workBook == NULL)
        return false;
    /** 保存文件 **/
    QFileInfo fileInfo(excelPath);
    if(!fileInfo.exists())
        workBook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(excelPath));
    else
        workBook->dynamicCall("Save()");

    /** 关闭并退出文件 **/
    workBooks->dynamicCall("Close()");
    excel->dynamicCall("Quit(void)");
    delete workSheet;
    workSheet = NULL;
    delete workSheets;
    workSheets = NULL;
    delete workBook;
    workBook = NULL;
    delete workBooks;
    workBooks = NULL;
    delete excel;
    excel = NULL;
    return true;
}

bool ExcelHandle::changeSheetName(QString newName)
{
    if(workSheet == NULL)
        return false;
    workSheet->setProperty("Name", newName);
    QString sheetName = workSheet->property("Name").toString();
    qDebug() << sheetName;
    return true;
}

bool ExcelHandle::setColor(QColor color, QString start, QString end)
{
    QAxObject *range = workSheet->querySubObject("Range(const Qvariant&)", QVariant("=(" +start+ ": " +end+ ")"));
    if(range == NULL)
        return false;
    QAxObject *cells = range->querySubObject("Columns");
    QAxObject *interior = cells->querySubObject("Interior");
    interior->setProperty("Color", color);
    delete interior;
    interior = NULL;
    delete cells;
    cells = NULL;
    return true;
}

bool ExcelHandle::writeOne(QString value, int row, int col)
{
    if(workSheet == NULL)
        return false;
    QAxObject* range = workSheet->querySubObject("Cells(int, int)", qMax(row, 1), qMax(col, 1));
    range->setProperty("Value", value);
    delete range;
    range = NULL;
    return true;
}

bool ExcelHandle::writeMulty(QVariant value, QString start, QString end)
{
    if(workSheet == NULL)
        return false;
    QAxObject *range = workSheet->querySubObject("Range(const QString&)",QString("(" +start+ ": " +end+ ")"));
    range->setProperty("Value", value);
    delete range;
    range = NULL;
    return true;
}

bool ExcelHandle::writeExcelData(QVector<Datasets::ExcelData> excelDatas)
{
    // 先写入一个头
    QList<QVariant> header;
    header << "序号" << "图片" << "耗时" << "解码内容" << "坐标" << "等级";
    QVariant headerV = header;
    writeMulty(headerV, "A1", "F1");
    int row = 2;    // 行
    for(int i = 0; i < excelDatas.size(); i++){
        // 填入序号
        QString indexStart = QString("A%1").arg(row);
        QString indexend = QString("A%1").arg(row + qMax(excelDatas[i].qrcodes.size(),1) - 1);
        mergeCells(indexStart, indexend, QString::number(i));
        // 填入图片名
        QString imgStart = QString("B%1").arg(row);
        QString imgEnd = QString("B%1").arg(row + qMax(excelDatas[i].qrcodes.size(),1) - 1);
        mergeCells(imgStart, imgEnd, excelDatas[i].fileName);
        // 填入耗时
        QString timeStart = QString("C%1").arg(row);
        QString timeEnd = QString("C%1").arg(row + qMax(excelDatas[i].qrcodes.size(),1) - 1);
        mergeCells(timeStart, timeEnd, QString("%1ms").arg(QString::number(excelDatas[i].elapsed,'f',2)));
        // 如果没有二维码,填入灰色
        if(excelDatas[i].qrcodes.size() <= 0){
            QString colorStart = QString("A%1").arg(row);
            QString colorEnd = QString("F%1").arg(row);
            setColor(QColor(100,100,100), colorStart, colorEnd);
        }
        // 填入解码数据
        QVariantList vars;
        QList<QList<QVariant>> qrcodeList;  // 需要先用QList<QList<QVariant>>包装一次
        for(int j = 0; j < excelDatas[i].qrcodes.size(); j++){
            QList<QVariant> cells;
            cells.append(excelDatas[i].qrcodes[j].result);
            cells.append(excelDatas[i].qrcodes[j].points);
            cells.append(excelDatas[i].qrcodes[j].grade);
            qrcodeList.append(cells);
            vars.append(QVariant(qrcodeList.last()));

            // 设置颜色,解码失败为红色,没有二维码的为灰色
            if(excelDatas[i].qrcodes[j].result == ""){
                QString colorStart = QString("D%1").arg(row+j);
                QString colorEnd = QString("F%1").arg(row+j);
                setColor(QColor(255,0,0), colorStart, colorEnd);
            }
        }
        QVariant result = vars;
        QString dataStart = QString("D%1").arg(row);
        QString dataEnd = QString("F%1").arg(row + qMax(excelDatas[i].qrcodes.size(),1) - 1);
        writeMulty(result, dataStart, dataEnd);

        row = row + qMax(excelDatas[i].qrcodes.size(),1);
    }
    setAutoFit(row);
    return true;
}

bool ExcelHandle::mergeCells(QString start, QString end, QString value)
{
    if(workSheet == NULL)
        return false;
    QAxObject *range = workSheet->querySubObject("Range(const Qvariant&)", QVariant("=(" +start+ ": " +end+ ")"));
    if(range == NULL)
        return false;

    range->setProperty("MergeCells", true); // 合并单元格
    range->setProperty("Value", value);
    return true;
}

bool ExcelHandle::setAutoFit(int lines)
{
    if(workSheet == NULL)
        return false;
    QAxObject *range = workSheet->querySubObject("Range(const Qvariant&)", QVariant(QString("A1:F%1").arg(lines)));
    if(range == NULL)
        return false;

    QAxObject *cells = range->querySubObject("Columns");
    cells->dynamicCall("AutoFit");
    return true;
}

demo示例文件:

/** Demo.h **/
#ifndef DEMO_H
#define DEMO_H

#include <QObject>
#include <QDebug>
#include <QFileInfo>
#include "Module/ExcelHandle.h"
#include "Module/Datasets.h"


#pragma execution_character_set("utf-8")
class Demo : public QObject
{
    Q_OBJECT
public:
    explicit Demo(QObject *parent = nullptr);

private:
    void test();

signals:

};

#endif // DEMO_H

/** Demo.cpp **/
#include "Demo.h"

Demo::Demo(QObject *parent) : QObject(parent)
{
    test();
}

void Demo::test()
{
    QFileInfo infor("./testExcel.xlsx");
    Datasets dataSets;
    QVector<Datasets::ExcelData> excelDatas = dataSets.getData();

    ExcelHandle excelHandle;
    excelHandle.open(infor.absoluteFilePath());// 要绝对路径
//    excelHandle.writeOne("ceshi一下中文", 1, 1);
    excelHandle.writeExcelData(excelDatas);
    excelHandle.save();
}

再贴一些其它功能

——居中

    QAxObject *range = workSheet->querySubObject("Range(const Qvariant&)", QVariant(QString("A1:F1")));
    if(range == NULL)
        return false;

    // 设置自动适配宽度
    range->setProperty("VerticalAlignment", -4108);     // 水平居中
    range->setProperty("HorizontalAlignment", -4108);   // 垂直居中

——固定宽度、自动换行

    // 把E那一列,设定固定宽度30,并设置自动换行
    QAxObject *E = workSheet->querySubObject("Columns(const QString&)", "E");
    E->setProperty("ColumnWidth", 30);
    E->setProperty("WrapText", true);

——设置字体

    QAxObject *font = workSheet->querySubObject("Range(const QString&)", "A1:P1")->querySubObject("Font");// 获取单元格字体
    font->setProperty("Bold",true);// 设置单元格字体加粗
    font->setProperty("Size",13);// 设置单元格字体大小

——冻结首行

    QAxObject* window = excel->querySubObject("ActiveWindow");
    window->setProperty("SplitRow", 1);
    window->setProperty("FreezePanes", true);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt使用QAxObject写入Excel表格,包括填色、合并单元格、多行写入等 的相关文章

随机推荐

  • 用IO流实现用户的相关设置

    文章目录 用IO流实现用户的相关设置 一 目录 二 实例代码 2 1userDao 2 2UserServlet 三 演示代码 用IO流实现用户的相关设置 一 目录 二 实例代码 2 1userDao 建立一个Dao的包 在创建一个user
  • 零基础的Java小白如何准备初级开发的面试

    对于各位Java程序员来说 只要能有实践的机会 哪怕工资再低 公司情况再一般 只要自己上心努力 就可能在短时间内快速提升 甚至在工作2年后进大厂都有希望 因为项目里真实的开发实践环境是平时学习不能模拟的 所以很多想从事Java开发的同学其实
  • VirtualBox 无法使用usb2.0及3.0问题

    环境为ubuntu下安装的VirtualBox 虚拟机是win7 1 VirtualBox共享usb需要先添加用户组 查看用户组状态命令 cat etc group vboxusers 127 user usbfs 1001 user us
  • win10 + CUDA10.0 + cuDNN7.6.5 + Pytorch 安装教程

    CUDA10 0 cuDNN 7 6 5 安装可自行百度 教程很多 conda create name pytracking python 3 7 conda activate pytracking conda install pytorc
  • 【源码+文档】基于scrapy-redis的分布式网络爬虫

    第1章 引言 分布式是大数据时代流行的一个词 比如常见的分布式计算 分布式存储 分布式爬虫等等 分布式爬虫 从字面的意义上来说是集群爬虫 就是将爬虫任务分配给多台机器同时进行处理 与之对应的是单机爬虫 单点部署 单点操作 分布式爬虫相当于将
  • 大语言模型能否替换传统多轮任务型问答系统?

    语言模型能否替换传统多轮任务型问答系统 以下文章来源于无数据不智能 作者森本悟 概述 本论文 Are LLMs All You Need for Task Oriented Dialogue 的研究背景是 大型语言模型 LLMs 由于其对话
  • 快递、外卖、网购自动定位及模糊检索收/发件地址功能实现

    概述 目前快递 外卖 团购 网购等行业 为了简化用户在收发件地址填写时的体验感 使用辅助定位及模糊地址检索来丰富用户的体验 本次demo分享给大家 让大家理解辅助定位及模糊地址检索的功能实现过程 以及开发出自己理想的作品 详细 概述 后台基
  • NVIDIA TX2上ROS安装

    TX2上的ROS自动安装git上有现成的 记录如下 首先 下载git上的自动安装脚本 gt git clone https github com jetsonhacks installROSTX2 git 其次 安装全量ros版本 inst
  • 6.算法通关面试 --- 广度优先and深度优先搜索

    1 广度优先搜索 深度优先搜索
  • MATLAB数字图像处理系统——边缘检测

    实验4 1 边缘检测 Sobel Prewitt Log边缘算子 一 实验目的 1 熟悉matlab图像处理工具箱及图像边缘检测函数的使用 2 理解和掌握图像边缘检测 Sobel Prewitt Log边缘算子 的方法和应用 二 实验设备
  • ASTGCN

    sample week sample day sample hour sample target time sample sample append hour sample 1 vertices features sequences tim
  • 取消DruidDataSource连接失败自动重试

    背景 最近在业务开发的时候 遇到了一个场景 需要遍历数据库连接信息创建数据库连接 而原来我配置的DruidDataSource在创建数据库连接失败后会自动重试 且是无限重试 而我期望的逻辑是 但创建数据库连接失败后 尝试几次依然失败就跳过该
  • Unity 基于群体寻路的解决方案

    群体寻路是一种模拟群体行为的技术 它使得游戏中的角色能够以一种有组织的方式移动 在群体中 每个角色都有自己的目标位置 并且会根据周围的情况决定如何移动 群体寻路可以帮助我们实现一些有趣的场景 比如鸟群飞行 鱼群游动等 对啦 这里有个游戏开发
  • c/c++编程学习:程序自删除

    程序自删除的方式有很多 不过最终的思想不过是关闭本身进程 开启新进程用于删除自身 下面这个方法是用windows自带命令行程序实现删除 命令行为 cmd exe c del filename 代码示例 C语言形式 include inclu
  • C# 重构之一(提取方法重构)

    提取方法重构 将现有的代码片段提取出来 构造成一个新的方法 优点 1 通过强调离散的可重用方法鼓励最佳的编码做法 2 鼓励通过较好的组织获得自记录代码 3 当使用描述性名称时 高级别方法可以像读取一系列注释一样进行读取 4 鼓励创建细化方法
  • 【华为OD机试】单向链表中间结点(python, java, c++, js)

    单向链表中间结点 前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email
  • Private无法直接调用,间接调用的方法

    1 未加修饰符默认情况下为private private情况下 没有办法被调用 但是可以使用间接调用的方式进行调用
  • python 画虚线_提取视频中的音频——python三行程序搞定!

    写在开头 身处数据爆炸增长的时代 各种各样的数据都飞速增长 视频数据也不例外 我们可以使用 python 来提取视频中的音频 而这仅仅需要安装一个体量很小的python包 然后执行三行程序 语音数据在数据分析领域极为重要 比如可以分析语义
  • java HttpClient 访问webservice并解析返回json数据

    关于webservice的普及就不多说了 直接进入主题吧 1 导包
  • Qt使用QAxObject写入Excel表格,包括填色、合并单元格、多行写入等

    Qt使用QAxObject写入Excel表格 包括填色 合并单元格 多行写入等 QAxObject可以调用Excel表中的各种函数或者事件 来操控读写Excel表格 Excel表中所有的接口可以查看官方文档 末尾可见源码 第一步 明确自己需