Qt:读取已有数据的Excel文档,并将数据显示在通过QTableWidget绘制的表格中,之后将显示的数据保存成excel格式进行输出(包括表头等内容)

2023-11-03

读取已有数据的Excel文档,并将数据显示在通过QTableWidget绘制的表格中,之后将显示的数据保存成excel格式进行输出(包括表头等内容)


  • UI展示及功能简介


  • 读取
//于Mainwindow中,on_read_clicked属于Pushbotton摁键的槽函数
void MainWindow::on_read_clicked()
{
    execel_read();//调用读取类方法,execel_read的具体内容见下文
}

 

选择【设置好内容的Excel文档】进行读取

结束后会显示读取完成。

上图为模板1.xlsx中的内容


  • 生成报表

//于Mainwindow中,on_pushButton_clicked属于Pushbotton摁键的槽函数

void MainWindow::on_pushButton_clicked()
{
    dom->datasend(exceldata);//在MainWindow中调用dialog的类方法datasend()
   //dom是属于dialog类的对象,需要在MainWindow中包含dialog头文件,之后定义指针对象dom,并分配空间
   //具体操作如下***处
    QMessageBox::warning(this,tr("生成波表情况:"),tr("报表已经生成!"),QMessageBox::Yes);
}
*********************************
//MainWindow中包含dialog的头文件

#include"dialog.h"

//MainWindow.h中声明属于dialog类的对象

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    ............
private slots:
    ............

private:
    ............
    Dialog *dom;//命名还是个大问题,保留dialog,不能在前后加数字
};
//MainWindow.cpp中分配dom指针对象空间
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    .............
    dom = new Dialog(this);
    .............
}
*********************************

 

点击后会显示报表已经生成。


  • 查看报表

void MainWindow::on_sheet_clicked()
//显示部分,关于TableWidget已经于生成报表部分绘制完成,如有需要,生成报表和查看报表可以统一为一个部分
{
    dom->exec();//保持窗口
}

 

将会显示生成报表的结果。


  • 保存

将生成的报表保存成Excel文档

保存会出现提示窗口,选择是否要打开。选择是

void MainWindow::on_pushButton_2_clicked()
{
    saveas();
}

 


以上情况不具有普世应用的意义,如何应用需要根据工程中的具体内容而定,因为程序内部未对从excel中读取到的数据进行处理,所以输出的报表中,数据和读取时选择的【模板1.xlsx】数据一样。

在实际工程中,会出现对大量excel数据进行读取(录入),并进行数据处理,之后输出显示成表格(如查看报表功能),必要的话,有可能需要将显示表格中的内容进行保存。

本文的内容主要是省去了数据处理的部分,概括性的对上述复杂问题进行一个精炼。


  • 程序介绍

读取excel

void MainWindow::execel_read()
{
            QString path = QFileDialog::getOpenFileName(this,"open",
                                                      "../","execl(*.xlsx)");
            //指定父对象(this),“open”具体操作,打开,“../”默认,之后可以添加要打开文件的格式
            if(path.isEmpty()==false)
            {
                //文件对象
                QFile file(path);
                //打开文件,默认为utf8变量,
                bool flag = file.open(QIODevice::ReadOnly);
                if(flag == true)//打开成功
                {
                    QAxObject *excel = new QAxObject(this);//建立excel操作对象
                    excel->setControl("Excel.Application");//连接Excel控件
                    excel->setProperty("Visible", false);//不显示窗体看效果
                    excel->setProperty("DisplayAlerts", false);//不显示警告看效果
                    /*********获取COM文件的一种方式************/
                    QAxObject *workbooks = excel->querySubObject("WorkBooks");
                    //获取工作簿(excel文件)集合
                    workbooks->dynamicCall("Open(const QString&)", path);//path至关重要,获取excel文件的路径
                    //打开一个excel文件
                    QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
                    QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);//访问excel中的工作表中第一个单元格
                    QAxObject *usedRange = worksheet->querySubObject("UsedRange");//sheet的范围
                    /*********获取COM文件的一种方式************/
                    //获取打开excel的起始行数和列数和总共的行数和列数
                    int intRowStart = usedRange->property("Row").toInt();//起始行数
                    int intColStart = usedRange->property("Column").toInt(); //起始列数
                    QAxObject *rows, *columns;
                    rows = usedRange->querySubObject("Rows");//行
                    columns = usedRange->querySubObject("Columns");//列
                    int intRow = rows->property("Count").toInt();//行数
                    int intCol = columns->property("Count").toInt();//列数
                    //起始行列号
                    qDebug()<<intRowStart;
                    qDebug()<<intColStart;
                    //行数和列数
                    qDebug()<<intRow;
                    qDebug()<<intCol;
                    int a,b;
                    a=intRow-intRowStart+1,b=intCol-intColStart+1;
                    QByteArray text[a][b];
                    int coerow=0,coecol=0;
                    for (int i = intRowStart; i < intRowStart + intRow; i++,coerow++)
                        {
                            coecol=0;//务必是要恢复初值的
                            for (int j = intColStart; j < intColStart + intCol; j++,coecol++)
                            {
                                cell = excel->querySubObject("Cells(Int, Int)", i, j );
                                QVariant cellValue = cell->dynamicCall("value");
                                text[coerow][coecol]=cellValue.toByteArray();//QVariant转换为QByteArray
                                exceldata[coerow][coecol]=QString(text[coerow][coecol]);//QByteArray转换为QString
                            }
                        }
                    workbook->dynamicCall( "Close(Boolean)", false );
                    excel->dynamicCall( "Quit(void)" );
                    delete excel;
                    QMessageBox::warning(this,tr("读取情况"),tr("读取完成!"),QMessageBox::Yes);
                }
                file.close();
            }


}

