Excel表格在日常工作中使会经常用的,有时候程序中需要生成测试报告就需要用到Excel,在此封装了一个类QExcel,方便后续使用。示例如下:

excel = new QExcel(); //新建对象excel->open("C:\\Users\\Administrator\\Desktop\\www.xls"); //打开一个Excel文件
for (int i=1; i<=10; i++)
{for (int j=1; j<=10; j++){excel->setCellString(i,j,QString::number(i+j));}
}
excel->setCellBackground(1,1,Qt::red);
excel->setCellBackground(2,2,Qt::green);
excel->setCellBackground(3,3,Qt::blue);
excel->setCellBackground(4,4,Qt::yellow);
excel->setCellBackground(5,5,Qt::gray);
excel->save(); //保存文件//=================================================================
注意:
1、打开文件和创建文件,二选一,即可使用所有提供的功能;
2、操作完成之后记得保存文件(调用save()函数)和退出Excel(调用quit()函数)
3、行、列都是从1开始,填0行0列,程序崩溃
//=================================================================excel->createFile("C:\\Users\\Administrator\\Desktop\\Test.xls"); //创建一个Excel文件
for (int i=1; i<=10; i++)
{for (int j=1; j<=10; j++){excel->setCellString(i,j,QString::number(i+j));}
}
excel->setCellBackground(1,1,Qt::red);
excel->setCellBackground(2,2,Qt::green);
excel->setCellBackground(3,3,Qt::blue);
excel->setCellBackground(4,4,Qt::yellow);
excel->setCellBackground(5,5,Qt::gray);
excel->save(); //保存文件excel->quit(); //退出Excel

需在.pro工程文件中添加axcontainer

QT       += axcontainer

头文件

#ifndef QEXCEL_H
#define QEXCEL_H#include <QString>
#include <QColor>
#include <QVariant>
#include <QAxObject>
#include <QFile>
#include <QStringList>
#include <QDebug>class QAxObject;class QExcel : public QObject
{public:QExcel(QObject *parent = nullptr);~QExcel();public:QAxObject * getWorkBooks();QAxObject * getWorkBook();QAxObject * getWorkSheets();QAxObject * getWorkSheet();public:/***************************************************************************//* 文件操作                                                                 *//**************************************************************************/void open(QString FileName);                   //打开文件void createFile(QString FileName);             //创建文件void save();                                   //保存Excel文件void quit();                                  //退出Excel/**************************************************************************//* 工作表操作                                                              *//*************************************************************************/void selectSheet(const QString& sheetName);   //根据名字选择工作表void selectSheet(int sheetIndex);             //根据下标索引选择工作表,下标从1开始void deleteSheet(const QString& sheetName);   //根据名字删除工作表void deleteSheet(int sheetIndex);             //根据下标索引删除工作表,下标从1开始void insertSheet(QString sheetName);          //新建工作表int getSheetsCount();                         //获取工作表数量QString getSheetName();                       //获取当前活跃工作表的名字QString getSheetName(int sheetIndex);         //根据下标索引获取工作表名字/***************************************************************************//* 单元格操作                                                               *//**************************************************************************/void mergeCells(int topLeftRow, int topLeftColumn, int bottomRightRow, int bottomRightColumn); //根据行列编号合并单元格void mergeCells(const QString& range);                         //根据字母编号合并单元格,例如(A5:C7)void setCellString(int row, int column, const QString& value); //根据行列编号设置单元格数据,例如(1,1,"xxx")void setCellString(const QString& cell, const QString& value); //根据字母编号设置单元格数据,例如("A5","xxx")bool setRowData(int row,int colum_start,int column_end,QVariant vData);  //批量写入一行数据QString getRange_fromColumn(int column);                                 //根据列值计算出字母值QVariant getCellValue(int row, int column);                    //根据行列编号获取单元格数值QVariant getCellValue(const QString& cell);                    //根据字母编号获取单元格数值void clearCell(int row, int column);                           //根据行列编号清空单元格void clearCell(const QString& cell);                           //根据字母编号清空单元格void setCellFontBold(int row, int column, bool isBold);        //根据行列编号设置单元格字体是否加粗void setCellFontBold(const QString& cell, bool isBold);        //根据字母编号设置单元格字体是否加粗void setCellFontSize(int row, int column, int size);           //根据行列编号设置单元格字体大小void setCellFontSize(const QString& cell, int size);           //根据字母编号设置单元格字体大小void setCellTextCenter(int row, int column);                   //根据行列编号设置单元格内容居中void setCellTextCenter(const QString& cell);                   //根据字母编号设置单元格内容居中void setCellTextWrap(int row, int column, bool isWrap);        //根据行列编号设置单元格内容是否换行void setCellTextWrap(const QString& cell, bool isWrap);        //根据字母编号设置单元格内容是否换行void setCellBackground(int row, int column, QColor color);     //根据行列编号设置单元格背景色void setCellBackground(const QString& cell, QColor color);     //根据字母编号设置单元格背景色void setCellFontColor(int row, int column, QColor color);      //根据行列编号设置单元格字体颜色void setCellFontColor(const QString& cell, QColor color);      //根据字母编号设置单元格字体颜色void setCellBorderColor(int row, int column, QColor color);    //根据行列编号设置单元格边框颜色void setCellBorderColor(const QString& cell, QColor color);    //根据字母编号设置单元格边框颜色void getUsedRange(int *topLeftRow, int *topLeftColumn, int *bottomRightRow, int *bottomRightColumn); //取得工作表已使用范围void setColumnWidth(int column, int width);                    //设置列宽void setRowHeight(int row, int height);                        //设置行高void setAutoFitRow(int row);                                   //设置自适应行高void mergeSerialSameCellsInAColumn(int column, int topRow);    //合并一列中相同连续的单元格int getUsedRowsCount();                                        //获取总行数int getUsedColumnCount();                                      //获取总列数private:QAxObject * excel;         //Excel指针QAxObject * workBooks;     //工作簿集合QAxObject * workBook;      //工作簿QAxObject * sheets;        //工作表集合QAxObject * sheet;         //工作表
};#endif

