Qt 操作Excel表格

2 篇文章 0 订阅
// 参考内容: 	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();
}

 

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值