QTableWidget绘制表格

void Dialog::putoutsend()
{

    table->setRowCount(6);    //设置行数
    table->setColumnCount(4); //设置列数
    table->move(20,20);
    //QTableWidget *tableWidget = new QTableWidget(10,5); //这个可以代替上两行


    table->setWindowTitle("QTableWidget & Item");
    table->resize(550, 400);

    setFixedSize(580,500);//固定窗口的大小
    //设置表格的表头
    QStringList header;
    header<<"1"<<"2"<<"3"<<"4";
    table->setHorizontalHeaderLabels(header);//设置表头(横)

    QStringList header2;
    header2<<"abc"<<"jmc"<<"Month"<<"Description"<<"Month"<<"Description";
    table->setVerticalHeaderLabels(header2);//设置表头(竖)

    //设置行列的宽和高
    /*for(int i = 0;i<10;++i)
    {
        Table_one->setRowHeight(i,40);

    }
    for(int i = 0;i<4;++i)
    {
        Table_one->setColumnWidth(i,65);

    }*/

    //设置表格内容(横坐标,纵坐标,QTableWidgetItem("输入文本"))
    //如果有要输入的需要,就是把处理过后的数据输出到报表中,即可使用这个功能

    //显示阶段
    for(int i=0;i<6;i++)
    {
        for(int j=0;j<4;j++)
        {
           table->setItem(i,j,new QTableWidgetItem(exsheet[i][j]));//注意,exsheet为QString类型的数组,只有QString类型才能显示,如果是double等数值类型,请使用QString::number转换类型
           qDebug()<<exsheet[i][j];

        }
    }

    table->setEditTriggers(QAbstractItemView::NoEditTriggers);//只读模式
   
    //表列随着表格变化而自适应变化
    table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    //表行随着表格变化而自适应变化
    table->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    //将widget设置为窗口的中心控件
    //setCentralWidget(widget);


    //将读到的内容存在tableDate中
    arow=table->rowCount(),acol=table->columnCount();
    //QString tabeDate[table->rowCount()][table->columnCount()];//读取行数和列数
    for(int i=0; i<arow; i++)
    {
        for(int j=0; j<acol; j++)
        {
            senddata[i][j] = table->item(i, j)->text();//将数据读入一个全局变量中,方便之后进行保存操作
        }
    }
    table->show();
}

行列高宽的设置

自定义:

    for(int i = 0;i<10;++i)
    {
        Table_one->setRowHeight(i,40);

    }
    for(int i = 0;i<4;++i)
    {
        Table_one->setColumnWidth(i,65);

    }

其他类型:

    Table_one->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    Table_one->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);

其中的参数:ResizeMode mode的具体内容如下: 

从上到下分别为:手动调整,固定大小,根据内容分配(两种模式)。 

 

读取QTableWidget绘制的表格中的内容