源文件

#include "qexcel.h"QExcel::QExcel(QObject *parent):QObject(parent)
{excel = nullptr;workBooks = nullptr;workBook = nullptr;sheets = nullptr;sheet = nullptr;
}QExcel::~QExcel()
{}/***************************************************************************/
/* 文件操作                                                                 */
/**************************************************************************/void QExcel::open(QString FileName)
{if(excel==nullptr){excel = new QAxObject();excel->setControl("Excel.Application");                            //连接Excel控件excel->setProperty("DisplayAlerts", false);                        //禁止显示警告workBooks = excel->querySubObject("Workbooks");                    //获取工作簿集合QFile file(FileName);if(file.exists()){workBooks->dynamicCall("Open(const QString&)", FileName);      //打开指定文件workBook = excel->querySubObject("ActiveWorkBook");            //获取活跃工作簿sheets = workBook->querySubObject("WorkSheets");               //获取工作表集合sheet = workBook->querySubObject("ActiveSheet");               //获取活跃工作表}}else{workBooks = excel->querySubObject("Workbooks");                    //获取工作簿集合QFile file(FileName);if(file.exists()){workBooks->dynamicCall("Open(const QString&)", FileName);      //打开指定文件workBook = excel->querySubObject("ActiveWorkBook");            //获取活跃工作簿sheets = workBook->querySubObject("WorkSheets");               //获取工作表集合sheet = workBook->querySubObject("ActiveSheet");               //获取活跃工作表}}
}void QExcel::createFile(QString FileName)
{if(excel==nullptr){excel = new QAxObject();excel->setControl("Excel.Application");                            //连接Excel控件excel->setProperty("DisplayAlerts", false);                        //禁止显示警告workBooks = excel->querySubObject("Workbooks");                    //获取工作簿集合QFile file(FileName);if(!file.exists()){workBooks->dynamicCall("Add");                                 //新建文件workBook=excel->querySubObject("ActiveWorkBook");              //获取活跃工作簿workBook->dynamicCall("SaveAs(const QString&)",FileName);      //按指定文件名保存文件sheets = workBook->querySubObject("WorkSheets");               //获取工作表集合sheet = workBook->querySubObject("ActiveSheet");               //获取活跃工作表}}else{workBooks = excel->querySubObject("Workbooks");                    //获取工作簿集合QFile file(FileName);if(!file.exists()){workBooks->dynamicCall("Add");                                 //新建文件workBook=excel->querySubObject("ActiveWorkBook");              //获取活跃工作簿workBook->dynamicCall("SaveAs(const QString&)",FileName);      //按指定文件名保存文件sheets = workBook->querySubObject("WorkSheets");               //获取工作表集合sheet = workBook->querySubObject("ActiveSheet");               //获取活跃工作表}}
}void QExcel::save() //保存Excel文件
{workBook->dynamicCall("Save()");qDebug()<<"文件已保存";
}void QExcel::quit() //退出Excel
{excel->dynamicCall("Quit()");delete sheet;delete sheets;delete workBook;delete workBooks;delete excel;excel = nullptr;workBooks = nullptr;workBook = nullptr;sheets = nullptr;sheet = nullptr;qDebug()<<"退出Excel";
}/**************************************************************************/
/* 工作表操作                                                              */
/*************************************************************************/void QExcel::selectSheet(const QString& sheetName) //根据名字选择工作表
{sheet = sheets->querySubObject("Item(const QString&)", sheetName);
}void QExcel::selectSheet(int sheetIndex) //根据下标索引选择工作表,下标从1开始
{sheet = sheets->querySubObject("Item(int)", sheetIndex);
}void QExcel::deleteSheet(const QString& sheetName) //根据名字删除工作表
{QAxObject * a = sheets->querySubObject("Item(const QString&)", sheetName);a->dynamicCall("delete");
}void QExcel::deleteSheet(int sheetIndex) //根据下标索引删除工作表,下标从1开始
{QAxObject * a = sheets->querySubObject("Item(int)", sheetIndex);a->dynamicCall("delete");
}void QExcel::insertSheet(QString sheetName) //新建工作表
{sheets->querySubObject("Add()");QAxObject * a = sheets->querySubObject("Item(int)", 1);a->setProperty("Name", sheetName);
}int QExcel::getSheetsCount() //获取工作表数量
{return sheets->property("Count").toInt();
}QString QExcel::getSheetName() //获取当前活跃工作表的名字
{return sheet->property("Name").toString();
}QString QExcel::getSheetName(int sheetIndex) //根据下标索引获取工作表名字
{QAxObject * a = sheets->querySubObject("Item(int)", sheetIndex);return a->property("Name").toString();
}/***************************************************************************/
/* 单元格操作                                                               */
/**************************************************************************/void QExcel::mergeCells(int topLeftRow, int topLeftColumn, int bottomRightRow, int bottomRightColumn) //根据行列编号合并单元格
{QString cell;cell.append(QChar(topLeftColumn - 1 + 'A'));cell.append(QString::number(topLeftRow));cell.append(":");cell.append(QChar(bottomRightColumn - 1 + 'A'));cell.append(QString::number(bottomRightRow));QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range->setProperty("VerticalAlignment", -4108);//xlCenterrange->setProperty("WrapText", true);range->setProperty("MergeCells", true);
}void QExcel::mergeCells(const QString& cell) //根据字母编号合并单元格
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range->setProperty("VerticalAlignment", -4108);//xlCenterrange->setProperty("WrapText", true);range->setProperty("MergeCells", true);
}void QExcel::setCellString(int row, int column, const QString& value) //根据行列编号设置单元格数据
{QAxObject *range = sheet->querySubObject("Cells(int,int)", row, column);range->dynamicCall("SetValue(const QString&)", value);
}void QExcel::setCellString(const QString& cell, const QString& value) //根据字母编号设置单元格数据
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range->dynamicCall("SetValue(const QString&)", value);
}bool QExcel::setRowData(int row,int colum_start,int column_end,QVariant vData) //批量写入一行数据
{bool op = false;QString start,end;start=getRange_fromColumn(colum_start);end=getRange_fromColumn(column_end);QVariant qstrRange = start+QString::number(row,10)+":"+end+QString::number(row,10);QAxObject *range = sheet->querySubObject("Range(const QString&)", qstrRange);if ( range ){range->dynamicCall("SetValue(const QVariant&)",QVariant(vData)); //修改单元格的数据op = true;}else{op = false;}delete range;return op;
}QString QExcel::getRange_fromColumn(int column) //根据列值计算出字母值
{if(column <= 0) //列值必须大于等于1return "";QString ABC="ABCDEFGHIJKLMNOPQRSTUVWXYZ";QString result="";QVector<int> pos;if(column>=1 && column<=26){result += ABC[column-1];return result;}else{int high = column;int low;int last_high;while(high>0){last_high=high;high = high / 26;low = last_high % 26;if(low==0 && high!=0){low=26;high=high-1;}pos.push_front(low);}for(int i=0; i<pos.size(); i++){result += ABC[pos[i]-1];}}return result;
}QVariant QExcel::getCellValue(int row, int column) //根据行列编号获取单元格数值
{QAxObject *range = sheet->querySubObject("Cells(int,int)", row, column);return range->property("Value2");
}QVariant QExcel::getCellValue(const QString& cell) //根据字母编号获取单元格数值
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);return range->property("Value2");
}void QExcel::clearCell(int row, int column) //根据行列编号清空单元格
{QString cell;cell.append(QChar(column - 1 + 'A'));cell.append(QString::number(row));QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range->dynamicCall("ClearContents()");
}void QExcel::clearCell(const QString& cell) //根据字母编号清空单元格
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range->dynamicCall("ClearContents()");
}void QExcel::setCellFontBold(int row, int column, bool isBold) //根据行列编号设置单元格字体是否加粗
{QString cell;cell.append(QChar(column - 1 + 'A'));cell.append(QString::number(row));QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range = range->querySubObject("Font");range->setProperty("Bold", isBold);
}void QExcel::setCellFontBold(const QString &cell, bool isBold) //根据字母编号设置单元格字体是否加粗
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range = range->querySubObject("Font");range->setProperty("Bold", isBold);
}void QExcel::setCellFontSize(int row, int column, int size) //根据行列编号设置单元格字体大小
{QString cell;cell.append(QChar(column - 1 + 'A'));cell.append(QString::number(row));QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range = range->querySubObject("Font");range->setProperty("Size", size);
}void QExcel::setCellFontSize(const QString &cell, int size) //根据字母编号设置单元格字体大小
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range = range->querySubObject("Font");range->setProperty("Size", size);
}void QExcel::setCellTextCenter(int row, int column) //根据行列编号设置单元格内容居中
{QString cell;cell.append(QChar(column - 1 + 'A'));cell.append(QString::number(row));QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range->setProperty("HorizontalAlignment", -4108);//xlCenter
}void QExcel::setCellTextCenter(const QString &cell) //根据字母编号设置单元格内容居中
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range->setProperty("HorizontalAlignment", -4108);//xlCenter
}void QExcel::setCellTextWrap(int row, int column, bool isWrap) //根据行列编号设置单元格内容是否换行
{QString cell;cell.append(QChar(column - 1 + 'A'));cell.append(QString::number(row));QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range->setProperty("WrapText", isWrap);
}void QExcel::setCellTextWrap(const QString &cell, bool isWrap) //根据字母编号设置单元格内容是否换行
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);range->setProperty("WrapText", isWrap);
}void QExcel::setCellBackground(int row, int column, QColor color) //根据行列编号设置单元格背景颜色
{QAxObject *range = sheet->querySubObject("Cells(int,int)", row, column);QAxObject *interior =range->querySubObject("Interior");interior->setProperty("Color", color);
}void QExcel::setCellBackground(const QString& cell, QColor color) //根据字母编号设置单元格背景颜色
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);QAxObject *interior =range->querySubObject("Interior");interior->setProperty("Color", color);
}void QExcel::setCellFontColor(int row, int column, QColor color) //根据行列编号设置单元格字体颜色
{QAxObject *range = sheet->querySubObject("Cells(int,int)", row, column);QAxObject *font  =range->querySubObject("Font");font->setProperty("Color", color);
}void QExcel::setCellFontColor(const QString& cell, QColor color) //根据字母编号设置单元格字体颜色
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);QAxObject *font  =range->querySubObject("Font");font->setProperty("Color", color);
}void QExcel::setCellBorderColor(int row, int column, QColor color) //根据行列编号设置单元格边框颜色
{QAxObject *range = sheet->querySubObject("Cells(int,int)", row, column);QAxObject* border = range->querySubObject("Borders");border->setProperty("Color", color);
}void QExcel::setCellBorderColor(const QString& cell, QColor color) //根据字母编号设置单元格边框颜色
{QAxObject *range = sheet->querySubObject("Range(const QString&)", cell);QAxObject* border = range->querySubObject("Borders");border->setProperty("Color", color);
}void QExcel::getUsedRange(int *topLeftRow, int *topLeftColumn, int *bottomRightRow, int *bottomRightColumn) //取得工作表已使用范围
{QAxObject *usedRange = sheet->querySubObject("UsedRange");*topLeftRow = usedRange->property("Row").toInt();*topLeftColumn = usedRange->property("Column").toInt();QAxObject *rows = usedRange->querySubObject("Rows");*bottomRightRow = *topLeftRow + rows->property("Count").toInt() - 1;QAxObject *columns = usedRange->querySubObject("Columns");*bottomRightColumn = *topLeftColumn + columns->property("Count").toInt() - 1;
}void QExcel::setColumnWidth(int column, int width) //设置列宽
{QString columnName;columnName.append(QChar(column - 1 + 'A'));columnName.append(":");columnName.append(QChar(column - 1 + 'A'));QAxObject * col = sheet->querySubObject("Columns(const QString&)", columnName);col->setProperty("ColumnWidth", width);
}void QExcel::setRowHeight(int row, int height) //设置行高
{QString rowsName;rowsName.append(QString::number(row));rowsName.append(":");rowsName.append(QString::number(row));QAxObject * r = sheet->querySubObject("Rows(const QString &)", rowsName);r->setProperty("RowHeight", height);
}void QExcel::setAutoFitRow(int row) //设置自适应行高
{QString rowsName;rowsName.append(QString::number(row));rowsName.append(":");rowsName.append(QString::number(row));QAxObject * rows = sheet->querySubObject("Rows(const QString &)", rowsName);rows->dynamicCall("AutoFit()");
}void QExcel::mergeSerialSameCellsInAColumn(int column, int topRow) //合并一列中相同连续的单元格
{int a,b,c,rowsCount;getUsedRange(&a, &b, &rowsCount, &c);int aMergeStart = topRow, aMergeEnd = topRow + 1;QString value;while(aMergeEnd <= rowsCount){value = getCellValue(aMergeStart, column).toString();while(value == getCellValue(aMergeEnd, column).toString()){clearCell(aMergeEnd, column);aMergeEnd++;}aMergeEnd--;mergeCells(aMergeStart, column, aMergeEnd, column);aMergeStart = aMergeEnd + 1;aMergeEnd = aMergeStart + 1;}
}int QExcel::getUsedRowsCount() //获取总行数
{QAxObject *usedRange = sheet->querySubObject("UsedRange");int topRow = usedRange->property("Row").toInt();QAxObject *rows = usedRange->querySubObject("Rows");int bottomRow = topRow + rows->property("Count").toInt() - 1;return bottomRow;
}int QExcel::getUsedColumnCount() //获取总列数
{QAxObject *usedRange = sheet->querySubObject("UsedRange");int leftColumn = usedRange->property("Column").toInt();QAxObject *columns = usedRange->querySubObject("Columns");int rightColumn = leftColumn + columns->property("Count").toInt() - 1;return rightColumn;
}QAxObject *QExcel::getWorkBooks()
{return workBooks;
}QAxObject *QExcel::getWorkBook()
{return workBook;
}QAxObject *QExcel::getWorkSheets()
{return sheets;
}QAxObject *QExcel::getWorkSheet()
{return sheet;
}

