qt对excel的基本操作

2023-11-14

qt对excel的基本操作

1.环境

1.1 配置方面

​ ① 确保Excel软件在本地服务器注册成功,没注册成功的可以通过 在运行中"E:\program Files\Microsoft Office\Office12\EXCEL.EXE" /regserver 手动注册,注意路径要用自己的excel路径。

​ ② 确保组件配制正确,运行命令:dcomcnfg,查看DCOM配置下是否有Microsoft Excel Application,有的话万事大吉,开始设置(1)常规,身份验证:无(2)安全、配制权限自定义,控制权限,完全控制选中,保存

2.指令

2.1 常用操作指令

连接Excel控件

QAxWidget excel(“Excel.Application”);

显示当前窗口:
excel.setProperty(“Visible”, true);

更改 Excel 标题栏:
excel.setProperty(“Caption”, “Invoke Microsoft Excel”);

不显示任何警告信息

setProperty(“DisplayAlerts”,0)

添加新工作簿:
QAxObject * workbooks = excel.querySubObject(“WorkBooks”);
workbooks->dynamicCall(“Add”);

打开已存在的工作簿:
workbooks->dynamicCall(“Open (const QString&)”, QString(“c:/test.xls”));

获取活动工作簿:
QAxObject * workbook = excel.querySubObject(“ActiveWorkBook”);

获取所有的工作表:
QAxObject * worksheets = workbook->querySubObject(“WorkSheets”);

获取工作表数量:
int intCount = worksheets->property(“Count”).toInt();

获取第一个工作表:
QAxObject * worksheet = workbook->querySubObject(“Worksheets(int)”, 1);

获取cell的值:
QAxObject * range = worksheet->querySubObject(“Cells(int,int)”, 1, 1 );

获取已使用区域

m_pworksheet->querySubObject(“UsedRange”)

获取行数

QAxObject *rows = usedrange->querySubObject(“Rows”);

int nRows = rows->property(“Count”).toInt();

获取列数

QAxObject *columns = usedrange->querySubObject(“Columns”);

int nCols = columns->property(“Count”).toInt();

2.2 设置单元格属性

QAxObject *pCell = work_sheet->querySubObject("Range(const QString&)", "A1:C1");
if (pCell)
{	    	        	
    //字体对齐(居中)
    pCell ->setProperty("HorizontalAlignment", -4108);//左对齐(xlLeft):-4131  居中(xlCenter):-4108  右对齐(xlRight):-4152
    pCell ->setProperty("VerticalAlignment", -4108); //上对齐(xlTop)-4160 居中(xlCenter):-4108  下对齐(xlBottom):-4107

    //设置字体
    QAxObject *font = pCell->querySubObject("Font");  //获取单元格字体
    font->setProperty("Bold", true);  //字体加粗
    font->setProperty("Name", QStringLiteral("华文彩云"));  //设置单元格字体
    font->setProperty("Bold", true);  //设置单元格字体加粗
    font->setProperty("Size", 20);  //设置单元格字体大小
    font->setProperty("Italic", true);  //设置单元格字体斜体
    font->setProperty("Underline", 2);  //设置单元格下划线
    font->setProperty("Color", QColor(255, 0, 0));  //设置单元格字体颜色(红色)

    //设置单元格背景色(灰色)
    QColor bkColor(125, 125, 125);
    QAxObject* interior = pCell->querySubObject("Interior");
    interior->setProperty("Color", bkColor);

    //绘制单元格边框(黑色)
    QAxObject* border = pCell->querySubObject("Borders");
    border->setProperty("Color", QColor(0, 0, 0)); 

    //创建组
    QAxObject* rows = pCell->querySubObject("Rows");
    rows->querySubObject("Group");
}

//宽度自适应
auto range = work_sheet->querySubObject("UsedRange");
QAxObject * cells = range->querySubObject("Columns");
if (cells)
{
    cells->dynamicCall("AutoFit");
}	


//设置单元格格式(文本)
QAxObject *oRange = work_sheet->querySubObject("Range(QString)", "A1:A99");
if (oRange)
{
    oRange->setProperty("NumberFormatLocal", "@");
}

