Le problème avec l'écriture rapide d'Excel par QT est la première ligne de données

Le problème avec l'écriture rapide d'Excel par QT est la première ligne de données

Ici, je ne décrirai pas plus sur la méthode de QT pour lire rapidement Excel, veuillez rechercher sur baidu ou CSDN.
Quant à savoir pourquoi vous devez écrire Excel rapidement, en fait, pour l'écriture Excel avec une petite quantité de données, la méthode de la cellule (int, int) ne pose aucun problème. Pour une grande quantité de données, surtout après plus de 1 s entrées, la le temps est inacceptablement long ! !
La raison est encoreQAxObject ne peut pas être appelé à plusieurs reprisesinterface .
donc,Nous devons préparer les données d'une table en une seule fois et les écrire en une seule fois, afin qu'elles puissent être écrites rapidement.
Sans plus tarder, commençons par le code.

//1->A 26->Z 27->AA
void convertToColName(int data, QString& res)
{
    
    
    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 = (to26AlphabetString(data) + res);
    }
}

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

bool WriteOneTable(const QString &filepath, QVector<QVector<QVariant>> & table)
{
    
    
	if (!table.isEmpty() && !filepath.isEmpty())
	{
    
    
        //新建excel表
        QAxObject excel("Excel.Application");
        excel.dynamicCall("SetVisible (bool Visible)", "false");
        excel.setProperty("DisplayAlerts", false);
        QAxObject* workbooks = excel.querySubObject("WorkBooks");
        workbooks->dynamicCall("Add");
        QAxObject* workbook = excel.querySubObject("ActiveWorkBook");
        QAxObject* sheet = workbook.querySubObject("WorkSheets(int)", 1);

        //数据转换
		QVariantList tdata;
        QVariant var;
		int row = table.count();
		int col = table[0].count();

		for (int i = 0; i < row; i++)
		{
    
    
			//tdata << table[i].toList(); //这个地方一定要注意!!!这种写法是错误的
            tdata << QVariant(table[i].toList());//ok
		}
        var = tdata; //注意!

        //写入单元格范围A1:L2243
        QString crange;
        convertToColName(col, crange);
        crange = QString("A1:%1%2").arg(crange).arg(row);

        //写入数据
        QAxObject* range = sheet.querySubObject("Range(const QString &)", crange);
        QVariant res = range->setProperty("Value", var);
        delete range;

        //退出
        workbook->dynamicCall("SaveAs(const QString&)", filepath);
        workbook->dynamicCall("Close(Boolean)", false);
        excel.dynamicCall("Quit(void)");
	}
}

Il convient de noter ci-dessus que le tdata << table[i].toList(); dans la fonction WriteOneTable() est faux ! ! Pourquoi est-ce faux ? Vous pouvez l'essayer vous-même. Dans la zone Excel spécifiée, tous les résultats de la même ligne de données.
Incorrect
Semblable à l'image ci-dessus, le résultat est répété pour chaque ligne.
Après une comparaison minutieuse, j'ai réalisé plus tard qu'il était nécessaire d'écrire tdata << QVariant(table[i].toList()); car
d'accord
chaque ligne de données doit être compressée dans un QVariant, puis d'écrire plusieurs lignes , tdata << table [i].toList(); n'est écrit que sur une seule ligne, donc la zone excédentaire est supprimée et la zone spécifiée est sur la même ligne.
Le moyen le plus sûr est de copier le texte intégral, les petits détails me laissent perplexe. C'est pour me rappeler et pour vous le rappeler !

Je suppose que tu aimes

Origine blog.csdn.net/myhappyandy/article/details/120232879
conseillé
Classement