【轉】C++操作Excel表格

通過本文包括創建新Excel文件、寫入表格數據、讀取表格數據(包括對原建 Excel文件自已手工添加的行、列數據的準確讀取),刪除已有Excel表格,對錶格中指定行、列、單元格進行查詢、插入、替換等操作,同時還可以將生 成的Excel文件轉換爲按指定分隔符分隔的其它文本格式的文件。下面是把此方法用VC6編寫的示例程序運行效果:

基本思路
通過ODBC來把Excel表格文件當成數據庫文件來 進行讀、寫等操作,所以在Excel表格文件中寫入的行頭名必須是唯一的(不要重名,相當於數據庫中的ID值)。本文中對Excel文件的操作都被封裝進 一個類CSpreadSheet中,通過它我們可以非常簡便的實現各種Excel表格數據操作,並且可以對該類進行擴充來滿足自己的需求。

具體實現

一、 包含Excel文件操作類頭文件

#include "CSpreadSheet.h"

二、 新建Excel文件,並寫入默認數據

// 新建Excel文件名及路徑,TestSheet爲內部表名
CSpreadSheet SS("c://Test.xls", "TestSheet");

CStringArray sampleArray, testRow;

SS.BeginTransaction();

// 加入標題
sampleArray.RemoveAll();
sampleArray.Add("姓名");
sampleArray.Add("年齡");
SS.AddHeaders(sampleArray);

// 加入數據
CString strName[] = {"徐景周","徐志慧","郭徽","牛英俊","朱小鵬"};
CString strAge[]  = {"27","23","28","27","26"};
for(int i = 0; i < sizeof(strName)/sizeof(CString); i++)
{
	sampleArray.RemoveAll();
	sampleArray.Add(strName[i]);
	sampleArray.Add(strAge[i]);
	SS.AddRow(sampleArray);
}

SS.Commit();

三、 讀取Excel文件數據

CSpreadSheet SS("c://Test.xls", "TestSheet");

CStringArray Rows, Column;

//清空列表框
m_AccessList.ResetContent();
for (int i = 1; i <= SS.GetTotalRows(); i++)
{
	// 讀取一行
	SS.ReadRow(Rows, i);
	CString strContents = "";
	for (int j = 1; j <= Rows.GetSize(); j++)
	{
		if(j == 1)
			strContents = Rows.GetAt(j-1);
		else
			strContents = strContents +  " --> " + Rows.GetAt(j-1);
	}

	m_AccessList.AddString(strContents);
}

四、 對已存在Excel表格數據進行添加、插入、替換操作

// 初始化測試行數據,進行添加、插入及替換數據操作演示
for (int k = 1; k <= 2; k++)
{
	testRow.Add("Test");
}

SS.AddRow(testRow);		// 添加到尾部
SS.AddRow(testRow, 2);		// 插入新行到第二行
SS.AddRow(testRow, 6, true);	// 替換原第四行來新的內容
SS.AddCell("徐景周", 1,2);    // 添加(不存在)或替換(存在)第二行,第一列單元格內容

SS.Commit();

五、 對已存在Excel表格數據進行行、列、單元格查詢

