;前言
QAxObject最大的缺点是电脑必须安装wps或者office才可以使用奥而且速度非常慢,

QtXlsx不需要计算机安装office就能对.xlsx文件进行操作,支持跨平台,光速读取数据

xls最大只有65536行、256列

xlsx可以有1048576行、16384列

xlsx另存为xls 会丢失256列之后的数据

 



#include "myxlsx.h"


MyXlsx::MyXlsx( QString fileName)
{
    mXlsx = new QXlsx::Document(fileName);
    mFileName = fileName;

    //标题单元格样式
    mFormat.setFontSize(20);/*设置字体大小*/
    mFormat.setFontBold(true);//字体加粗
    mFormat.setHorizontalAlignment(QXlsx::Format::AlignHCenter);//横向居中
    mFormat.setVerticalAlignment(QXlsx::Format::AlignVCenter);//纵向居中
    mFormat.setBorderStyle(QXlsx::Format::BorderDashDotDot);//边框样式
}

MyXlsx::~MyXlsx()
{
    delete mXlsx;
    mXlsx = NULL;
}


QString MyXlsx::read(int row, int col)
{
    // mXlsx->read(1,1); 读取第一行第一列
    QVariant v = mXlsx->read(row,col);
    return v.toString();
}


/*
    //往sheet2 的row 1 列1 写入123
    xlsx->write(1,1, QString::number(123));
    //往sheet2 的row 1 列2 写入123
    xlsx->write(2,2, QString::number(123));
    xlsx->write(3,3, QString::number(123));
    xlsx->selectSheet("第1个sheet");
    xlsx->write(1,1, QString::number(123));*/
void MyXlsx::write(int row, int col,QString data)
{
    //往sheet 的row 1 列1 写入123
    //xlsx->write(1,1, QString::number(123));
    mXlsx->write(row,col, data);
}

void MyXlsx::write(int row, int col, QString data, bool format=false)
{
    if (format) {
        mXlsx->write(row,col, data,mFormat);
    } else {
        mXlsx->write(row,col, data);
    }
}

void MyXlsx::save()
{
    mXlsx->save();
}

void MyXlsx::saveAs(QString fileName)
{
    //bool ret = xlsx->saveAs(EXCEL_NAME); // 保存到EXCEL_NAME,如果已经存在则覆盖
    bool ret = mXlsx->saveAs(fileName);
    if(ret){
        qInfo() << "创建excel成功!";
    }
    else{
        qWarning() << "创建excel失败!";
    }
}


/*

    // 添加第一个工作簿 sheet
    xlsx->addSheet("第1个sheet", AbstractSheet::ST_WorkSheet);
    xlsx->addSheet("第2个sheet", AbstractSheet::ST_WorkSheet);
*/
void MyXlsx::addSheet(QString name)
{



    //xlsx->addSheet("第1个sheet", AbstractSheet::ST_WorkSheet);
    mXlsx->addSheet(name, AbstractSheet::ST_WorkSheet);
}

void MyXlsx::selectSheet(QString name)
{
    //xlsx->selectSheet("第1个sheet");
    if(!mXlsx->selectSheet(name))
    {
        //没有这个工作簿则添加,此后基于这个新工作簿操作
        mXlsx->addSheet(name);
    }
}

/*

    工作簿重命名,注意 excel文件如果被打开,此时程序做的写入命名等操作是无效的奥
*/
void MyXlsx::renameSheet(QString oldName,QString newName)
{
    //xlsx->renameSheet("第1个sheet","first sheet");
    mXlsx->renameSheet(oldName,newName);
}

//获取当前工作簿行数
int MyXlsx::rowCount()
{
    //获取指定工作簿有效行 列 start
    //QXlsx::Worksheet *workSheet = static_cast<QXlsx::Worksheet*>(mXlsx->sheet("first"));
    //       int row = workSheet->dimension().rowCount();
    //       int col = workSheet->dimension().columnCount();
    //获取指定工作簿有效行 列 end


    QXlsx::Worksheet *worksheet = mXlsx->currentWorksheet();
    return worksheet->dimension().rowCount();
}

//获取当前工作簿列数
int MyXlsx::colCount()
{
    QXlsx::Worksheet *worksheet = mXlsx->currentWorksheet();
    return worksheet->dimension().columnCount();
}

//合并单元格
void MyXlsx::span(int row,int col,int row2,int col2)
{
    //xlsxDocument.mergeCells(QXlsx::CellRange(3,1,3,3), tableTitleFormat);
    //合并第4行,第一列到第三列
    //mXlsx->mergeCells(QXlsx::CellRange(4,1,4,3));
    mXlsx->mergeCells(QXlsx::CellRange(row,col,row2,col2));
}

//打印当前工作簿内容
void MyXlsx::print()
{


    for(int row = 0; row < 10; row++)
    {
        for(int col = 0; col < 10; col++)
        {
            QVariant data = mXlsx->read(row+1, col+1);
            if (!data.isNull()) {
                qDebug()<< data.toString();
            }
        }
    }
}

//测试数据
void MyXlsx::testInsert()
{
    for(int row = 0; row < 10; row++)
    {
        for(int col = 0; col < 10; col++)
        {
            mXlsx->write(row+1, col+1,QString::number(row) + "," + QString::number(col));
        }
    }
}

posted on 2024-02-15 15:15  jk0011  阅读(7)  评论(0编辑  收藏  举报