void Dialog::savedata()
{
    QString filepath = QFileDialog::getSaveFileName(table, "保存",
    QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),
                        "Excel 文件(*.xls *.xlsx)");
    //返回应写入文件类型的目录,返回包含用户文档文件的目录
    if (filepath!="")
    {
        QAxObject *excel = new QAxObject(this);//建立excel操作对象
        if (excel->setControl("Excel.Application")) //连接Excel控件
        {
            excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体
            excel->setProperty("DisplayAlerts", false);
            //不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
            QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合
            workbooks->dynamicCall("Add");//新建一个工作簿
            QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿
            QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
            //访问excel中的工作表中第一个单元格


            //保存到execl,总的来说就是操作单元格,赋值的赋值,改格式大的改格式,遵循一点,修改颜色,行高,字体这些属性,务必是要设定一个修改范围再动手

            int i,j,colcount=table->columnCount(),rowcount=table->rowCount();//表格的列数
            QAxObject *cell,*col;
            //标题行
            cell=worksheet->querySubObject("Cells(int,int)", 1, 1);//操作单元格
            cell->dynamicCall("SetValue(const QString&)", "title");//设置标题内容,SetValue(const QString&),后面就是打印的文本内容
            cell->querySubObject("Font")->setProperty("Size", 18);
            //前半句是获取单元格字体,后半句是设置字体大小
            //cell->setProperty("Name", QStringLiteral("华文彩云"));//设置单元格字体

           // cell->setProperty("Italic", true);  //设置单元格字体斜体
            //cell->setProperty("Underline", 2);  //设置单元格下划线

            //获取这个范围内的单元格,直接调整行高
            worksheet->querySubObject("Range(const QString&)", "1:1")->setProperty("RowHeight", 60);
            //合并标题行
            QString cellTitle;

            cellTitle.append("A1:");//初始原点
            cellTitle.append(QChar(colcount  + 'A'));//终止列(一般都要总列数减去1,Qchar)

            cellTitle.append(QString::number(1));//终止行()Qstring

            //下述第一条,可以理解为对sellTitle这个范围的单元格进行操作
            QAxObject *range = worksheet->querySubObject("Range(const QString&)", cellTitle);
            range->setProperty("WrapText", true);//自动换行
            range->setProperty("MergeCells", true);//合并单元格
            //排版:居中
            //左对齐(xlLeft):-4131  居中(xlCenter):-4108  右对齐(xlRight):-4152
            range->setProperty("HorizontalAlignment", -4108);//xlCenter
            range->setProperty("VerticalAlignment", -4108);//xlCenter

            //行的表头
            for(i=0;i<colcount;i++)
            {
                //读取
                QString columnName;
              
                //修改内容
                cell=worksheet->querySubObject("Cells(int,int)", 2, i+2);//确定操作单元格,将数据保存到哪儿,行的表头,所以要从第二列开始

                columnName=table->horizontalHeaderItem(i)->text();//获取此处的文本内容,i是列号,就是第几列中的文本内容

                cell->dynamicCall("SetValue(const QString&)", columnName);//打印到excel

                //前半句是获取单元格字体,后半句是字体加粗
                cell->querySubObject("Font")->setProperty("Bold", true);

                cell->querySubObject("Interior")->setProperty("Color",QColor(191, 191, 191));
                cell->setProperty("HorizontalAlignment", -4108);//xlCenter
                cell->setProperty("VerticalAlignment", -4108);//xlCenter
            }
            //列的表头
            for(i=0;i<rowcount;i++)
            {
                //读取
                QString rowName;
               
                //修改内容
                cell=worksheet->querySubObject("Cells(int,int)", i+3, 1);//确定操作单元格,将数据保存到哪儿列的表头,需要从第三行开始,所以+3

                rowName=table->verticalHeaderItem(i)->text();
                        //horizontalHeaderItem(i)->text();//获取此处的文本内容,i是列号,就是第几列中的文本内容

                cell->dynamicCall("SetValue(const QString&)",rowName);//打印到excel

                //前半句是获取单元格字体,后半句是字体加粗
                cell->querySubObject("Font")->setProperty("Bold", true);

                cell->querySubObject("Interior")->setProperty("Color",QColor(191, 191, 191));
                cell->setProperty("HorizontalAlignment", -4108);//xlCenter
                cell->setProperty("VerticalAlignment", -4108);//xlCenter
            }


            //数据区
            for(i=0;i<table->rowCount();i++)
            {
                for (j=0;j<colcount;j++)
                {
                    QString rowdata[4];
                    rowdata[j]=table->item(i,j)->text();
                    worksheet->querySubObject("Cells(int,int)", i+3, j+2)->dynamicCall("SetValue(const QString&)",
                                                                                      rowdata[j]);
                }
            }
            //画框线
            QString lrange;
            lrange.append("A2:");//起始行列位置(原点),修改后,开始的位置会变化,A2的从A2那一行开始,A3就是第三行
            lrange.append(colcount + 'A');//终止列,-1,就是正常状态,改变colcount后面的

            lrange.append(QString::number(table->rowCount() +2));//终止行
            //这个起始的位置,相当于原点,最终给一个行列的终止位置就行

            range = worksheet->querySubObject("Range(const QString&)", lrange);
            //querySubObject("Borders")是对边框的设置,必须有
            range->querySubObject("Borders")->setProperty("LineStyle", QString::number(1));
            range->querySubObject("Borders")->setProperty("Color", QColor(0, 0, 0));//颜色的设置

            //调整数据区行高
            QString rowsName;
            rowsName.append("A2:");
            rowsName.append(colcount + 'A');

            //上面两句也可以变成
            //rowsName.append("2:");//起始列

            rowsName.append(QString::number(table->rowCount() + 2));//终止行

            range = worksheet->querySubObject("Range(const QString&)", rowsName);
            range->setProperty("RowHeight", 20);//设置行高
            range->setProperty("ColumnWidth", 60);  //设置单元格列宽

            workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));
            //保存至filepath
            //并将'/'分隔符转换为适合底层操作系统的分隔符。
            //在Windows上,toNativeSeparators(“c:/ winnt / system32”)返回“c:\ winnt \ system32”。
            //将filepath的路径

            workbook->dynamicCall("Close()");//关闭工作簿
            excel->dynamicCall("Quit()");//关闭excel
            delete excel;
            excel=NULL;
            if (QMessageBox::question(NULL,"完成","文件已经导出,是否现在打开?",QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
            {
                //QDesktopServices类提供了访问常见桌面服务的方法。
                //QDesktopServices::openUrl(const QUrl &url)
                //打开指定url中的文件
                //QDir目录结构及其内容的访问。
                QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(filepath)));
            }
        }
        else
        {
            QMessageBox::warning(NULL,"错误","未能创建 Excel 对象,请安装 Microsoft Excel。",QMessageBox::Apply);
        }
}

