編譯:徐景洲
下載本文的示例源代碼。
簡介
通過本文及支持示例源代碼,可以更加靈活地控制Excel表格文件,包括創建新的Excel文件、寫入表格數據、讀取表格數據(包括準確讀取原Excel文件手動添加的行和列數據)、刪除已有的Excel表格、查詢、插入和替換表格中指定的行、列和單元格,以及將生成的Excel文件轉換為指定分隔符分隔的其他文本格式的文件。以下是用VC6編寫的示例程序的運行效果:
基本想法
基本實現方法和上壹篇文章“直接通過ODBC讀寫Excel電子表格文件”壹樣,都是使用ODBC讀寫Excel電子表格文件作為數據庫文件,所以Excel電子表格文件中寫入的行頭名稱必須是唯壹的(不要重名,相當於數據庫中的ID值)。本文將Excel文件的操作封裝在壹個類CSpreadSheet中,通過這個類我們可以很方便地實現各種Excel表格數據操作,並且可以擴展這個類來滿足自己的需求。
具體實現
壹、包括Excel文件操作類的頭文件
#包含" CSpreadSheet.h "
2.創建壹個新的Excel文件並寫入默認數據。//創建新的Excel文件名和路徑,TestSheet是內部表的名稱。
CSpreadSheet SS("c:\\Test.xls "," test sheet ");
CStringArray sampleArray,testRow
黨衛軍。begin transaction();
//添加標題
樣品陣列。remove all();
樣品陣列。添加(“名稱”);
樣品陣列。Add(“年齡”);
黨衛軍。add headers(sample array);
//添加數據
CString strName[] = { "徐景洲"、"徐智慧"、"郭輝"、"牛英俊"、"朱曉鵬" };
CString strAge[] = {"27 "," 23 "," 28 "," 27 "," 26 " };
for(int I = 0;我& ltsizeof(strName)/sizeof(CString);i++)
{
樣品陣列。remove all();
樣品陣列。add(strName[I]);
樣品陣列。add(strAge[I]);
黨衛軍。AddRow(sample array);
}
黨衛軍。commit();
三、讀取Excel文件數據cspreadsheetss(" C:\ \ test . xls ","測試表");
CStringArray行,列。
//清空列表框
m_AccessList。reset content();
for(int I = 1;我& lt= SS。GetTotalRows();i++)
{
//讀取壹行
黨衛軍。ReadRow(Rows,I);
CString strContents =
for(int j = 1;j & lt=行。GetSize();j++)
{
如果(j == 1)
strContents = Rows。GetAt(j-1);
其他
strContents = strContents + " ->+行。GetAt(j-1);
}
m_AccessList。AddString(str contents);
}
4.添加、插入、替換已有的Excel表格數據//初始化測試行數據,演示添加、插入、替換數據的操作。
for(int k = 1;k & lt= 2;k++)
{
testRow。add(" Test ");
}
黨衛軍。AddRow(testRow);//添加到尾部
黨衛軍。AddRow(testRow,2);//在第二行插入壹個新行
黨衛軍。AddRow(testRow,6,true);//用新內容替換原來的第四行。
黨衛軍。AddCell("徐景洲",1,2);//添加(不存在)或替換(存在)第二行第壹列的單元格內容
黨衛軍。commit();
5.查詢行、列、單元格中已有的Excel表格數據void CExcelAccessDlg::OnQuery()。
{
CSpreadSheet SS("c:\\Test.xls "," test sheet ");
CStringArray行,列。
CString tempString =
update data();
if(m _ strRow = = " " & amp;& ampM_strColumn == "") //查詢為空。
{
AfxMessageBox("行號和列號不能同時為空!");
返回;
}
else if(m _ strRow = = " " & amp;& ampm_strColumn!= " ")//查詢指定的列數據
{
int I column = atoi(m _ str column);
int iCols = SS。GetTotalColumns();
if(I column & gt;ICols) //超出表範圍查詢時
{
CString字符串;
海峽。Format("表中總列數為:%d,",iCols);
AfxMessageBox(str+"查詢列數大於Excel表格的總列數,請重新輸入!");
返回;
}
//讀取壹列數據,按行讀出。
如果(!黨衛軍。ReadColumn(Column,iColumn))
{
AfxMessageBox(不銹鋼。GetLastError());
返回;
}
CString tmpStr
for(int I = 0;我& lt專欄。GetSize();i++)
{
TmpStr。Format("行號:%d,列號:%d,內容:% s \ n ",I+1,I列,column . getat(I));
tempString+= tmp str;
}
AfxMessageBox(tempString);
}
else if(m_strRow!= " " & amp& ampM_strColumn == "") //查詢指定行數的數據。
{
int iRow = atoi(m _ strRow);
int iRows = SS。GetTotalRows();
if(iRow & gt;IRows) //超出表範圍查詢時
{
CString字符串;
海峽。Format("表中的總行數是:%d,",I rows);
AfxMessageBox(str+"查詢行數大於Excel表格的總行數,請重新輸入!");
返回;
}
//讀取指定的行數據
如果(!黨衛軍。ReadRow(Rows,iRow))
{
AfxMessageBox(不銹鋼。GetLastError());
返回;
}
CString tmpStr
for(int I = 0;我& lt行。GetSize();i++)
{
TmpStr。Format("行號:%d,列號:%d,內容:% s \ n ",arrow,I+1,rows . getat(I));
tempString+= tmp str;
}
AfxMessageBox(tempString);
}
else if(m_strRow!= " " & amp& ampm_strColumn!= " ")//查詢指定的單元格數據
{
int iRow = atoi(m_strRow),I column = atoi(m _ str column);
int iRows = SS。GetTotalRows(),iCols = SS。GetTotalColumns();
if(I column & gt;ICols) //超出表範圍查詢時
{
CString字符串;
海峽。Format("表中總列數為:%d,",iCols);
AfxMessageBox(str+"查詢列數大於Excel表格的總列數,請重新輸入!");
返回;
}
else if(iRow & gt;iRows)
{
CString字符串;
海峽。Format("表中的總行數是:%d,",I rows);
AfxMessageBox(str+"查詢行數大於Excel表格的總行數,請重新輸入!");
返回;
}
//讀取指定行和列的單元格數據。
如果(!黨衛軍。ReadCell(tempString,iColumn,iRow))
{
AfxMessageBox(不銹鋼。GetLastError());
返回;
}
CString字符串;
海峽。Format("行號:%d,列號:%d,內容:%s ",iRow,iColumn,tempString);
AfxMessageBox(str);
}
}
6.將現有的Excel轉換保存為指定的分隔文本文件//將原始Excel文件轉換為分號分隔的文本,並以相同的名稱保存為文本文件。
黨衛軍。轉換(";");
七、刪除表SS。在Excel中刪除工作表();//刪除Excel文件中的所有表格。
黨衛軍。delete sheet(" test sheet ");//刪除Excel中的TextSheet表。
八、在Excel中獲取行、列和當前行的總數inti ols = ss . gettotalcolumns();//總列數
int iRows = SS。GetTotalRows();//總行數
int iCurRow = SS。GetCurrentRow();//當前行號
9、獲取行頭數據cstringarrerowheader
黨衛軍。getfield names(row header);
CString tmpStr
for(int I = 0;我& lt行標題。GetSize();i++)
{
TmpStr。Format("行號:%d,列號:%d,內容:% s \ n ",1,I+1,row header . getat(I));
tempString+= tmp str;
}
AfxMessageBox(tempString);
最後,如果想了解詳細的實現細節,可以在下載完示例源代碼(有詳細註釋)後仔細查看源代碼。
參考資料:
直接通過ODBC讀寫Excel表格文件-徐景洲(譯)
壹個讀寫Excel和文本分隔的電子表格的類