Qt中讀寫Excel

這兩天需要寫一個程序需要將統計結果寫入Excel,搜索了相關資料,這裏做個簡單的記錄:

首先創建一個Qt application工程,記得添加下面這兩個庫:


然後需要添加這個lib:qaxcontainerd.lib,如圖:


頭文件中記得添加這個:

#include <ActiveQt/QAxObject>
以上步驟配置好之後就可以利用Qt對Excel進行讀寫了,下面這些具體的操作是引用自以下博客:http://blog.sina.com.cn/s/blog_a6fb6cc90101gv2p.html


Excel讀取
主要讀取內容:
  • 標題
  • 工作表數目
  • 工作表名稱
  • 起始行
  • 起始列
  • 行數
  • 列數
  • 單元格內容

QAxObject excel("Excel.Application");  
excel.setProperty("Visible", true);  
QAxObject *work_books = excel.querySubObject("WorkBooks");  
work_books->dynamicCall("Open (const QString&)", QString("E:/test.xlsx"));
QVariant title_value = excel.property("Caption");  //獲取標題
qDebug()<<QString("excel title : ")<<title_value;  
QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  
QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可換用WorkSheets

int sheet_count = work_sheets->property("Count").toInt();  //獲取工作表數目
qDebug()<<QString("sheet count : ")<<sheet_count;  
for(int i=1; i<=sheet_count; i++)  
{  
	QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i);  //Sheets(int)也可換用Worksheets(int)
	QString work_sheet_name = work_sheet->property("Name").toString();  //獲取工作表名稱
	QString message = QString("sheet ")+QString::number(i, 10)+ QString(" name");
	qDebug()<<message<<work_sheet_name;  
}
if(sheet_count > 0)
{
	QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);  
	QAxObject *used_range = work_sheet->querySubObject("UsedRange");  
	QAxObject *rows = used_range->querySubObject("Rows");  
	QAxObject *columns = used_range->querySubObject("Columns");  
	int row_start = used_range->property("Row").toInt();  //獲取起始行   
	int column_start = used_range->property("Column").toInt();  //獲取起始列
	int row_count = rows->property("Count").toInt();  //獲取行數
	int column_count = columns->property("Count").toInt();  //獲取列數
	for(int i=row_start; i
	{  
		for(int j=column_start; j
		{  
			QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", i, j);  
			QVariant cell_value = cell->property("Value");  //獲取單元格內容
			QString message = QString("row-")+QString::number(i, 10)+QString("-column-")+QString::number(j, 10)+QString(":");
			qDebug()<<message<<cell_value;  
		}  
	}  
}

Excel增、刪、改
主要操作:
  • 設置標題
  • 插入工作表(至最後一行)
  • 設置工作表名稱
  • 刪除工作表
  • 設置單元格內容
  • 設置單元格字體(類型、大小、加粗、斜體、下劃線、顏色等)
  • 設置單元格對齊方式
  • 設置單元格高度、寬度
  • 設置單元格背景色、邊框色
  • 合併/拆分單元格
  • 清空單元格
代碼如下:
QAxObject excel("Excel.Application");  
excel.setProperty("Visible", true);  
QAxObject *work_books = excel.querySubObject("WorkBooks");  
work_books->dynamicCall("Open(const QString&)", "E:\\test.xlsx");
excel.setProperty("Caption", "Qt Excel");
QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  
QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可換用WorkSheets

//刪除工作表(刪除第一個)
QAxObject *first_sheet = work_sheets->querySubObject("Item(int)", 1);
first_sheet->dynamicCall("delete");

//插入工作表(插入至最後一行)
int sheet_count = work_sheets->property("Count").toInt();  //獲取工作表數目
QAxObject *last_sheet = work_sheets->querySubObject("Item(int)", sheet_count);
QAxObject *work_sheet = work_sheets->querySubObject("Add(QVariant)", last_sheet->asVariant());
last_sheet->dynamicCall("Move(QVariant)", work_sheet->asVariant());

work_sheet->setProperty("Name", "Qt Sheet");  //設置工作表名稱

//操作單元格(第2行第2列)
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2, 2);
cell->setProperty("Value", "Java C++ C# PHP Perl Python Delphi Ruby");  //設置單元格值
cell->setProperty("RowHeight", 50);  //設置單元格行高
cell->setProperty("ColumnWidth", 30);  //設置單元格列寬
cell->setProperty("HorizontalAlignment", -4108); //左對齊(xlLeft):-4131  居中(xlCenter):-4108  右對齊(xlRight):-4152
cell->setProperty("VerticalAlignment", -4108);  //上對齊(xlTop)-4160 居中(xlCenter):-4108  下對齊(xlBottom):-4107
cell->setProperty("WrapText", true);  //內容過多,自動換行
//cell->dynamicCall("ClearContents()");  //清空單元格內容

QAxObject* interior = cell->querySubObject("Interior");
interior->setProperty("Color", QColor(0, 255, 0));   //設置單元格背景色(綠色)

QAxObject* border = cell->querySubObject("Borders"); 
border->setProperty("Color", QColor(0, 0, 255));   //設置單元格邊框色(藍色)

QAxObject *font = cell->querySubObject("Font");  //獲取單元格字體
font->setProperty("Name", QStringLiteral("華文彩雲"));  //設置單元格字體
font->setProperty("Bold", true);  //設置單元格字體加粗
font->setProperty("Size", 20);  //設置單元格字體大小
font->setProperty("Italic", true);  //設置單元格字體斜體
font->setProperty("Underline", 2);  //設置單元格下劃線
font->setProperty("Color", QColor(255, 0, 0));  //設置單元格字體顏色(紅色)

//設置單元格內容,併合並單元格(第5行第3列-第8行第5列)
QAxObject *cell_5_6 = work_sheet->querySubObject("Cells(int,int)", 5, 3);
cell_5_6->setProperty("Value", "Java");  //設置單元格值
QAxObject *cell_8_5 = work_sheet->querySubObject("Cells(int,int)", 8, 5);
cell_8_5->setProperty("Value", "C++");

QString merge_cell;
merge_cell.append(QChar(3 - 1 + 'A'));  //初始列
merge_cell.append(QString::number(5));  //初始行
merge_cell.append(":");
merge_cell.append(QChar(5 - 1 + 'A'));  //終止列
merge_cell.append(QString::number(8));  //終止行
QAxObject *merge_range = work_sheet->querySubObject("Range(const QString&)", merge_cell);
merge_range->setProperty("HorizontalAlignment", -4108);
merge_range->setProperty("VerticalAlignment", -4108);
merge_range->setProperty("WrapText", true);
merge_range->setProperty("MergeCells", true);  //合併單元格
//merge_range->setProperty("MergeCells", false);  //拆分單元格

//work_book->dynamicCall("Save()");  //保存文件(爲了對比test與下面的test2文件,這裏不做保存操作) work_book->dynamicCall("SaveAs(const QString&)", "E:\\test2.xlsx");  //另存爲另一個文件 
work_book->dynamicCall("Close(Boolean)", false);  //關閉文件
excel.dynamicCall("Quit(void)");  //退出


順便記錄一下,在Qt中如果要讓菜單顯示中文方法:QString::fromLocal8Bit("需要顯示的中文");


這裏還有一個小小的問題,在進行Excel讀寫的時候,如果只寫入文件名稱而不是文件的絕對路徑,默認的Excel文件路徑是“我的文檔”,即C:\Users\計算機名\Documents,而我們平時利用C/C++操作文件,如果只使用文件名,默認的文件是當前工程所在目錄。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章