Qt5下Qxlsx模块安装及使用

Qt5下Qxlsx模块安装及使用

  • 一、Qt5下Qxlsx模块安装及使用
  • 1. 未安装Qxlsx的程序效果
  • 2. 安装Perl(编译Qxlsx源码用)
    • 2.1 下载 ActivePerl 5.28
    • 2.2 安装 ActivePerl 5.28
  • 3. 下载并编译Qxlsx源码
    • 3.1 下载Qxlsx源码
    • 3.2 编译Qxlsx源码
  • 4. 将编译好的文件复制到Qt路径下
    • 4.1 bin 路径文件复制
    • 4.2 include 路径文件复制
    • 4.3 lib 路径文件复制
    • 4.4 mkspecs 路径文件复制
    • 4.5 大功告成!!
  • 5. 使用Qxlsx模块
    • 5.1 安装 xlsx 模块后的效果演示
    • 5.2 使用xlsx加载模板并生成Excel文件
    • 5.3 Qt xlsx官方教程
  • 6. 教程相关文件下载:
  • 二、QT-使用QtXlsx开源库进行excel表格操作(高效稳定)
    • 1、效果预览查看
    • 2、创建线程,执行写
    • 3、 将数据写入EXCEL文件
    • 4、 程序关键代码源文件
  • 三、Qt Xlsx使用教程、Qt操作Excel、Qt生成Excel图表、跨平台不依赖Office(推荐用法:直接使用源代码)
    • 3.1 新建工程(推荐用法:直接使用源代码)
    • 3.2 工程目录下添加源代码(推荐用法:直接使用源代码)
    • 3.3 在工程中引入xlsx源代码(推荐用法:直接使用源代码)
    • 3.4 修改main.cpp内容,测试(推荐用法:直接使用源代码)
    • 3.5 查看效果(推荐用法:直接使用源代码)
    • 4. 官方examples例子
      • 4.1 calendar Qt操作Excel生成日历
      • 4.2 chart Qt操作Excel生成图表

原文链接: https://blog.csdn.net/qq_34578785/article/details/106916808?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168248777816800188589212%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168248777816800188589212&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-106916808-null-null.142v86insert_down28,239v2insert_chatgpt&utm_term=qxlsx&spm=1018.2226.3001.4187

本篇文章讲述了如何在windows环境下为Qt5安装Qxlsx模块,以及Qxlsx模块的简单使用。

Perl+QtXlsx下载:https://download.csdn.net/download/u014779536/12543960

示例工程下载:https://download.csdn.net/download/u014779536/12543987

一、Qt5下Qxlsx模块安装及使用

1. 未安装Qxlsx的程序效果

新建一个程序,在pro文件中加入:

QT  += xlsx

在界面中添加一个按钮,设置以下槽函数:

/*
 * @brief 点击自动生成按钮
 */