Qt--玩转Excel相关推荐

  1. python填写excel-Python玩转Excel的读写改实例

    摘要: 利用xlrd读取excel 利用xlwt写excel 利用xlutils修改excel 利用xlrd读取excel 先需要在命令行中pip install xlrd:读取xls文件的流程为: ...

  2. Qt中打开excel文件

    qt中打开excel文件有两种方法 第一种,用QAxObject,在使用QAxObject,要在.pro文件中添加QT += axcontainer,同时在调用文件中添加#include <QA ...

  3. oracle行列转换关联union的方式_几行代码轻松玩转 Excel 行列转换

    几行代码轻松玩转 Excel 行列转换 下面这种交叉式的 Excel 表是很常见的格式,用来填写和查看都比较方便: 但是,如果想做进一步的统计分析,这种格式就不方便了,需要行列转换,变成如下格式的明细 ...

  4. 来吧!带你玩转 Excel VBA

    来吧!带你玩转 Excel VBA(含CD光盘1张)(双色)(附带近500个VBA思考练习题,Exceltip.net出品) 罗刚君  杨嘉恺编著 ISBN 978-7-121-20627-6 201 ...

  5. 来吧 带你玩转 Excel VBA

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 来吧!带 ...

  6. Qt QAxObject操作excel文件过程总结

    最近由于需要Qt来操作Excel文件,所以想把QAxObject用起来,此次使用也是机缘巧合,记录了一下心路历程. 此前走了很多弯路,希望做同样事情的人就别纠缠于同样的错误就好. 配制方面: 1.确保 ...

  7. 计算机一级电子表格地区排名,玩转Excel电子表格排序方法大汇总

    玩转Excel电子表格排序方法大汇总 分类:计算机等级 | 更新时间:2016-07-08| 来源:转载 排序是数据处理中的经常性工作,Excel排序有序数计算(类似成绩统计中的名次)和数据重排两类. ...

  8. Python玩转Excel:统计函数

    一.统计函数初探 这是一个学生三次考试成绩登记表,现实现目标就是求出总成绩和平均成绩,如果大家有其他需求的话,可以参考. import pandas as pd datas = pd.read_exc ...

  9. 教你玩转excel教程-刘青-专题视频课程

    教你玩转excel教程-19637人已学习 课程介绍         教你玩转excel教程 课程收益     学习excel 讲师介绍     刘青 更多讲师课程     中传计算机老师 长期讲授p ...

  10. Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格

    目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...