oRange = work_sheet->querySBubObject("Range(QString)", "A1:B1");
if (oRange)
{
    pCell ->setProperty("WrapText", true); //内容过多,自动换行
    pCell ->setProperty("MergeCells", true); //合并单元格
    //pCell ->setProperty("MergeCells", false);  //拆分单元格
    //pcell->dynamicCall("ClearContents()");  //清空单元格内容
}


3.问题

3.1 Open失败

querySubObject(“Open(QString&)”,“path”)命令执行是出现如下异常信息

在这里插入图片描述

报错:800706BE 远程过程调用失败

描述:改报错在dynamicCall(“SetVisible(bool)”, true)时不会报错

去掉下面pdf的勾选
在这里插入图片描述

4.excel操作

4.1 初始化excel环境

连接COM组件,设置基本属性

int InitExcel()
{
#ifdef Q_OS_WIN

    CoInitialize(nullptr);
    m_pExcel = new QAxObject();

    bool b_ret = m_pExcel->setControl("Excel.Application");
    if (!b_ret)
    {
        b_ret = m_pExcel->setControl("ket.Application");
        if (!b_ret)
        {
            return -1;
        }
    }

    m_pExcel->dynamicCall("SetVisible(bool)", false);
    m_pExcel->setProperty("DisplayAlerts", false);
    m_pWorkBooks = m_pExcel->querySubObject("WorkBooks");
    if (!m_pWorkBooks)
    {
        CloseExcel();
        return -2;
    }
    return 0;
#else
    return -1;
#endif
}

4.2 打开Excel

int OpenExcel(const QString& path)
{
    int i_ret = 0;
#ifdef Q_OS_WIN
    i_ret = InitExcel();
    if (0 != i_ret)
    {
        return -1;
    }

    CloseWorkBook();

    QFile file(path);
    if (!file.exists())
    {
        CreateExcel(path);
    }
    else
    {
        m_pWorkBook = m_pWorkBooks->querySubObject("Open(QString&)", QDir::toNativeSeparators(path));
        if (!m_pWorkBook)
        {
            return -2;
        }
    }
    file.close();

    m_pWorkSheets = m_pWorkBook->querySubObject("Sheets");
    if (!m_pWorkSheets)
    {
        return -3;
    }

    m_pWorkSheet = m_pWorkSheets->querySubObject("Item(int)", 1);
    if (!m_pWorkSheet)
    {
        return -4;
    }

    m_sFileName = path;
    return 0;
#else
    return -1;
#endif
}

//关闭workbook
void CloseWorkBook()
{
#ifdef Q_OS_WIN
    if (m_pWorkBook)
    {
        QVariant ret = m_pWorkBook->dynamicCall("Close()");
    }
#endif
}

void CreateExcel(const QString &path)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkBooks);

    if (m_pWorkBooks)
    {
        m_pWorkBooks->dynamicCall("Add");
        m_pWorkBook = m_pExcel->querySubObject("ActiveWorkBook");
        SaveAsExcel(path);
    }
#endif
}

4.3 另存为

int SaveAsExcel(const QString& path)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkBook);
    try
    {
        if (m_pWorkBook)
        {
            QVariant ret = m_pWorkBook->dynamicCall("SaveAs(const QString &)", QDir::toNativeSeparators(path));
            if (ret.toBool())
            {
                return 0;
            }
        }
    }
    catch (...)
    {
        return -2;
    }
    return -1;
#else
    return -1;
#endif
}

4.4 关闭Excel

void CloseExcel()
{
    m_sFileName = "";

#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkBooks);
    Q_ASSERT(!m_pWorkBooks->isNull());

    if (m_pWorkBooks && !m_pWorkBooks->isNull())
    {
        QVariant ret = m_pWorkBooks->dynamicCall("Close()");
    }

    if (m_pExcel)
    {
        QVariant ret = m_pExcel->dynamicCall("Quit()");
    }
    
    RELEASE_POINTER(m_pWorkSheet);
    RELEASE_POINTER(m_pWorkSheets);
    RELEASE_POINTER(m_pWorkBook);
    RELEASE_POINTER(m_pWorkBooks);
    RELEASE_POINTER(m_pExcel);

    CoUninitialize();
#endif
}

