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
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 要将QtTableView导出到Excel,您需要完成以下步骤: 1.将QtTableView数据存储到QStandardItemModel对象。 2.使用QXlsx库的功能,将QStandardItemModel对象数据写入Excel文件。 以下是一些示例代码,可以用作参考: ```cpp #include <QStandardItemModel> #include <QFile> #include <QDir> #include <QFileDialog> #include <QMessageBox> #include "xlsxdocument.h" // 将TableView数据存储到QStandardItemModel对象 QStandardItemModel* createStandardModelFromTableView(QTableView* tableView) { QStandardItemModel* standardModel = new QStandardItemModel; // 获取TableView的列数和行数 int numCols = tableView->model()->columnCount(); int numRows = tableView->model()->rowCount(); // 设置QStandardItemModel的列数和行数 standardModel->setColumnCount(numCols); standardModel->setRowCount(numRows); // 将TableView数据复制到QStandardItemModel for (int i = 0; i < numRows; ++i) { for (int j = 0; j < numCols; ++j) { QModelIndex index = tableView->model()->index(i, j); QVariant data = tableView->model()->data(index, Qt::DisplayRole); standardModel->setData(standardModel->index(i, j), data); } } return standardModel; } // 将QStandardItemModel对象数据写入Excel文件 void writeStandardModelToExcel(QStandardItemModel* standardModel) { QXlsx::Document xlsx; int numCols = standardModel->columnCount(); int numRows = standardModel->rowCount(); // 写入表头 for (int j = 0; j < numCols; ++j) { QModelIndex index = standardModel->index(0, j); QVariant data = standardModel->data(index, Qt::DisplayRole); xlsx.write(1, j + 1, data.toString()); } // 写入数据 for (int i = 1; i < numRows; ++i) { for (int j = 0; j < numCols; ++j) { QModelIndex index = standardModel->index(i, j); QVariant data = standardModel->data(index, Qt::DisplayRole); xlsx.write(i + 1, j + 1, data.toString()); } } // 保存Excel文件 QString filePath = QFileDialog::getSaveFileName(nullptr, "Save Excel File", QDir::homePath(), "*.xlsx"); if (!filePath.isEmpty()) { if (xlsx.saveAs(filePath)) { QMessageBox::information(nullptr, "Success", "Excel file saved successfully!"); } else { QMessageBox::warning(nullptr, "Error", "Failed to save Excel file!"); } } } // 在按钮点击事件调用上述两个函数 void onExportToExcelButtonClicked() { QStandardItemModel* standardModel = createStandardModelFromTableView(tableView); writeStandardModelToExcel(standardModel); } ``` 请注意,上述代码使用了QXlsx库来将数据写入Excel文件。要使用此库,您需要将其包含在项目,并在.pro文件添加以下行: ```qmake LIBS += -L/path/to/QXlsx/lib -lQXlsx INCLUDEPATH += /path/to/QXlsx/include ``` 其您好!要将QtTableView导出到Excel,您可以按照以下步骤进行操作: 1. 引入相应的头文件和库文件:QTableView,QStandardItemModel,QFileDialog,QXlsx。 2. 创建一个QStandardItemModel模型,并使用QTableView加载模型。 3. 获取TableView的行数和列数。 4. 创建一个QXlsx::Document对象,并指定导出的Excel文件名。 5. 将TableView数据复制到QXlsx::Document。 6. 保存Excel文件。 以下是一个简单的示例代码,用于将TableView导出到Excel: ```cpp #include <QtWidgets/QTableView> #include <QtWidgets/QApplication> #include <QtXlsx> #include <QFileDialog> #include <QStandardItemModel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QTableView tableView; QStandardItemModel model; tableView.setModel(&model); // 设置TableView的列数和行数 model.setColumnCount(3); model.setRowCount(4); // 往TableView插入数据 for(int row=0; row<4; row++) { for(int col=0; col<3; col++) { QModelIndex index = model.index(row, col, QModelIndex()); model.setData(index, QVariant(QString("row%1,col%2").arg(row+1).arg(col+1))); } } // 获取TableView的行数和列数 int rows = model.rowCount(); int cols = model.columnCount(); // 创建QXlsx::Document对象 QXlsx::Document xlsx; // 设置Excel文件名并打开保存对话框 QString fileName = QFileDialog::getSaveFileName(NULL, "Save File", "", "Excel files (*.xlsx)"); if(fileName.isNull()) { return -1; } // 将TableView数据复制到QXlsx::Document for(int row=0; row<rows; row++) { for(int col=0; col<cols; col++) { QModelIndex index = model.index(row, col, QModelIndex()); QString text = model.data(index).toString(); xlsx.write(row+1, col+1, text); } } // 保存Excel文件 xlsx.saveAs(fileName); return a.exec(); } ``` 希望这能对您有所帮助! ### 回答2: 在Qt,我们可以使用QTableView来显示和编辑表格数据。如果我们想将一个QTableView导出到Excel,我们需要将表格数据提取到一个QStandardItemModel,然后将数据写入到Excel文件,这可以通过QXlsx库实现。 首先,我们需要在项目添加QXlsx库。可以在.pro文件添加如下代码: ``` QT += xlsx ``` 然后在代码使用以下方法导出到Excel: ```cpp void MainWindow::exportToExcel() { QStandardItemModel *model = qobject_cast<QStandardItemModel *>(ui->tableView->model()); if (!model) return; QXlsx::Document xlsx; QXlsx::Worksheet *worksheet = xlsx.addWorksheet(); // 将表头写入excel QStringList headerList; for (int i = 0; i < model->columnCount(); i++) { headerList << model->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString(); worksheet->write(1, i + 1, headerList[i]); } // 将数据写入excel for (int row = 0; row < model->rowCount(); row++) { for (int column = 0; column < model->columnCount(); column++) { QModelIndex index = model->index(row, column); QString data = model->data(index, Qt::DisplayRole).toString(); worksheet->write(row + 2, column + 1, data); } } // 保存excel文件 QString fileName = QFileDialog::getSaveFileName(this, tr("Save Excel"), "", tr("Excel Files (*.xlsx)")); if (!fileName.isEmpty()) { xlsx.saveAs(fileName); } } ``` 在以上代码,我们首先将QTableView数据提取到QStandardItemModel。然后使用QXlsx库的Document类创建一个Excel文档,并创建一个Worksheet对象。我们可以使用QStandardItemModel的headerData方法来获取表头,并将表头写入到Excel。 然后,我们遍历QStandardItemModel的所有行和列,使用QStandardItemModel的data方法获取单元格数据,并将其写入到Excel。 最后,我们使用QFileDialog选择一个保存位置和文件名,并将Excel文件保存。 通过以上步骤,我们就可以很容易地将QTableView数据导出到Excel,完成数据的转换和保存。 ### 回答3: Qt是一个广泛使用的跨平台C++应用程序框架,它提供了一个操作系统独立的API,用于编写图形用户界面程序、网络应用程序和数据库应用程序。在Qt,可以使用QtCore和QtGui模块的类来处理Excel文件。 要将QtTableView控件导出到Excel,可以使用QAxObject类,该类允许自动化调用COM组件。使用QAxObject类可以打开、读取、编辑和保存Excel文件。 以下是一些步骤来将TableViewQt导出到Excel: 1.在Qt项目添加QAxObject类的头文件。 #include <QAxObject> 2.使用QAxObject打开Excel应用程序 QApplication app(argc, argv); QAxObject* excel = new QAxObject("Excel.Application", 0); 3.设置Excel应用程序的可见性 excel->setProperty("Visible", true); 4.创建Excel工作簿和工作表 QAxObject* workbooks = excel->querySubObject("Workbooks"); workbooks->dynamicCall("Add"); QAxObject* workbook = excel->querySubObject("ActiveWorkBook"); QAxObject* worksheet = workbook->querySubObject("WorkSheets(int)", 1); 5.将TableView数据写入Excel工作表 QAbstractItemModel* model = tableView->model(); for (int row = 0; row < model->rowCount(); row++) { for (int column = 0; column < model->columnCount(); column++) { QModelIndex index = model->index(row, column); QString data = model->data(index).toString(); QAxObject* cell = worksheet->querySubObject("Cells(int, int)", row + 1, column + 1); cell->setProperty("Value", data); } } 6.保存Excel文件并退出Excel应用程序 workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators("file.xlsx")); workbook->dynamicCall("Close()"); excel->dynamicCall("Quit()"); 通过这些步骤,就可以将TableView控件数据导出到Excel文件。使用QAxObject类可以轻松创建、编辑和保存Excel工作簿,而且可以将TableView数据直接写入Excel工作表。这是一个非常方便的方法,可以将数据TableView导出并使用Excel进行处理和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值