整体程序布局(仅供参考)

整个头文件及源文件分布如下

mainwindow.h包含以下头文件

#include <QMainWindow>
#include <QAxObject>//excel必须包含此头文件
#include<QString>

#include <QFileDialog>//文件操作必要

#include<QTableWidget>//绘制表格需要

#include"dialog.h"//dialog源文件的头文件

#include<QDebug>

dialog.h包含以下头文件

#include <QDialog>
#include<QHBoxLayout>
#include <QMainWindow>
#include<QTextEdit>
#include<QWidget>
#include<QTableWidget>
#include<QDebug>
#include<QString>
#include <QFileDialog>
#include<QAxObject>
#include<QMessageBox>
#include <QDesktopServices>

上述的读取Excel代码位于mainwindow.cpp中

其他功能的代码位于dialog.cpp中

所以在选择查看报表的时候,会另外弹出一个QDialog类型的窗口显示内容,也可将以上功能都放置于同一个cpp中。


补充:

如果现在TableWidget中删除某行,执行以下操作

   int rowIndex = table->currentRow();
   if(rowIndex == -1)
    {
        QMessageBox::warning(this,"Warning!","请选择一行再删除!",QMessageBox::Yes);

    }
    else if(rowIndex != -1)
    {
        table->removeRow(rowIndex);

    }

解释:需要写入保护程序,当TableWidget没有行被选中的时候,返回值是-1,所以当有返回值不是-1,也就是我们选中某一行的时候,再进行删除操作,否则在调用过程中,可能会有如下错误。

行数: -1
ASSERT failure in QList<T>::at: "index out of range", file F:\Qt\5.9.5\mingw53_32\include/QtCore/qlist.h, line 541
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
Error - 
RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly

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