4.5 宽度自适应

int ColumnAutoFit()
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheet);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (m_pWorkSheet && !m_pWorkSheet->isNull())
    {
        try
        {
            QAxObject *rang = m_pWorkSheet->querySubObject("UsedRange");
            QAxObject *columns = rang->querySubObject("Columns");
            if (columns)
            {
                QVariant var = columns->dynamicCall("AutoFit");
                RELEASE_POINTER(columns);
            }
            RELEASE_POINTER(rang);
        }
        catch (...)
        {
            return -2;
        }

        return 0;
    }
    return -1;
#else
    return -1;
#endif
}

4.6 获取工作表数量

int GetWorkSheetCount()
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheets);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (m_pWorkSheets && !m_pWorkSheet->isNull())
    {
        return m_pWorkSheets->property("Count").toInt();
    }
    return -1;
#else
    return -1;
#endif
}

4.7 读取所有数据

int ReadAll(QList<QList<QVariant>> &list)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheets);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (!m_pWorkSheet && m_pWorkSheet->isNull())
    {
        return -1;
    }

    list.clear();
    QAxObject* usedRange = m_pWorkSheet->querySubObject("UsedRange");
    //auto var = usedRange->dynamicCall("Value()");
    auto var = usedRange->property("Value2");
    auto rowList = var.toList();
    for (auto rowData : rowList)
    {
        auto subData = rowData.toList();
        QList<QVariant> subList;
        for (auto data : subData)
        {
            subList.push_back(data);
        }
        list.push_back(subList);
    }

    RELEASE_POINTER(usedRange);
    return 0;
#else
    return -1;
#endif
}

4.8 将List数据写入表格

int Write(const QList<QList<QVariant>> &data, bool overwrite)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheets);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (data.size() <= 0)
    {
        return -1;
    }

    if (!m_pWorkSheet && m_pWorkSheet->isNull())
    {
        return -2;
    }

    QVariantList variantList;
    for (size_t i = 0; i < data.size(); i++)
    {
        variantList.push_back(data.at(i));
    }

    QVariant variant = (QVariant)variantList;

    int i_row = data.size();
    int i_col = data.at(0).size();
    int i_row_start = 1;
    int i_row_count = 0;
    if (!overwrite)
    {
        i_row_count = GetRowCount();
        i_row_start = i_row_count + 1;
    }

    QString strRang;
    ConvertToColName(i_col, strRang);
    strRang += QString::number(i_row + i_row_count);
    strRang = QString("A%1:").arg(i_row_start) + strRang;

    try
    {
        QAxObject *range = m_pWorkSheet->querySubObject("Range(const QString&)", strRang);
        range->setProperty("Value2", variant);
        range->setProperty("WrapText", true); //内容过多自动换行
        range->setProperty("NumberFormatLocal", "@"); //设置单元格格式(文本)
        range->setProperty("HorizontalAlignment", -4108);//左对齐(xlLeft):-4131  居中(xlCenter):-4108  右对齐(xlRight):-4152
        range->setProperty("VerticalAlignment", -4108); //上对齐(xlTop)-4160 居中(xlCenter):-4108  下对齐(xlBottom):-4107

        QAxObject *border = range->querySubObject("Borders");
        border->setProperty("Color", QColor(0, 0, 0)); //设置边框颜色

        RELEASE_POINTER(border);
        RELEASE_POINTER(range);
    }
    catch (...)
    {
        return -3;
    }
    return 0;
#else
    return -1;
#endif
}

//
QString ConvertToLetters(int data)
{
    QChar ch = data + 0x40; //A对应0x41
    return QString(ch);
}

void ConvertToColName(int data, QString &res)
{
#ifdef Q_OS_WIN
    Q_ASSERT(data > 0 && data < 65535);
    int tempData = data / 26;
    if (tempData > 0)
    {
        int mode = data % 26;
        ConvertToColName(mode, res);
        ConvertToColName(tempData, res);
    }
    else
    {
        res = ConvertToLetters(data) + res;
    }
#endif
}

