qxlsx 冻结单元格(freeze fix)

在使用qxlsx过程中,导出的Excel要求有行列冻结功能(https://github.com/QtExcel/QXlsx)。没找到库中代码有此功能,后来在讨论组组中,发现了一个大神把这个问题解决了(https://github.com/QtExcel/QXlsx/discussions/200)。

在此记录一下。

吧QXlsx库的源代码及更改上传到此:https://files-cdn.cnblogs.com/files/warmlight/QXlsx20240717.zip?t=1721185247&download=true

示例使用的是官方例子rowcolumn.cpp:

// rowcolumn.cpp

#include "xlsxdocument.h"
#include "xlsxformat.h"

#include <QtCore>
#include <QtGlobal>
#include "xlsxabstractsheet.h"

int rowcolumn()
{
    QXlsx::Document xlsx;
    xlsx.write(1, 2, "Row:0, Col:2 ==> (C1)");

    // Set the height of the first row to 50.0(points)
    xlsx.setRowHeight(1, 50.0);

    // Set the width of the third column to 40.0(chars)
    xlsx.setColumnWidth(3, 3, 40.0);

    // Set style for the row 11th.
    QXlsx::Format format1;
    format1.setFontBold(true);
    format1.setFontColor(QColor(Qt::blue));
    format1.setFontSize(20);
    xlsx.write(11, 1, "Hello Row Style");
    xlsx.write(11, 6, "Blue Color");
    xlsx.setRowFormat(11, format1);
    xlsx.setRowHeight(11, 41);

    // Set style for the col [9th, 16th)
    QXlsx::Format format2;
    format2.setFontBold(true);
    format2.setFontColor(QColor(Qt::magenta));
    for (int row = 12; row <= 30; row++)
        for (int col = 9; col <= 15; col++)
            xlsx.write(row, col, row + col);
    xlsx.setColumnWidth(9, 16, 5.0);
    xlsx.setColumnFormat(9, 16, format2);

    //20240717
    QXlsx::Worksheet* pSheet = static_cast<QXlsx::Worksheet*>(xlsx.currentSheet());
    pSheet->setFrozenRows(1);
    //pSheet->setFrozenColumns(1);

    // Autosize columns
    xlsx.addSheet("Autosize");
    QXlsx::Format header;
    header.setFontBold(true);
    header.setFontSize(20);

    // Custom number formats
    int row = 2;
    xlsx.write(row, 1, "Small", header);
    xlsx.write(row, 2, "Large header", header);
    for (int i = 0; i < 10; ++i) {
        xlsx.write(row + 1 + i, 1, i);
        xlsx.write(row + 1 + i, 2, i);
    }
    xlsx.autosizeColumnWidth(1, 2);

    xlsx.write(2, 4, "Small", header);
    xlsx.write(2, 5, "<--- Large header --->", header);
    for (int i = 0; i < 10; ++i) {
        xlsx.write(row + 1 + i, 4, exp(i));
        xlsx.write(row + 1 + i, 5, exp(i));
    }
    xlsx.autosizeColumnWidth(4, 5);

    xlsx.write(1, 7, "<--- Very big first line --->", header);
    xlsx.write(row, 7, "Small", header);
    xlsx.write(row, 8, "<--- Large header --->", header);
    for (int i = 0; i < 10; ++i) {
        xlsx.write(row + 1 + i, 7, exp(i));
        xlsx.write(row + 1 + i, 8, exp(i));
    }
    xlsx.autosizeColumnWidth(QXlsx::CellRange(2, 7, 1000, 8));

    //20240717
    QXlsx::Worksheet* pSheet1 = static_cast<QXlsx::Worksheet*>(xlsx.currentSheet());
    pSheet1->setFrozenRows(2);
    pSheet1->setFrozenColumns(1);

    xlsx.saveAs("rowcolumn.xlsx");
    return 0;
}

 

posted @ 2024-07-17 11:05  阳光下的小土豆  阅读(19)  评论(0编辑  收藏  举报