Qt:读取已有数据的Excel文档,并将数据显示在通过QTableWidget绘制的表格中,之后将显示的数据保存成excel格式进行输出(包括表头等内容) 的相关文章

  • 如何使用VBA删除工作簿中的空白工作表?

    Sub delete Dim sh As Worksheet wb As String c As Range wb InputBox work book name Set sh Workbooks wb Sheets For Each Sh
  • 如何在自定义数据验证中使用用户定义的函数?

    In my Worksheet我有一个Table并想要定义Data validation对于包含日期的列 如下所示 S2M B2 lt gt Error 在上面 S2M 是一个用户定义的函数 用于将日期转换为Persian date to
  • 将单独的范围放入二维数组中

    我正在尝试获取大小的二维数组 x 3 填充 X只是工作表的大小 行数 并且有 3 列我感兴趣 例如 这些列彼此不靠近arr i 0 应从 AA 栏开始填写 arr i 1 应来自 K 列 并且arr i 2 需要来自 L 列 我尝试按以下方
  • Excel countif 单元格中的日期大于或等于另一个单元格中的日期

    这已经让我难受有一段时间了 我只需要计算一个单元格中的日期是否大于或等于另一个单元格中的日期 减去 x 天 例如 A1 2014 年 2 月 20 日 B1 2014年1月20日 COUNTIF B1 gt A1 30 30 就是负 30
  • MS Excel 对于每个循环:插入行

    我有一个包含 242 行的工作表 我想在每个现有行下面创建一个新行 相反 我的代码在第 1 行下方创建了 242 行 我花了整个下午的时间在 Google 和 Stack Overflow 上 尝试了各种想法 但遇到了同样的问题 这是我的代
  • Excel VBA 公式德语/法语/意大利语/俄语/荷兰语/外国函数

    当我将数据添加到工作簿时 需要将公式从较早的单元格复制到新单元格 我使用以下公式来计算我的增长率 WENN ODER K9 L9 WENNFEHLER L9 K9 K9 由于这非常耗时 我想用宏来改进它 因此编写了以下代码 Sub Grow
  • 强制 Excel 将多张纸作为单个作业打印

    在某些 Excel 2003 工作簿中 当我尝试print如果有多个工作表 Excel 将这些工作表视为单独的打印作业 这让我一直在编写的 Excel 自动化应用程序感到困惑 因为它会导致 Adob e PDF Printer 停止并询问用
  • UnicodeDecodeError:“utf-8”编解码器无法解码位置 14 中的字节 0xb9:起始字节无效

    我正在使用 Django REST 进行文件上传测试 Python3 6 2Django1 11djangorest框架 3 6 4Excel OSX 15 38 170902 操作系统 10 12 6 过去使用普通照片文件可以成功完成此操
  • VBA 用户表单:防止组合框在 KEYDOWN 时转义

    社区 有一种方法可以防止活动组合框在列表末尾 或开头 按下向下箭头 或向上箭头 时失去焦点 如果有更好的方法来做到这一点 最好使用 MS 标准属性 请分享 问题 当位于组合框中列表的末尾时 如果您点击向下箭头 它会将您移至活动组合框下方的任
  • 如何将 QByteArray 转换为十六进制字符串?

    我有打击QByteArray QByteArray ba ba 0 0x01 ba 1 0x10 ba 2 0x00 ba 3 0x07 我真的不知道如何将此 QByteArray 转换为结果字符串 其中包含 01100007 我将使用 Q
  • 包含另一个单元格值的条件格式文本的公式

    我有一个 A 列 每个单元格中包含 1 4 个单词的短语 我还有 4 个包含 1 个单词值的单元格 B1 C1 D1 和 E1 我需要设置条件格式 这样 1 如果 A 列单元格中的文本包含与上述单元格之一的值匹配的单词 则以红色突出显示该单
  • Excel VBA 循环遍历 10,000 组行,每组包含 20 行

    如何将当前按行循环的 Excel VBA 代码转换为循环 20 行集 据我了解 Step函数可能与以下行一起使用 Range V1 Value Application Index vInput1 r 0 但是 我不确定如何修改代码以循环遍历
  • 使用 Excel VBA 比较列并突出显示匹配数据

    我需要比较Column B in Sheet 2 with Column C in Sheet 3并突出显示具有匹配数据的单元格Column B Sheet 2 中使用了以下公式条件格式 哪个有效 NOT ISNA VLOOKUP Shee
  • 获取 QPushButton 在 2D 数组 QPushButton 上的索引

    我有一个二维数组QPushButton 当用户单击按钮时如何获取按钮的索引 例如当用户单击按钮时a 2 3 它会显示 2 3 该示例如下所示 Qt 4 5 使用对象名称 您可以为按钮指定唯一的对象名称 理想情况下 名称应该是有效的 C 标识
  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • 如何从浮点数组创建新的 QImage

    我有一个代表图像的浮点数数组 列在前 我想在 QGraphicsSecene 上将图像显示为 QPixmap 为了做到这一点 我尝试使用 QImage 构造函数 QImage const uchar data int width int h
  • Python仅读取Excel单元格中的公式

    我有一个 Excel 2010 文件 其中包含带有公式的单元格 请参阅下面公式栏中的 C2 下面截图1 我正在使用 python 读取值 它打印的是公式而不是单元格的实际值 下面的 eclipse 控制台的屏幕截图 我希望结果打印 10 1
  • 如何为 qmlRegisterSingletonType 实现单例提供程序?

    我想在 QML 中使用 C 类作为 Singleton 实例 并认为我必须使用 qmlRegisterSingletonType 注册它们 此函数需要一个提供已注册 C 类的实例的函数 我在 Windows 上使用最新的 Qt 5 3 1
  • 不使用 INDIRECT 的多张表中的 SUMIF

    这是我正在处理的简化 EXCEL 文件 数据表 1 称为first 数据表 2 称为second 数据结构和范围 C2 E8 是一样的 我需要根据 B 列 选项 中的标准对这些表进行求和 我期望的结果 选项1 和 sheet 选项2 和 s
  • 如果单元格以文本字符串开头...公式

    我有一个公式 用于检查单元格是否以文本 A 开头返回 拾取 B 代表收集 和 C 代表预付 但它似乎不能正常工作 A 和 C 均返回预付费 LOOKUP LEFT A1 A B C Pick Up Collect Prepaid 我不知道l