4.9 获取某个单元格的数据

int GetCellValue(const int row, const int column, QVariant &value)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheet);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (!m_pWorkSheet && !m_pWorkSheet->isNull())
    {
        return -1;
    }

    try
    {
        QAxObject *range = m_pWorkSheet->querySubObject("Cells(int,int)", row, column);
        auto var = range->property("Value2");
        value = var;
        RELEASE_POINTER(range);
    }
    catch (...)
    {
        return -2;
    }
    return 0;
#else
    return -1;
#endif
}

4.10 设置某个单元格的数据

int SetCellValue(const int row, const int column, const QVariant &value)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheet);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (!m_pWorkSheet && !m_pWorkSheet->isNull())
    {
        return -1;
    }

    try
    {
        QAxObject *range = m_pWorkSheet->querySubObject("Cells(int,int)", row, column);
        bool ret = range->setProperty("Value2", value);
        RELEASE_POINTER(range);
    }
    catch (...)
    {
        return -2;
    }
    return 0;
#else
    return -1;
#endif
}

4.11 设置当前操作worksheet序号


int SetWorkSheetNum(const int num)
{
#ifdef Q_OS_WIN

    Q_ASSERT(m_pWorkBook);
    Q_ASSERT(!m_pWorkBook->isNull());

    if (!m_pWorkBook && !m_pWorkBook->isNull())
    {
        return -1;
    }

    if (m_pWorkSheet)
    {    
        RELEASE_POINTER(m_pWorkSheet);
    }

    try
    {
        m_pWorkSheet = m_pWorkBook->querySubObject("Worksheets(int)", num);
    }
    catch (...)
    {
        return -2;
    }
    return 0;
#else
    return -1;
#endif
}

4.12 获取总列数

int GetColumnCount()
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheet);

    if (m_pWorkSheet && !m_pWorkSheet->isNull())
    {
        int nCols = 0;
        try
        {
            QAxObject *usedRange = m_pWorkSheet->querySubObject("UsedRange");
            QAxObject *columns = usedRange->querySubObject("Columns");

            nCols = columns->property("Count").toInt();
            RELEASE_POINTER(columns);
            RELEASE_POINTER(usedRange);
        }
        catch (...)
        {
            return -2;
        }
        return nCols;
    }
    return -1;
#else
    return -1;
#endif
}

4.13 获取总行数

int GetRowCount()
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheet);

    if (m_pWorkSheet)
    {
        int nRows = 0;
        try
        {
            QAxObject *usedRange = m_pWorkSheet->querySubObject("UsedRange");
            if (usedRange)
            {
                QAxObject *rows = usedRange->querySubObject("Rows");
                if (rows)
                {
                    nRows = rows->property("Count").toInt();
                    RELEASE_POINTER(rows);
                }      
                RELEASE_POINTER(usedRange);
            }

        }
        catch (...)
        {
            return -2;
        }
        return nRows;
    }
    return -1;
#else
    return -1;
