1. 程式人生 > >Qt 中讀寫Excel

Qt 中讀寫Excel

開發時,需要將資料寫入到excel中,做成一個報表,以便於檢視,網上看了很多的例子,自己也仿照著寫了個。

首先需要安裝qtxlslwriter 這個庫,下載地址:

環境的搭建這兒不細說,需要的可以網上找,有很多。

主要做的是讀和寫,方便檢視。

實現的是寫的功能,具體程式碼如下:

Qt版本為:Qt5.5.1MSVC2010

寫入excel

void c_excel::Slot_Write_Excel_File()
{
	QXlsx::Document xlsx;
	QXlsx::Format format;   
	format.setHorizontalAlignment(QXlsx::Format::AlignHCenter);
	format.setVerticalAlignment(QXlsx::Format::AlignVCenter);
	xlsx.setColumnWidth(3,60);
	xlsx.write("A1",tr("Device"),format);
	xlsx.write("B1",tr("State"),format);
	xlsx.write("C1",tr("Question"),format);
	xlsx.write("D1",tr("Time"),format);

	int nCount = EXCEL_COUNT;
	static int gnCount = 0;
	for (int i = 0; i < nCount; i++)
	{
		char buff[100];
		memset(buff,0,sizeof(buff));
		sprintf(buff,"IPC%d",++ gnCount);
		xlsx.write(i+2,1,buff,format);
		memset(buff,0,sizeof(buff));
		sprintf(buff,"State: %d",gnCount);
		xlsx.write(i+2,2,buff,format);
		memset(buff,0,sizeof(buff));

		sprintf(buff,"1111111111111111111111111111Question: %d",gnCount);
		xlsx.write(i+2,3,buff,format);
		memset(buff,0,sizeof(buff));
		sprintf(buff,"111111111111111111Time: %d",gnCount);
		xlsx.write(i+2,4,buff,format);

	}
	// 新增Sheet頁面
	xlsx.addSheet();
	xlsx.addSheet();
	xlsx.selectSheet("Sheet2"); // 選擇操作頁面
	for (int i = 0; i < nCount; i++)
	{
		char buff[100];
		memset(buff,0,sizeof(buff));
		sprintf(buff,"IPC%d",++ gnCount);
		xlsx.write(i+2,1,buff,format);
		memset(buff,0,sizeof(buff));
		sprintf(buff,"State: %d",gnCount);
		xlsx.write(i+2,2,buff,format);
		memset(buff,0,sizeof(buff));

		sprintf(buff,"1111111111111111111111111111Question: %d",gnCount);
		xlsx.write(i+2,3,buff,format);
		memset(buff,0,sizeof(buff));
		sprintf(buff,"111111111111111111Time: %d",gnCount);
		xlsx.write(i+2,4,buff,format);

	}
	bool bret = xlsx.saveAs(m_qstrfilename);
	QXlsx::Document xlsx2(m_qstrfilename);/*複製A到B*/
	xlsx2.saveAs("B.xlsx");
	if (bret)
	{
		emit signal_save_success();
	}
}

讀取excel

void c_excel::Slot_Read_Excel_File()
{
	QXlsx::Document xlsx(m_qstrfilename);
	QXlsx::CellRange range = xlsx.dimension();
	int nrow = range.lastRow();
	//int ncol = range.lastColumn();

	for (int i = 0; i < nrow - 1; i++)
	{
		QString qstrip = xlsx.read(i+2,1).toString();
		QString qstrrtsp1 = xlsx.read(i+2,2).toString();
		QString qstrrtsp2 = xlsx.read(i+2,3).toString();
		QString qstruser = xlsx.read(i+2,4).toString();

		if (qstrip.isEmpty())
		{
			continue;
		}

	}
}
widget.cpp
#include "widget.h"

Widget::Widget(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	m_excel = new c_excel;
	m_excel->moveToThread(&m_thread);
	connect(ui.readBtn,SIGNAL(clicked()),m_excel,SLOT(Slot_Read_Excel_File()));
	//connect(ui.writeBtn,SIGNAL(clicked()),m_excel,SLOT(Slot_Write_Excel_File()));
	connect(ui.writeBtn,SIGNAL(clicked()),this,SLOT(Slot_Set_File_Name()));
	
	m_thread.start();
}

Widget::~Widget()
{
	m_thread.quit();
	m_thread.wait();
}

void Widget::Slot_Set_File_Name()
{
	QString fileName = QFileDialog::getSaveFileName(NULL, tr("Excel file"),".",tr("Excel Files (*.xlsx)"));
	m_excel->SetFileName(fileName);
}

編譯好的QtXlsx庫下載地址:點選開啟連結