void Widget::on_Btn_clicked()
{
    //![0]
    QXlsx::Document xlsx("EXCEL模板.xlsx");
    //![0]

在未安装Qxlsx模块的情况下程序会报错:
在这里插入图片描述
现在我们开始安装Qxlsx模块!

2. 安装Perl(编译Qxlsx源码用)

编译Qxlsx源码需要用到Perl5,所以先安装perl5.

2.1 下载 ActivePerl 5.28

perl5地址:https://www.perl.org/get.html

打开上面的网址,选择 ActiveState Prel
在这里插入图片描述
选择 5.28版本(点击后需要登录github,自行登录)
在这里插入图片描述
选择 Download Builds下载 exe 格式安装文件
在这里插入图片描述
下载完成:
在这里插入图片描述

2.2 安装 ActivePerl 5.28

双击安装包:
在这里插入图片描述
接受条款:
在这里插入图片描述
选择典型安装:
在这里插入图片描述
勾选以下选项:
在这里插入图片描述
开始安装:
在这里插入图片描述
等待安装完成:
在这里插入图片描述
安装完成,重启,重启,马上重启电脑:
在这里插入图片描述

3. 下载并编译Qxlsx源码

3.1 下载Qxlsx源码

下载地址:https://github.com/dbzhang800/QtXlsxWriter

选择下载zip压缩包到本地:
在这里插入图片描述
下载完成,解压:
在这里插入图片描述

3.2 编译Qxlsx源码

使用QT5打开 qtxlsx.pro
在这里插入图片描述
选择编译器
在这里插入图片描述
选择编译方式:
在这里插入图片描述
点击“ctrl+B”构建项目,注意是 构建!构建!构建! 不要“ctrl+R”运行
在这里插入图片描述
构建完成,有报错,但是不用管:
在这里插入图片描述
在这里插入图片描述
文件夹预览:
在这里插入图片描述

4. 将编译好的文件复制到Qt路径下

找到Qt安装路径:
在这里插入图片描述

4.1 bin 路径文件复制

在这里插入图片描述

4.2 include 路径文件复制

在这里插入图片描述

4.3 lib 路径文件复制

在这里插入图片描述

4.4 mkspecs 路径文件复制

复制构建目录下的 mkspecs\modules\qt_lib_xlsx.pri 到 msvc2017_64\mkspecs\modules 下:
在这里插入图片描述

4.5 大功告成!!

开心一下啊~可以使用了

5. 使用Qxlsx模块

5.1 安装 xlsx 模块后的效果演示

我们再来看一下效果,安装xlsx模块前:
在这里插入图片描述
安装xlsx模块后:
在这里插入图片描述

5.2 使用xlsx加载模板并生成Excel文件

模板文件:
在这里插入图片描述
程序界面:
在这里插入图片描述
关键代码:

/*
 * @brief 点击自动生成按钮
 */
void Widget::on_Btn_StartGenerate_clicked()
{
    //![0]
    QXlsx::Document xlsx("EXCEL模板.xlsx");
    //![0]

成功生成:
在这里插入图片描述
预览:
在这里插入图片描述

5.3 Qt xlsx官方教程

教程地址:http://qtxlsx.debao.me/
在这里插入图片描述
在这里插入图片描述

6. 教程相关文件下载:

Perl+QtXlsx下载:https://download.csdn.net/download/u014779536/12543960

示例工程下载:https://download.csdn.net/download/u014779536/12543987
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、QT-使用QtXlsx开源库进行excel表格操作(高效稳定)

原文链接:https://blog.csdn.net/u013083044/article/details/113407235?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-113407235-blog-106916808.235%5Ev32%5Epc_relevant_default_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-113407235-blog-106916808.235%5Ev32%5Epc_relevant_default_base3&utm_relevant_index=13

1、效果预览查看

在这里插入图片描述

2、创建线程,执行写

创建线程的目的就是为了让excel表写的动作放到后台去执行,这样的好处就是主线程只是专门负责数据的追加,不会造成主线程添加excel表数据写入的时候主线程的卡顿。

// 后台线程执行写入
void cReportThread::run()
{
	while (true)
	{
		QThread::msleep(100);

		if (m_ptr->bAppExit)
			return;

		QVariant varDev;
		if (operatorDevReport(2, varDev))
			cExcelWriter::getInstance().writeDevRunState(varDev);  // 后台执行数据写入动作
			
	}
}


// 将对象添加到链表,然后后台线程执行对象写到文档
void cReportThread::addDevReport(QVariant &var)
{
	if (var.isNull() || !var.isValid())
		return;

	operatorDevReport(1, var);
}

// 操作方法
bool cReportThread::operatorDevReport(int nType, QVariant &var)
{
	bool bRet = true;
	static QList<QVariant> varList;
	static QMutex mutex;

	mutex.lock();
	switch (nType)
	{
	case 1:  // 添加到数据链表
	{
		if (var.isNull() || !var.isValid())
			bRet = false;
		else
			varList.push_back(var);
	}break;

	case 2:  // 从数据链表获取元素,并剔除元素
	{
		if (0 == varList.size())
			bRet = false;
		else
			var = varList.takeFirst();
	}break;
	default:
		break;
	}
	mutex.unlock();

	return bRet;
} 

3、 将数据写入EXCEL文件

定义sDevReport对象,通过该对象结构进行测试数据赋值,通过获取到的数据来执行excel数据表的写入。

struct sDevReport
{
	QString strDevState = "";
	QString strBeginWork = "";
	QString strEndWork = "";
	QString strRemarks = "";
};
Q_DECLARE_METATYPE(sDevReport)

添加测试数据,写入excel表里面。

	// test data
	cWorkReport ExcelReport;
	for (int i = 0; i < 20; i++)
	{
		sDevReport dev;
		dev.strBeginWork = QString("begin-%1").arg(i);
		dev.strDevState = QString("state-%1").arg(i);
		dev.strEndWork = QString("end-%1").arg(i);
		dev.strRemarks = QString("remaks-%1").arg(i);
		ExcelReport.addDevReport(QVariant::fromValue(dev));
	}

这里是对sDevReport数据对象写入excel表的具体实现方式。

int cExcelWriter::writeDevRunState(QVariant var)
{
	sDevReport report = var.value<sDevReport>();
	QString strReportFile = QApplication::applicationDirPath() + DIR_WORK_REPORT + DIR_DEV_REPORT + "/Dev-" + m_strToday + ".xlsx";

	int nRowHeight = 15;
	int nColWidth = 25;
	if (!QFile::exists(strReportFile))
	{
		// 写入excel表头
		QStringList strTableNameList;
		strTableNameList << QString::fromLocal8Bit("状态(State)")
			<< QString::fromLocal8Bit("开始时间(Begin Work)")
			<< QString::fromLocal8Bit("结束时间(End Work)")
			<< QString::fromLocal8Bit("耗时/秒(Use Time)")
			<< QString::fromLocal8Bit("备注(Remarks)");

		QXlsx::Document xlsx(strReportFile);
		QXlsx::Format format;
		format.setFontBold(true);
		format.setPatternBackgroundColor(QColor(RGB_TABLE));   // 设置列背景颜色
		format.setFontSize(10);
		format.setHorizontalAlignment(QXlsx::Format::AlignHCenter);

		for (int i = 0; i < strTableNameList.size(); i++)
		{
			xlsx.setColumnWidth(i + 1, nColWidth);
			xlsx.setRowHeight(1, nRowHeight);
			xlsx.write(1, i + 1, strTableNameList.at(i), format);
		}

		xlsx.saveAs(strReportFile);
	}


	QXlsx::Document xlsx(strReportFile);
	int nRows = xlsx.dimension().rowCount() + 1;
	QXlsx::Format format;
	format.setHorizontalAlignment(QXlsx::Format::AlignLeft);

	// 设置行高
	xlsx.setRowHeight(nRows, nRowHeight);
	xlsx.write(nRows, 1, report.strDevState, format);
	xlsx.write(nRows, 2, report.strBeginWork, format);
	xlsx.write(nRows, 3, report.strEndWork, format);
	xlsx.write(nRows, 4, "", format);
	xlsx.write(nRows, 5, report.strRemarks, format);
	xlsx.saveAs(strReportFile);

	return 0;
}

4、 程序关键代码源文件

全部代码下载链接: https://download.csdn.net/download/u013083044/14993348

#include "ReportThread.h"
#include "QMutex"
#include <QVariant>
#include "ExcelWriter.h"
#include "ExcelStruct.h"

struct sReportThread
{
	bool bAppExit = false;
};

cReportThread::cReportThread(QObject *parent)
	: QThread(parent)
{
	m_ptr = new sReportThread;

	this->start();
}

cReportThread::~cReportThread()
{
	if (m_ptr != nullptr)
	{
		m_ptr->bAppExit = true;
		this->wait(1000);
		delete m_ptr;
	}
}

cReportThread& cReportThread::getInstance()
{
	static cReportThread instance;
	return instance;
}

// 后台线程执行写入
void cReportThread::run()
{
	while (true)
	{
		QThread::msleep(100);

		if (m_ptr->bAppExit)
			return;

		QVariant varDev;
		if (operatorDevReport(2, varDev))
			cExcelWriter::getInstance().writeDevRunState(varDev);
			
	}
}


// 将对象添加到链表,然后后台线程执行对象写到文档
void cReportThread::addDevReport(QVariant &var)
{
	if (var.isNull() || !var.isValid())
		return;

	operatorDevReport(1, var);
}

// 操作方法
bool cReportThread::operatorDevReport(int nType, QVariant &var)
{
	bool bRet = true;
	static QList<QVariant> varList;
	static QMutex mutex;

	mutex.lock();
	switch (nType)
	{
	case 1:
	{
		if (var.isNull() || !var.isValid())
			bRet = false;
		else
			varList.push_back(var);
	}break;

	case 2:
	{
		if (0 == varList.size())
			bRet = false;
		else
			var = varList.takeFirst();
	}break;
	default:
		break;
	}
	mutex.unlock();

	return bRet;
}

三、Qt Xlsx使用教程、Qt操作Excel、Qt生成Excel图表、跨平台不依赖Office(推荐用法:直接使用源代码)

原文链接:https://blog.csdn.net/u014779536/article/details/111769792?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168249367516800225585426%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168249367516800225585426&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-111769792-null-null.142v86insert_down1,239v2insert_chatgpt&utm_term=qtxlsx&spm=1018.2226.3001.4187

用法②:直接使用源代码
该包包含一个 qtxlsx.pri文件,允许您将组件集成到使用 qmake 进行生成步骤的应用程序中。

3.1 新建工程(推荐用法:直接使用源代码)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 工程目录下添加源代码(推荐用法:直接使用源代码)

来到工程目录下:
在这里插入图片描述
在这里插入图片描述
打开网上下载的源码路径:
在这里插入图片描述
在这里插入图片描述

3.3 在工程中引入xlsx源代码(推荐用法:直接使用源代码)

在这里插入图片描述

# 使用qtxlsx源代码
include(qtxlsx/src/xlsx/qtxlsx.pri)

在这里插入图片描述
在这里插入图片描述

3.4 修改main.cpp内容,测试(推荐用法:直接使用源代码)

#include <QtCore>
#include "xlsxdocument.h"

int main()
{
    //![0]
    QXlsx::Document xlsx;
    //![0]

    //![1]
    xlsx.write("A1", "Hello Qt!");
    xlsx.write("A2", 12345);
    xlsx.write("A3", "=44+33");
    xlsx.write("A4", true);
    xlsx.write("A5", "http://qt-project.org");
    xlsx.write("A6", QDate(2013, 12, 27));
    xlsx.write("A7", QTime(6, 30));
    //![1]

    //![2]
    xlsx.save();
    //![2]

    return 0;
}

在这里插入图片描述

3.5 查看效果(推荐用法:直接使用源代码)

在这里插入图片描述
内容一致:

4. 官方examples例子

4.1 calendar Qt操作Excel生成日历

在这里插入图片描述

#include <QtCore>
#include "xlsxdocument.h"
#include "xlsxformat.h"
#include "xlsxcellrange.h"
#include "xlsxworksheet.h"

QTXLSX_USE_NAMESPACE

int main(int argc, char **argv)
{
    QCoreApplication app(argc, argv);

    // Select a proper locale
    // QLocale::setDefault(QLocale(QLocale::English));

    Document xlsx;
    QDate today(QDate::currentDate());
    for (int month = 1; month <= 12; ++month) {
        xlsx.addSheet(QLocale().monthName(month));
        xlsx.currentWorksheet()->setGridLinesVisible(false);

        // the header row
        Format headerStyle;
        headerStyle.setFontSize(48);
        headerStyle.setFontColor(Qt::darkBlue);
        headerStyle.setHorizontalAlignment(Format::AlignHCenter);
        headerStyle.setVerticalAlignment(Format::AlignVCenter);
        xlsx.setRowHeight(1, 80);
        xlsx.write("A1", QString("%1 %2").arg(QLocale().monthName(month)).arg(today.year()));
        xlsx.mergeCells("A1:N1", headerStyle);

        // header with month titles
        for (int day = 1; day <= 7; ++day) {
            Format monthStyle;
            monthStyle.setFontSize(12);
            monthStyle.setFontColor(Qt::white);
            monthStyle.setFontBold(true);
            monthStyle.setHorizontalAlignment(Format::AlignHCenter);
            monthStyle.setVerticalAlignment(Format::AlignVCenter);
            monthStyle.setFillPattern(Format::PatternSolid);
            monthStyle.setPatternBackgroundColor(Qt::darkBlue);

            xlsx.setColumnWidth(day * 2 - 1, day * 2 - 1, 5);
            xlsx.setColumnWidth(day * 2, day * 2, 13);
            xlsx.write(2, day * 2 - 1, QLocale().dayName(day));
            xlsx.mergeCells(CellRange(2, day * 2 - 1, 2, day * 2), monthStyle);
        }

        QColor borderColor = QColor(Qt::gray);

        Format weekendLeftStyle;
        weekendLeftStyle.setFontSize(14);
        weekendLeftStyle.setFontBold(true);
        weekendLeftStyle.setHorizontalAlignment(Format::AlignLeft);
        weekendLeftStyle.setVerticalAlignment(Format::AlignTop);
        weekendLeftStyle.setPatternBackgroundColor(QColor("#93CCEA"));
        weekendLeftStyle.setLeftBorderStyle(Format::BorderThin);
        weekendLeftStyle.setLeftBorderColor(borderColor);
        weekendLeftStyle.setBottomBorderStyle(Format::BorderThin);
        weekendLeftStyle.setBottomBorderColor(borderColor);

        Format weekendRightStyle;
        weekendRightStyle.setHorizontalAlignment(Format::AlignHCenter);
        weekendRightStyle.setVerticalAlignment(Format::AlignTop);
        weekendRightStyle.setPatternBackgroundColor(QColor("#93CCEA"));
        weekendRightStyle.setRightBorderStyle(Format::BorderThin);
        weekendRightStyle.setRightBorderColor(borderColor);
        weekendRightStyle.setBottomBorderStyle(Format::BorderThin);
        weekendRightStyle.setBottomBorderColor(borderColor);

        Format workdayLeftStyle;
        workdayLeftStyle.setHorizontalAlignment(Format::AlignLeft);
        workdayLeftStyle.setVerticalAlignment(Format::AlignTop);
        workdayLeftStyle.setPatternBackgroundColor(Qt::white);
        workdayLeftStyle.setLeftBorderStyle(Format::BorderThin);
        workdayLeftStyle.setLeftBorderColor(borderColor);
        workdayLeftStyle.setBottomBorderStyle(Format::BorderThin);
        workdayLeftStyle.setBottomBorderColor(borderColor);

        Format workdayRightStyle;
        workdayRightStyle.setHorizontalAlignment(Format::AlignHCenter);
        workdayRightStyle.setVerticalAlignment(Format::AlignTop);
        workdayRightStyle.setPatternBackgroundColor(Qt::white);
        workdayRightStyle.setRightBorderStyle(Format::BorderThin);
        workdayRightStyle.setRightBorderColor(borderColor);
        workdayRightStyle.setBottomBorderStyle(Format::BorderThin);
        workdayRightStyle.setBottomBorderColor(borderColor);

        Format greyLeftStyle;
        greyLeftStyle.setPatternBackgroundColor(Qt::lightGray);
        greyLeftStyle.setLeftBorderStyle(Format::BorderThin);
        greyLeftStyle.setLeftBorderColor(borderColor);
        greyLeftStyle.setBottomBorderStyle(Format::BorderThin);
        greyLeftStyle.setBottomBorderColor(borderColor);

        Format greyRightStyle;
        greyRightStyle.setPatternBackgroundColor(Qt::lightGray);
        greyRightStyle.setRightBorderStyle(Format::BorderThin);
        greyRightStyle.setRightBorderColor(borderColor);
        greyRightStyle.setBottomBorderStyle(Format::BorderThin);
        greyRightStyle.setBottomBorderColor(borderColor);

        int rownum = 3;
        for (int day = 1; day <= 31; ++day) {
            QDate date(today.year(), month, day);
            if (!date.isValid())
                break;
            xlsx.setRowHeight(rownum, 100);
            int dow = date.dayOfWeek();
            int colnum = dow * 2 - 1;

            if (dow <= 5) {
                xlsx.write(rownum, colnum, day, workdayLeftStyle);
                xlsx.write(rownum, colnum + 1, QVariant(), workdayRightStyle);
            } else {
                xlsx.write(rownum, colnum, day, weekendLeftStyle);
                xlsx.write(rownum, colnum + 1, QVariant(), weekendRightStyle);
            }

            if (day == 1 && dow != 1) { // First day
                for (int i = 1; i < dow; ++i) {
                    xlsx.write(rownum, i * 2 - 1, QVariant(), greyLeftStyle);
                    xlsx.write(rownum, i * 2, QVariant(), greyRightStyle);
                }
            } else if (day == date.daysInMonth() && dow != 7) { // Last day
                for (int i = dow + 1; i <= 7; ++i) {
                    xlsx.write(rownum, i * 2 - 1, QVariant(), greyLeftStyle);
                    xlsx.write(rownum, i * 2, QVariant(), greyRightStyle);
                }
            }

            if (dow == 7)
                rownum++;
        }
    }

    xlsx.saveAs("Book1.xlsx");

    // Make sure that read/write works well.
    Document xlsx2("Book1.xlsx");
    xlsx2.saveAs("Book2.xlsx");

    return 0;
}

4.2 chart Qt操作Excel生成图表

在这里插入图片描述

#include <QtCore>
#include "xlsxdocument.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"

using namespace QXlsx;

int main()
{
    //![0]
    Document xlsx;
    for (int i = 1; i < 10; ++i) {
        xlsx.write(i, 1, i * i * i); // A1:A9
        xlsx.write(i, 2, i * i); // B1:B9
        xlsx.write(i, 3, i * i - 1); // C1:C9
    }
    //![0]

    //![1]
    Chart *pieChart = xlsx.insertChart(3, 3, QSize(300, 300));
    pieChart->setChartType(Chart::CT_Pie);
    pieChart->addSeries(CellRange("A1:A9"));
    pieChart->addSeries(CellRange("B1:B9"));
    pieChart->addSeries(CellRange("C1:C9"));

    Chart *pie3DChart = xlsx.insertChart(3, 9, QSize(300, 300));
    pie3DChart->setChartType(Chart::CT_Pie3D);
    pie3DChart->addSeries(CellRange("A1:C9"));

    Chart *barChart = xlsx.insertChart(23, 3, QSize(300, 300));
    barChart->setChartType(Chart::CT_Bar);
    barChart->addSeries(CellRange("A1:C9"));

    Chart *bar3DChart = xlsx.insertChart(23, 9, QSize(300, 300));
    bar3DChart->setChartType(Chart::CT_Bar3D);
    bar3DChart->addSeries(CellRange("A1:C9"));

    Chart *lineChart = xlsx.insertChart(43, 3, QSize(300, 300));
    lineChart->setChartType(Chart::CT_Line);
    lineChart->addSeries(CellRange("A1:C9"));

    Chart *line3DChart = xlsx.insertChart(43, 9, QSize(300, 300));
    line3DChart->setChartType(Chart::CT_Line3D);
    line3DChart->addSeries(CellRange("A1:C9"));

    Chart *areaChart = xlsx.insertChart(63, 3, QSize(300, 300));
    areaChart->setChartType(Chart::CT_Area);
    areaChart->addSeries(CellRange("A1:C9"));

    Chart *area3DChart = xlsx.insertChart(63, 9, QSize(300, 300));
    area3DChart->setChartType(Chart::CT_Area3D);
    area3DChart->addSeries(CellRange("A1:C9"));

    Chart *scatterChart = xlsx.insertChart(83, 3, QSize(300, 300));
    scatterChart->setChartType(Chart::CT_Scatter);
    // Will generate three lines.
    scatterChart->addSeries(CellRange("A1:A9"));
    scatterChart->addSeries(CellRange("B1:B9"));
    scatterChart->addSeries(CellRange("C1:C9"));

    Chart *scatterChart_2 = xlsx.insertChart(83, 9, QSize(300, 300));
    scatterChart_2->setChartType(Chart::CT_Scatter);
    // Will generate two lines.
    scatterChart_2->addSeries(CellRange("A1:C9"));

    Chart *doughnutChart = xlsx.insertChart(103, 3, QSize(300, 300));
    doughnutChart->setChartType(Chart::CT_Doughnut);
    doughnutChart->addSeries(CellRange("A1:C9"));
    //![1]

    //![2]
    xlsx.saveAs("Book1.xlsx");
    //![2]

    Document xlsx2("Book1.xlsx");
    xlsx2.saveAs("Book2.xlsx");
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/15359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

26- OCR 基于PP-OCRv3的液晶屏读数识别

要点&#xff1a; 液晶屏识别示例github 地址 1. 简介 本项目基于PaddleOCR开源套件&#xff0c;以PP-OCRv3检测和识别模型为基础&#xff0c;针对液晶屏读数识别场景进行优化。主要是针对各种仪表进行识别&#xff1a; 2 安装环境 安装Git&#xff1a;Git 详细安装教程 # 首…

Git基础

文章目录 1. Git基础1.1 版本管理1.1.1 什么是版本管理1.1.2 人为维护文档版本的问题 1.2 Git 是什么1.3 Git 安装1.4 Git基本工作流程1.5 Git 的使用1.5.1 Git 使用前配置1.5.2 提交步骤1.5.3 撤销 2. Git进阶2.1 分支2.1.1 分支细分2.1.2 分支命令 2.2 暂时保存更改 1. Git基…

鸿蒙Hi3861学习三-第一个实例程序Hello_world

一、简介 前两章介绍了环境搭建、烧录和编译。这一节&#xff0c;来介绍实现第一个经典代码“hello world”。 先介绍小熊派的目录结构&#xff0c;该目录结构延续了OpenHarmony官方目录结构。 二、实操 1.搭建代码架构 1).新建项目文件夹hello_world cd bearpi-hm_nano/appli…

【VM服务管家】VM4.0平台SDK_2.3 控件嵌入类

目录 2.3.1 渲染结果&#xff1a;通过绑定流程或模块获取渲染结果的方法2.3.2 渲染控件&#xff1a;渲染控件加载本地图像的方法2.3.3 渲染控件&#xff1a;渲染控件上自定义图形的方法2.3.4 参数控件&#xff1a;参数配置控件绑定模块的方法2.3.5 控件颜色&#xff1a;控件颜色…

Java新提案,最终还是靠近C#了

Java是一门非常优秀的编程语言&#xff0c;特别是生态繁荣&#xff0c;成熟的轮子很多&#xff0c;各种解决方案都有&#xff0c;要开发一个项目&#xff0c;只需把轮子组装&#xff0c;并根据自己的项目&#xff0c;进行自定义修改&#xff0c;可以极大地提升开发效率。 曾经…

【算法】【算法杂谈】判断点是否在三角形内部(面积法和向量法)

目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介…

react-antd-procomponents组件库 ProTable表格实现跨页多选。

table表格多选时所需要的api 1.onSelect - 单行选择(用户手动选择/取消选择某行的回调) 2.onSelectMultiple - 多行选择&#xff08;用户使用键盘 shift 选择多行的回调&#xff09; 3.onSelectAll - 全选全不选(用户手动选择/取消选择所有行的回调) 4.onChange - 每次选择行都…

Page管理机制

Page页分类 Buffer Pool 的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存&#xff0c;以后使用可以减少磁盘IO操作&#xff0c;提升效率 Page根据状态可以分为三种类型&#xff1a; - free page &#xff1a; 空闲page&#xff0c;未被使用 - …

耐腐蚀高速电动针阀在半导体硅片清洗机化学药液流量控制中的应用

摘要&#xff1a;化学药液流量的精密控制是半导体湿法清洗工艺中的一项关键技术&#xff0c;流量控制要求所用调节针阀一是开度电动可调、二是具有不同的口径型号、三是高的响应速度&#xff0c;四是具有很好的耐腐蚀性&#xff0c;这些都是目前提升半导体清洗设备性能需要解决…

2023/4/25总结

刷题&#xff1a; 第一周任务 - Virtual Judge (vjudge.net) 1.这一题的思路就是先排除前面和后面相等的&#xff0c;然后找到不等的情况&#xff0c;不等情况的下标开始前后都走&#xff0c;看看是不是和b数组构成了一个升序数组即可。 #include<stdio.h> #define Ma…

【数据结构】链表详解

本片要分享的内容是链表&#xff0c;为方便阅读以下为本片目录 目录 1.顺序表的问题及思考 1.链表的遍历 2.头部插入 2.1开辟空间函数分装 3.尾部插入 纠正 4.尾部删除 5.头部删除 6.数据查找 7.任意位置插入 1.顺序表的问题及思考 上一篇中讲解了顺序表中增删查…

从源码全面解析LinkedBlockingQueue的来龙去脉

一、引言 并发编程在互联网技术使用如此广泛&#xff0c;几乎所有的后端技术面试官都要在并发编程的使用和原理方面对小伙伴们进行 360 的刁难。 二、使用 对于阻塞队列&#xff0c;想必大家应该都不陌生&#xff0c;我们这里简单的介绍一下&#xff0c;对于 Java 里面的阻塞…

Python | 基于LendingClub数据的分类预测研究Part01——问题重述+特征选择+算法对比

欢迎交流学习~~ 专栏&#xff1a; 机器学习&深度学习 本文利用Python对数据集进行数据分析&#xff0c;并用多种机器学习算法进行分类预测。 具体文章和数据集可以见我所发布的资源&#xff1a;发布的资源 Python | 基于LendingClub数据的分类预测研究Part01——问题重述特…

在.NET Core中正确使用HttpClient的方式

HttpClient 是 .NET Framework、.NET Core 或 .NET 5以上版本中的一个类&#xff0c;用于向 Web API 发送 HTTP 请求并接收响应。它提供了一些简单易用的方法&#xff0c;如 GET、POST、PUT 和 DELETE&#xff0c;可以很容易地构造和发送 HTTP 请求&#xff0c;并处理响应数据。…

【Excel统计分析插件】上海道宁为您提供统计分析、数据可视化和建模软件——Analyse-it

Analyse-it是Microsoft Excel中的 统计分析插件 它为Microsoft Excel带来了 易于使用的统计软件 Analyse-it在软件中 引入了一些新的创新统计分析 Analyse-it与 许多Excel加载项开发人员不同 使用完善的软件开发和QA实践 包括单元/集成/系统测试 敏捷开发、代码审查 …

虹科案例|虹科Micronor光纤传感器,实现核磁共振新应用!

PART 1 背景介绍 光纤传感器已成为推动MRI最新功能套件升级和新MRI设备设计背后的关键技术。将患者的某些活动与MRI成像系统同步是越来越受重视的需求。磁场强度随着每一代的发展而增大&#xff0c;因此&#xff0c;组件的电磁透明度在每一代和新应用中变得更加重要。 光学传…

《Netty》从零开始学netty源码(四十六)之PooledByteBuf

PooledByteBuf Netty中一大块内存块PoolChunk默认大小为4MB&#xff0c;为了尽可能充分利用内存会将它切成很多块PooledByteBuf&#xff0c;PooledByteBuf的类关系图如下&#xff1a; PooledUnsafeDirectByteBuf与PooledUnsafeHeapByteBuf直接暴露对象的底层地址。 PooledByt…

【英语】100个句子记完7000个托福单词

其实主要的7000词其实是在主题归纳里面&#xff0c;不过过一遍100个句子也挺好的&#xff0c;反正也不多。 文章目录 Sentence 01Sentence 02Sentence 03Sentence 04Sentence 05Sentence 06Sentence 07Sentence 08Sentence 09Sentence 10Sentence 11Sentence 12Sentence 13Sent…

数据分析中常见标准的参考文献

做数据分析过程中&#xff0c;有些分析法方法的标准随便一搜就能找到&#xff0c;不管是口口相传还是默认&#xff0c;大家都按那样的标准做了。日常分析不细究出处还可以&#xff0c;但是正式的学术论文你需要为你写下的每一句话负责&#xff0c;每一个判断标准都应该有参考文…

Docker | 解决docker 容器中csv文件乱码的情况

问题描述&#xff1a;在Ubuntu docker容器中&#xff0c;打开.csv文件时显示乱码 问题如图 错误分析&#xff1a; 用locale查看所用容器支持的字符集 从输出可以看到&#xff0c;系统使用的是POSIX字符集&#xff0c;POSIX字符集是不支持中韩文的&#xff0c;而UTF-8是支持中…