最新文章

  1. RotateWorldTest对层动作
  2. Lucene搜索引擎例子demo
  3. 《复盘+》把经验转化为能力
  4. vb Select Case的使用 字符串整形的转换 输入错误str的直接输出
  5. KMS安装后激活机器
  6. java中的常用日期类_Java中的常用日期类说明
  7. javascript小游戏_个人网站集成js小游戏《圈小猫》教程及源码
  8. mysql联合索引数据库查询数据会变慢_如何定位并优化慢查询SQL以及联合索引和索引多的弊端...
  9. 记录一次网盘资源不给提取码的经历!另类编程思维,Python破之!
  10. 实现Fragment在ViewPager中滑动
  11. 【读书笔记】金字塔原理-呈现金字塔
  12. 用线性代数解释图论中的一些结论
  13. the little schemer 学习
  14. 智能无线网络的深度学习:一项综合调查
  15. python函数快查快用
  16. java 基础知识(不定期更新)
  17. 主流图数据库对比,Neo4j、ArangoDB、OrientDB、JanusGraph、HugeGraph
  18. 第三章第三节、他是一个箍桶匠
  19. 强大的Java前台后台开发工具
  20. 快手直播前期怎么引流?快手新人主播怎么做涨粉

热门文章

  1. 【VUE】前端传入id却显示id对应的名称
  2. python编写一个简单的程序验证码_用python写一个简单的验证码
  3. 前端开发流程中一定要注意的5个点
  4. “TCP连接”究竟是什么意思?
  5. 微信小程序之支付密码输入demo
  6. linux 服务配置 ppt,Linux_Web服务器的配置.ppt
  7. shell脚本编程 学习笔记
  8. Dede Cms系统提示方式修改以及ShowMsg函数说明
  9. python3 str或bytes转换函数
  10. 买米——完全背包问题