#endif
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt对excel的基本操作 的相关文章

  • 如何搭建qtwayland?

    我花了一整天的时间尝试使用QtWayland Compositor 1 0在 Qt 创建者中 我已经遵循了从那里开始的所有步骤https wiki qt io QtWayland https wiki qt io QtWayland但我收到
  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 无法在 QGLWidget 中设置所需的 OpenGL 版本

    我正在尝试在 Qt 4 8 2 中使用 QGLWidget 我注意到 QGLWidget 创建的默认上下文不显示 OpenGL 3 1 以上的任何输出 Qt wiki 有一个教程 http qt project org wiki How t
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 在 Qt 5 中嵌入 Python

    我想将 Python 解释器嵌入到 Qt 5 应用程序中 我在 Qt 5 中有一个工作应用程序 但是当我把 include
  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • 我应该使用 QCoreApplication::processEvents() 还是 QApplication::processEvents()?

    我有一个从两者调用的方法QThreads和主线程 这个方法有时可能需要很长时间才能在循环中进行计算 所以我把QCoreApplication processEvents 这可以防止 GUI 冻结 在某个时刻我已经改变了QCoreApplic
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • Qt qDebug() 在 Windows shell 中不起作用

    我正在使用一个qDebug Qt 框架的printf屏幕上有东西 当我从 Qt Creator 运行应用程序时它工作得很好 但是当我尝试从 Windows 执行它时cmd它什么也没显示 为什么会发生这种情况 你必须添加 CONFIG con
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • 使用 OpenGL 渲染 QImage

    与我相关的其他问题 https stackoverflow com questions 20126354 render qimage from sooffscreenrenderer in qglwidget 我认为更核心的问题是 如何渲染
  • 如何在针对 Windows XP 的情况下使用 VS2012 构建 Qt 4/5?

    我正在尝试使用 Visual Studio 2012 构建 Qt 4 8 5 Qt 5 2 1 针对 Windows XP SDK v7 1a 使用 VS2102 编译时 源代码与 SDK v7 1a 存在各种不兼容性 因此无法开箱即用 这
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • 如何在 Qt 应用程序中嵌入 Python 解释器?

    有没有一种简单的方法可以将 Python 解释器嵌入到 Qt 应用程序中 如果可能的话 我希望有一个跨平台的解决方案 这就是目的PythonQt http pythonqt sourceforge net 它支持 Windows Linux
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor
  • 无法运行 Qt 应用程序:找不到版本“Qt_5”

    我运行 Ubuntu 16 04 LTS 我的问题是我无法运行可以编译的 Qt5 应用程序 这是我尝试运行它时得到的结果 home user Desktop sconfig dist Release GNU Linux SCongif us
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数

