Qt将TableView数据保存到本地Excel中

1、QStandardItemModel负责保存数据,每个数据项被表示为类QStandardItem的对象。

2、类QStandardItemModel将类QStandardItem表示的数据项组织起来,形成列表、表格甚至更负责的数据结构。本例子中将数据集表示为一个表格,所以用QTableView显示该数据。具体代码如下:

void widget::CreateView()
{
	mainLayout = new QVBoxLayout;  //垂直布局
	mainLayout->setSpacing(10);    // 设置空间间距
	mainLayout->setMargin(10);     // 设置边缘间距

	testBtn = new QPushButton("Test");

	// 添加QTableView代码
	tableView = new QTableView;
	standItemModel = new QStandardItemModel();

	//添加表头
	standItemModel->setColumnCount(3);

	// 设置表头
	standItemModel->setHeaderData(0, Qt::Horizontal, tr("序号"));
	standItemModel->setHeaderData(1, Qt::Horizontal, tr("名称"));
	standItemModel->setHeaderData(2, Qt::Horizontal, tr("地址"));

	//向表格添加100行内容
	for (int i = 0; i < 100; i++)
	{
		QStandardItem *standItem1 = new QStandardItem(tr("%1").arg(i+1));
		QStandardItem *standItem2 = new QStandardItem(tr("第%1行").arg(i+1));
		QStandardItem *standItem3 = new QStandardItem(tr("学园路第%1号").arg(i+1));
		// 表格第i行第0列添加内容
		standItemModel->setItem(i, 0, standItem1);
		// 设置字符颜色
		standItemModel->item(i, 0)->setForeground(QBrush(QColor(255, 0, 0)));
		//  设置表格内容居中
		standItemModel->item(i, 0)->setTextAlignment(Qt::AlignCenter);

		// 表格第i行第1列添加一条内容
		standItemModel->setItem(i, 1, standItem2);

		standItemModel->setItem(i, 2, standItem3);
	}
	// 挂载表格模型
	tableView->setModel(standItemModel);
	// 设置表格属性
	tableView->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter);
	// 设定表头列宽不可变
	tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);

	tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
	// 设定第2列表头可拉伸
	tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);

	//设定表格第0列宽度
	tableView->setColumnWidth(0, 100);
	tableView->setColumnWidth(1, 200);
	tableView->verticalHeader()->hide(); 
	//设置选中时整行选中
	tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
	// 设置表格属性只读
	tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
	
	
	//删除从第0行开始的连续10行
	//standItemModel->removeRows(0, 10);
	
	mainLayout->addWidget(testBtn);
	mainLayout->addWidget(tableView);    //添加控件
	this->setLayout(mainLayout);        //显示垂直布局
}

效果如下:

接着,将TableView中的数据保存为本地的Excel文件

    QAxObject *excel;
	QAxObject *workBooks;
	QAxObject *workBook;
	QAxObject *workSheets;
	QAxObject *workSheet;
	QAxObject *range;
	QAxObject *cell;
	QAxObject *col;

	QString path = "F:/QTCode/learning/SaveExcelFile/widget/widget/widget/";
	QString fileName = path.append("Excel.xlsx");

	excel = new QAxObject("Excel.Application");
	if (!excel)
	{
		qDebug() << "create excel file failed";
	}
	else
	{
		qDebug() << "create excel file successed";
	}

	excel->dynamicCall("SetVisible (bool Visible)", true);
	excel->dynamicCall("SetUserControl(bool UserControl)", true);
	workBooks = excel->querySubObject("WorkBooks");
	workBooks->dynamicCall("Add");
	workBook = excel->querySubObject("ActiveWorkBook");
	workSheets = workBook->querySubObject("Sheets");
	workSheet = workSheets->querySubObject("Item(int)", 1);
	workSheet->setProperty("Name", "数据");

	int colCount = tableView->model()->columnCount();
	int rowCount = tableView->model()->rowCount();


	//写入数据到excel表格
	for (int i = 0; i < rowCount; i++)
	{
		for (int j = 0; j < colCount; j++)
		{
			// 获取tableView中的索引号
			QModelIndex index = tableView->model()->index(i, j);
			// 获取索引号对应的数据
			QString strData = tableView->model()->data(index).toString();
			// 获取excel表格中的单元格索引,以(1, 1)为起点
		    cell = workSheet->querySubObject("Cells(int, int)", i+2, j+1);
			// 写入数据到excel中的单元格
			cell->dynamicCall("SetValue(const QString&)", strData);
		}
	}


	// 列标题
	for (int i = 0; i < colCount; i++)
	{
		// 获取单元格 A1, B1, C1
		QString columnName;
		columnName.append(QChar(i + 'A'));
		columnName.append(QString::number(1));
		cell = workSheet->querySubObject("Range(const QString)", columnName);
		
		// 单元格属性设置
		cell->setProperty("ColumnWidth", 500);
		cell->setProperty("RowHeight", 30);
		cell->querySubObject("Font")->setProperty("Bold", true);
		cell->querySubObject("Interior")->setProperty("Color", QColor(150, 150, 150));
		cell->setProperty("HorizontalAlignment", -4108);
		// 获取列标题的单元格索引
		col = workSheet->querySubObject("Cells(int, int)", 1, i + 1);
		// 获取tableView中的列标题数据
		columnName = tableView->model()->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString();
		// 写入到excel的单元格中
		col->dynamicCall("SetValue(const QString&)", columnName);


	}

	// 对单元格画边框
	QString drawCellLine;
	drawCellLine.append("A1:");
	drawCellLine.append(colCount-1 + 'A');
	drawCellLine.append(QString::number(tableView->model()->rowCount()));
	range = workSheet->querySubObject("Range(const QString&)", drawCellLine);
	range->querySubObject("Borders")->setProperty("LineStyle", QString::number(1));
	range->querySubObject("Borders")->setProperty("Color", QColor(0, 0, 0));

	// 调整数据行高
	QString rowsName;
	rowsName.append("1:");
	rowsName.append(QString::number(tableView->model()->rowCount()));
	range = workSheet->querySubObject("Range(const QString&)", rowsName);
	range->setProperty("RowHeight", 20);



	workBook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(fileName));
	workBook->dynamicCall("Close()");
	excel->dynamicCall("Quit()");
	delete excel;
	excel = NULL;

效果如下:

  • 14
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值