void CExcelAccessDlg::OnQuery()
{
	CSpreadSheet SS("c://Test.xls", "TestSheet");

	CStringArray Rows, Column;
	CString tempString = "";

	UpdateData();

	if(m_strRow == "" && m_strColumn == "")         // 查詢爲空
	{
		AfxMessageBox("行號、列號不能同時爲空!");
		return;
	}
	else if(m_strRow == "" && m_strColumn != "")    // 查詢指定列數據
	{
		int iColumn = atoi(m_strColumn);
		int iCols = SS.GetTotalColumns();
		if(iColumn > iCols)	// 超出表範圍查詢時
		{
			CString str;
			str.Format("表中總列數爲: %d, ", iCols);
			AfxMessageBox(str + " 查詢列數大於Excel表中總列數,請重新輸入!");
			return;
		}

		// 讀取一列數據,並按行讀出
		if(!SS.ReadColumn(Column, iColumn))
		{
			AfxMessageBox(SS.GetLastError());
			return;
		}

		CString tmpStr;
		for (int i = 0; i < Column.GetSize(); i++)
		{
			tmpStr.Format("行號: %d, 列號: %d ,內容: %s/n", i+1,iColumn,Column.GetAt(i));
			tempString += tmpStr;
		}

		AfxMessageBox(tempString);
	}
	else if(m_strRow != "" && m_strColumn == "")     // 查詢指定行數數據
	{
		int iRow = atoi(m_strRow);
		int iRows = SS.GetTotalRows();

		if(iRow > iRows)	// 超出表範圍查詢時
		{
			CString str;
			str.Format("表中總行數爲: %d, ", iRows);
			AfxMessageBox(str + " 查詢行數大於Excel表中總行數,請重新輸入!");
			return;
		}

		// 讀取指定行數據
		if(!SS.ReadRow(Rows, iRow))
		{
			AfxMessageBox(SS.GetLastError());
			return;
		}

		CString tmpStr;
		for (int i = 0; i < Rows.GetSize(); i++)
		{
			tmpStr.Format("行號: %d, 列號: %d ,內容: %s/n", iRow, i+1, Rows.GetAt(i));
			tempString += tmpStr;
		}

		AfxMessageBox(tempString);
	}
	else if(m_strRow != "" && m_strColumn != "")     // 查詢指定單元格數據
	{
		int iRow = atoi(m_strRow), iColumn = atoi(m_strColumn);
		int iRows = SS.GetTotalRows(), iCols = SS.GetTotalColumns(); 

		if(iColumn > iCols)             // 超出表範圍查詢時
		{
			CString str;
			str.Format("表中總列數爲: %d, ", iCols);
			AfxMessageBox(str + " 查詢列數大於Excel表中總列數,請重新輸入!");
			return;
		}
		else if(iRow > iRows)
		{
			CString str;
			str.Format("表中總行數爲: %d, ", iRows);
			AfxMessageBox(str + " 查詢行數大於Excel表中總行數,請重新輸入!");
			return;
		}

		// 讀取指定行、列單元格數據
		if(!SS.ReadCell(tempString, iColumn, iRow))
		{
			AfxMessageBox(SS.GetLastError());
			return;
		}

		CString str;
		str.Format("行號: %d, 列號: %d ,內容: %s", iRow,iColumn,tempString);
		AfxMessageBox(str);
	}

}

六、 將存在的Excel轉換另存爲指定分隔的文本文件

// 將原Excel文件轉換爲用分號分隔的文本,並另存爲同名文本文件
SS.Convert(";");

七、 刪除Excel中表格

SS. DeleteSheet();            // 刪除Excel文件中所有表格
SS. DeleteSheet(" TestSheet ");  // 刪除Excel中TextSheet表格

八、 獲取Excel中總行數、總列數、當前行

int iCols = SS.GetTotalColumns();   // 總列數
int iRows = SS.GetTotalRows();    // 總行數
int iCurRow = SS.GetCurrentRow(); // 當前所在行號

九、 獲取行頭數據

CStringArray rowHeader;
SS.GetFieldNames(rowHeader);
CString tmpStr;
for (int i = 0; i < rowHeader.GetSize(); i++)
{
		tmpStr.Format("行號: %d, 列號: %d ,內容: %s/n", 1, i+1, rowHeader.GetAt(i));
		tempString += tmpStr;
}
AfxMessageBox(tempString);

參考文獻:
直接通過ODBC讀、寫Excel表格文件 – 徐景周(譯)
A Class to Read and Write to Excel and Text Delimited Spreadsheet – Yap Chun Wei

轉自:http://www.vckbase.com/document/viewdoc/?id=693


 

點點的樂園原創文章,轉載請註明來源並保留原文鏈接

本文鏈接:http://www.33vc.com/?p=1994

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