随机推荐

  • Kotlin:Android世界的Swift

    转载自 http www infoq com cn news 2015 06 Android JVM JetBrains Kotlin Kotlin 是一门与 Swift 类似的静态类型 JVM 语言 由 JetBrains 设计开发并开源
  • 2019年7月3日星期三 恒指/美原油/美黄金 走势分析

    财经早餐 2019年7月3日重点关注的财经数据与事件 09 45 中国6月财新服务业PMI 15 50 法国6月服务业PMI终值 15 55 德国6月服务业PMI终值 16 00 欧元区6月服务业PMI终值 16 30 英国6月服务业PMI
  • malloc和free,brk和sbrk和mmap和munmap的使用和关系以及内存分配的原理

    目录 一 使用 1 1 malloc和free 2 brk和sbrk 2 1 sbrk 2 2 brk 3 mmap munmap 二 关系 三 内存分配原理 四 malloc底层 一 使用 1 1 malloc和free 参数 申请内存大
  • Android进阶——AIDL详解

    看这篇之前先看看binder Android Binder机制 1 简介 AIDL Android 接口定义语言 可以使用它定义客户端与服务端进程间通信 IPC 的编程接口 在 Android 中 进程之间无法共享内存 用户空间 不同进程之
  • 【第13篇】Bert论文翻译

    文章目录 摘要 1 简介 2 相关工作 2 1 无监督的基于特征的方法 2 2 无监督微调方法 2 3 从监督数据中迁移学习 3 Bert 3 1 预训练BERT 3 2 微调BERT 4 实验 4 1 GLUE 4 2 SQuAD v1
  • 应该选择使用哪个版本的 JDK?

    要构建和运行 Java 应用程序 就需要安装 JDK 环境 OpenJDK 是 Java SE 规范的开源软件 但它只是源代码 二进制发行版由不同的供应商提供 适用于许多受支持的平台 这些发行版在许可证 商业支持 支持的平台和更新频率方面有
  • All in AI,现在开始算不算太晚?

    编者按 目前大模型近乎可以帮助人类处理方方面面的事情 如对话 写文章 写代码等等 在大模型 狂飙 趋势下 想要从事AI领域的小伙伴可能会犹疑 现在进入AI领域会不会已经太晚了 本文作者结合自身转型经历和对AI市场的研判 阐述了进入人工智能领
  • 软件设计能力提升之设计匠艺

    简介 课程将高效率的软件项目质量管理 UML 重构设计与功能实现 单元测试几个课程合而为一 我们称之为设计匠艺 这几个课程当然可以分开来讲 但是如果把他们组织在一起 将会形成一个有效的开发闭环 事实上 在实际的开发过程中 它们本身就是一个整
  • 荣耀play4tpro能升级鸿蒙系统吗,荣耀Play4T Pro的Magic UI系统有哪些优化和升级

    一个好的体验度离不开一个好的系统支持 那咱们的这个荣耀Play4T Pro手机所采用的系统有哪些提升和改变呢 其实这个手机还是搭载了了大家比较熟悉的Magic UI系统 凭借华为方舟编译器先进的技术 系统的应用执行效率提升29 系统操作流畅
  • token 应该存在 Cookie、SessionStorage 还是 LocalStorage 中?

    在Web开发中 token 令牌 可以存储在多个地方 包括cookie sessionStorage和localStorage 每种存储方式都有其优点和缺点 选择哪种方式取决于你的应用需求 1 Cookie 将token存储在cookie中
  • WSL和VM的不兼容问题

    目前的问题是鱼与熊掌不可兼得 所以每次只能用一个 假如要用wsl2 则执行 dism exe online enable feature featurename VirtualMachinePlatform all norestart ws
  • SQL 常用优化实践

    对查询进行优化 要尽量避免全表扫描 首先应考虑在 where 及 order by 涉及的列上建立索引 应尽量避免在 where 子句中对字段进行 null 值判断 否则将导致引擎放弃使用索引而进行全表扫描 如 select id from
  • 神位纷争服务器维护,神位纷争steam版3月12日版本更新公告

    Steam上的神位纷争即将迎来重大版本更新 以下更新也将在之后的移动端版本中体现 本次更新将在3月12日下午推送至Steam版本的 神位纷争 另外需要补充一句的是 神位纷争HD已可免费游玩了 欢迎各位玩家前往体验 系统 1 对战系统相关改动
  • 软件版本号的意思是什么?从PC到安卓,带你了解版本号命名逻辑

    猫三科技杂烩 18 12 2114 49 很多朋友在安装软件的时候都会注意到软件下方一行意义不明的版本号 有的软件会用x x x逻辑命名版本号 有的软件则是x x x x 而windows系统的版本号例如1803就更让人摸不到头脑了 那么这
  • Transformer——《Attention is all you need》

    本文是Google 机器翻译团队在2017 年发表 提出了一个新的简单的网络模型 Transformer 该模型基于纯注意力机制 Attention mechanisms 完全抛弃了RNN和CNN网络结构 在机器翻译任务上取得了很好的效果
  • 设计和开发如何获取真实的客户产品需求

    某富翁想要娶老婆 有三个人选 富翁给了三个女孩各一千元 请她们把房间装满 第一个女孩买了很多棉花 装满房间的1 2 第二个女孩买了很多气球 装满房间3 4 第三个女孩买了蜡烛 让光线充满房间 最终 富翁选了胸部最大的那个 这个故事告诉我们
  • 五种开源协议的具体区别

    1 BSD开源协议 original BSD license FreeBSD license Original BSD license 修改源码后可以选择闭源 修改后的文档不用进行版权说明 衍生软件的广告不能用你的名字促销 2 Apache
  • 爬虫Scrapy框架之学习使用(三):信号(Signals)

    Extension for collecting core stats like items scraped and start finish times import datetime from scrapy import signals
  • 【分布式-Redis应用】Spring中Redis使用项目实战(持续更新...)

    TOC 目录标题 场景及代码示例 1 list集合存储到Redis以及读取 import org springframework data redis core StringRedisTemplate Autowired private S
  • qt对excel的基本操作

    qt对excel的基本操作 1 环境 1 1 配置方面 确保Excel软件在本地服务器注册成功 没注册成功的可以通过 在运行中 E program Files Microsoft Office Office12 EXCEL EXE regs