欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt 操作Excel表格

程序员文章站 2024-03-17 19:38:52
...
// 参考内容: 	https://blog.csdn.net/qq319923400/article/details/80149367
//			    https://www.cnblogs.com/lifexy/p/10743316.html
//			    https://www.cnblogs.com/lifexy/p/10743352.html

#include "widget.h"

#include <QApplication>
#include <QAxObject>		// .pro需要添加: QT += axcontainer
#include <QFileDialog>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;

    QAxObject excel("Excel.Application");		// 关联excel
    excel.setProperty("Visible", true);			// 运行程序时要不要通过excel打开当前编辑的表格
    excel.setProperty("DisplayAlerts", false);		// excel关闭时是否询问要不要保存
    //excel.setProperty("Caption", "Qt Excel");		// 类似于文件类型吧,感觉这个名称意义不大

    QAxObject* workbooks = excel.querySubObject("WorkBooks");
    workbooks->dynamicCall("Add");			// 增加一个excel表格,写两遍会打开两个不同的excel表格
    QAxObject* workbook = excel.querySubObject("ActiveWorkBook");
    QAxObject* worksheet = workbook->querySubObject("WorkSheets(QString)", "Sheet1");  	// 通过sheet名获取sheet1
    // QAxObject* worksheet = workbook->querySubObject("WorkSheets(int)", "1");  	// 通过编号获取sheet1, 结果和上面一样
    worksheet->setProperty("Name", "Shadow3D_1");			// 修改sheet名

    // 行列相关查询
    QAxObject* usedrange = worksheet->querySubObject("UsedRange");
    int intRowStart = usedrange->property("Row").toInt();
    int intColStart = usedrange->property("Column").toInt();
    // 注意: 这里的行和列都是从1开始计数的
    qDebug() << "intRowStart: " << intRowStart << "\tintColStart: " << intColStart;

    // 查看已经使用的最大行数和最大列数
    int intRow = usedrange->querySubObject("Rows")->property("Count").toInt();
    int intCol = usedrange->querySubObject("Columns")->property("Count").toInt();
    qDebug() << "Rows: " << intRow << "\tColumns: " << intCol;

    // 写单元格
    for(int i = 1; i < 10; i++)
        for(int j = 1; j < 10; j++)
            worksheet->querySubObject("Cells(int, int)", i, j)->setProperty("Value2", i+j);

    // 查看已经使用的最大行数和最大列数
    usedrange = worksheet->querySubObject("UsedRange");			// 当重新修改sheet后,必须重新获取UsedRange值才能得到最新的行数和列数。
    QAxObject* rows = usedrange->querySubObject("Rows");
    QAxObject* columns = usedrange->querySubObject("Columns");
    qDebug() << rows << columns;				// 不知道这个rows和columns的值表示什么意义,每次运行都不一样。。。
    intRow = rows->property("Count").toInt();
    intCol = columns->property("Count").toInt();
    qDebug() << "Rows: " << intRow << "\tColumns: " << intCol;

    // 读单元格
    QAxObject* cell = worksheet->querySubObject("Cells(int, int)", 5, 5);	// 获取单元格对象
    QString cellStr = cell->dynamicCall("Value2()").toString();
    qDebug() << "cell: " << cellStr;					// "10"
    qDebug() << "cell: " << cellStr.toUtf8().data();	// 10	( QString 类型转换为 QByteArray,再转换成Char* )

    // 单元格格式
    cell = worksheet->querySubObject("Cells(int, int)", 11, 11);
    cell->setProperty("Value", "bool setProperty(const char *name, const QVariant &value");
    cell->setProperty("RowHeight", 50);
    cell->setProperty("ColumnWidth", 30);
    cell->setProperty("HorizontalAlignment", -4108);	// left:-4131 center:-4108 right:-4152
    cell->setProperty("VerticalAlignment", -4108);	// left:-4161 center:-4108 right:-4107
    cell->setProperty("WrapText", true);	// 单元格内容多时自动换行
    // cell>dynamicCall("ClearContents()");	// 清空单元格内容

    // 设置颜色,字体
    cell = worksheet->querySubObject("Cells(int, int)", 12, 12);	// 获取单元格对象
    cell->setProperty("Value", "Text");
    QAxObject* interior = cell->querySubObject("Interior");
    interior->setProperty("Color", QColor(0, 255, 0));	// 背景颜色: Green
    QAxObject* border = cell->querySubObject("Borders");
    border->setProperty("Color", QColor(0, 0, 255));	// 边框颜色: Blue
    QAxObject* font = cell->querySubObject("Font");
    font->setProperty("Name", QStringLiteral("华文彩云"));
    font->setProperty("Bold", true);
    font->setProperty("Size", 20);
    font->setProperty("Italic", true);
    font->setProperty("Underline", 3);		// 下划线:2	双下划线:3
    font->setProperty("Color", QColor(255, 0, 0));		// 字体颜色: Red

    // 合并拆分单元格
    QString merge_cell;
    merge_cell.append(QChar('A'+20));			// 从第(20+1)列开始,因为'A'表示第一列
    merge_cell.append(QString::number(15));		// 从第15行开始
    merge_cell.append(":");
    merge_cell.append(QChar('A'+21));			// 到(21+1)列结束
    merge_cell.append(QString::number(16));		// 到第16列结束
    QAxObject* merge_range = worksheet->querySubObject("Range(const QString&)", merge_cell);
    merge_range->setProperty("MergeCells", true);		// 合并单元格
//    merge_range->setProperty("MergeCells", false);	// 拆分单元格


    // 文件保存
    QString fileName = QFileDialog::getSaveFileName(NULL, QStringLiteral("Save File As"), QStringLiteral("Shadow3D"), QStringLiteral("EXCEL(*.xlsx | *.xls)"));
    workbook->dynamicCall("SaveAs(conse QString&)", QDir::toNativeSeparators(fileName));
    
    // 关闭文件
    workbook->dynamicCall("Close(Boolean)", false);
    // 退出excel
    excel.dynamicCall("Quit(void)");
    // delete excel;	// 如果excel是通过new方式建立在堆上,要记得释放。

    w.show();
    return a.exec();
}