随机推荐

  • Go语言编程思想6——Channel

    Go语言编程思想6 Channel Channel goroutine和goroutine之间双向的通道 一 基本语法 创建int类型的channel c make chan int 发送数据 c lt 1 接受数据 n lt c func
  • OpenMV激光打靶

    题目要求识别形状并且键盘设置控制激光笔走A B C等轨道 OpenMV需要识别图形形状 激光笔位置 以及提高要求中的识别形状的面积等 这里介绍一下识别激光的方法 主要使用的是色块识别 但是激光点面积很小 而且在黑色区域容易被吞掉 因此对图像
  • 可自动读取水果成熟度的ai识别系统

    基于5G的水果成熟判断及采收系统 背景技术 随着物流和国际贸易经济的快速发展 国内外水果生产 储运和销售市场越来越大 目前 北果南运 南果北运以及外果内运已占物流运输的近半江山 目前 在水果采摘 储运和销售过程中常会出现一些问题 比如 为了
  • 推荐系统公平性论文阅读(五)

    这几天我的主要任务是对论文 Towards Long term Fairness in Recommendation 1 中所描述的算法进行编程实现 然后测试该算法的效果并记录 以下分模型算法细节实现 数据集 模型评估准则 测试结果记录四个
  • vue 自定义 el-cascader 展示文字及样式

    首先 自定义 popper class 因为设置的样式需要全局设置才生效 使用定义的类 可以避免影响到其他页面的效果
  • 第十七篇 PyTorch学习率调整策略

    文章目录 摘要 1 对不同层设置不同的学习率 应用举例 2 等间隔调整学习率 StepLR 应用举例 3 按需调整学习率 MultiStepLR 应用举例 4 指数衰减调整学习率 ExponentialLR 应用举例 5 余弦退火调整学习率
  • nvm安装node.js失败原因之一

    最近真的是频繁的换电脑 每次都要重新配置环境 然后同一个坑踩两次 哈哈哈 还是写一个记录一下吧 1 第一步是在给官网下载nvm安装包然后next一路安装 2 第二步使用nvm install 版本号 安装node js 然后就出现问题咯 然
  • M.2接口NVMe SSD固态硬盘安装win10

    M 2接口NVMe SSD固态硬盘使用了新接口 所以目前市面上的U盘win pe系统基本都不能识别硬盘 无法安装 但 win10原生系统默认能够识别NVMe固态盘的 所以 我们可以从微软官网https www microsoft com z
  • 大数据电商数据仓库系统搭建 附离线安装包

    一 数仓理论 1 数据仓库概念 数据仓库 Data Warehouse 是为企业所有决策制定过程 提供所有系统数据支持的战略集合 通过对数据仓库中数据的分析 可以帮助企业 改进业务流程 控制成本 提高产品质量等 数据仓库 并不是数据的最终目
  • 51单片机——LCD1602液晶显示屏

    如下图 红框就是LCD1602液晶显示屏 他是可插拔的 插上去后数码管就会乱码无效了 因为他两共用了MCU的8个P0口 LCD1602原理图 从上面两幅图可以看出来 LCD1602的LCD D0 LCD D7分别对应MCU的P00 P07
  • PhotoScan空三加密操作流程

    1 空三的原始数据 空三的原始数据主要由四个部分 原始影像 POS信息 像控点点位坐标 像控点现场照片 图片 2 加密流程 在PhotoScan中的加密流程主要是下面几个步骤 2 1导入照片及pos信息 在工作流程中添加照片 点击输入参照
  • windows 2012 证书服务

    文章目录 加密 数字签名 SSL 独立证书服务器 防火墙和路由 web服务器 web服务器使用证书服务 ssl加密 证书转换 openssl将私钥和crt证书合成pfx证书 iis配置ssl 步骤 加密 对称加密是使用的同一把密匙进行加密和
  • network和NetworkManager区别及ifconfig、ip、ethtool命令的使用介绍

    当你进入一个linux操作系统之后 你首先想了解恐怕就是这个环境的网络状态了 如果你使用的linux桌面GUI系统 你可以直接查看桌面上的网络图标 如果你使用的是服务器text文本模式登录 那恭喜你 下面的使用方式可以帮到你 openEul
  • Shell--基础--03--字符串

    Shell 基础 03 字符串 1 介绍 字符串是shell编程中最常用最有用的数据类型 除了数字和字符串 也没啥其它类型好用了 字符串可以用单引号 也可以用双引号 也可以不用引号 1 1 单引号 k5 333 aaa bbbb 单引号字符
  • Java中的基本数据类型byte、short、int和long

    一 byte byte的表示位数为 128 127 当我们byte num01 128时 数字超过的byte的表示范围 会报错 因为128默认为int型 所以我们要遵从 当表示范围大的数据类型转换成表示范围小的数据类型时 要强制转换 byt
  • 初识kafka --安装启动

    初识kafka kafka的安装及启动 kafka 1 官网下载 2 解压 3 安装jdk 4 配置kafka 4 1 配置server properties 4 2 配置zookeeper properties 5 启动kafka Kaf
  • QT for webassembly 技术探索

    前几日 接到上级任务 在不改动C 客户端的基础上 实现在浏览器中打开C 客户端 并进行交互 本想着是天方夜谭 谷歌一番 竟果真有此等尝试 官方参考文档传送门 https wiki qt io Qt for WebAssembly 在下查资料
  • Linux下ffmpeg无法内录声音解决方法

    此内容是转载非原创 感谢作者的付出 谢谢 参考下面这篇文章 http tieba baidu com p 4090696136 和这个链接 https trac ffmpeg org wiki Capture ALSA no1 这个问题基本
  • baxter机器人连接

    1 ctrl alt F3查看机器人的序列号以及IP地址 2 修改baxter sh 注意 baxter sh文件要放在工作空间根目录下 用网线将机器人和自己的电脑连接起来 注意 your ip要改成和baxter机器人ip同频段的但不同通
  • Qt:读取已有数据的Excel文档,并将数据显示在通过QTableWidget绘制的表格中,之后将显示的数据保存成excel格式进行输出(包括表头等内容)

    读取已有数据的Excel文档 并将数据显示在通过QTableWidget绘制的表格中 之后将显示的数据保存成excel格式进行输出 包括表头等内容 UI展示及功能简介 读取 于Mainwindow中 on read clicked属于Pus