由于需要對Excel表格進行操作,在網上找了這個類。用odbc來實現的,具體的使用步驟基本上如下:CStringArray tempStrArray;CSPReadSheet ss(FileName, "LABLE", FALSE);ss.BeginTransaction();tempStrArray.RemoveAll();tempStrArray.Add("Item");tempStrArray.Add("Mac Number");tempStrArray.Add("RFPI Number");tempStrArray.Add("Serial Number");tempStrArray.Add("PCBA Serial Number");ss.AddHeaders(tempStrArray);tempStrArray.RemoveAll();tempStrArray.Add(m_strBaseSerialNo);tempStrArray.Add(m_strBaseSerialNo);tempStrArray.Add(m_strBaseMacNo);tempStrArray.Add(m_strHS_1_RN);tempStrArray.Add(m_strHS_2_RN);SS.AddRow(tempStrArray);SS.Commit();先添加表頭,然后再添加行,具體的控制細節可以看各函數的實現代碼。網上資料說這個類用odbc來實現對excel的操作,速度慢。而且這個類會把所有的輸入都當做為字符串來處理,所以生成的單元格的內容前面都被excel強制加了個單引號前綴"'"。這是它的缺點,但總的來說,我覺得這個類還是比較好用的,就看自己的需求了。說說遇到并解決的幾個問題:1.就是要在頭文件中包含預編譯頭文件#include "stdafx.h"這個依據具體的工程設置而定。2.在初始化一個excel文件的時候,表名里面不能有數字,例如不能為BS-2482.要不然的話只能添加表頭,不能添加新行。現在還不知道具體原因是什么,但是大概調試看到好像是提交SQL語句的時候應該對那些數字做一定的處理。另外,再轉一篇中文文檔。CSpreadSheet中文文檔http://www.codeproject.com/info/Licenses.aspx簡介CSpreadSheet是一個C++編寫的Excel讀寫控件,當我們希望輸出Excel文件或以文本文件分隔 以Tab分隔的文件時, CSpreadSheet能使我們的工作事半功倍.該控件能方便我們讀寫此類文件,以對象的形式供我們使用.主要特征創建Excel文件或文本特征文件.,寫入多行或單行.讀取多行,列,一行從Excel文件或文本特征文件.替代、插入、追加到Excel文件或文本特征文件.轉換已存在或最近打開的Excel文件或文本特征文件.限制該控件需要MFC(微軟基礎類庫)支持.未測試是否支持Unicode編碼.控件以ODBC讀寫Excel文件,需要ODBC驅動程序.Excel文件必須列標記.且首行列標記唯一(字段).禁止刪除工作簿,僅允許刪除工作簿內容.列值類型參照程序數據類型.不采用Excel格式.一,如何使用此類?常用函數:CSpreadSheet(CString File, CString SheetOrSeparator, bool Backup = true)bool AddHeaders(CStringArray &FieldNames, bool replace = false)bool AddRow(CStringArray &RowValues, long row = 0, bool replace = false)bool AddCell(CString CellValue, short column, long row = 0)bool AddCell(CString CellValue, CString column, long row = 0,bool Auto=true)bool ReadRow(CStringArray &RowValues, long row = 0)bool ReadColumn(CStringArray &ColumnValues, short column)bool ReadColumn(CStringArray &ColumnValues, CString column,bool Auto = true)bool ReadCell (CString &CellValue, short column, long row = 0)bool ReadCell (CString &CellValue,CString column,long row=0,bool Auto=true)bool DeleteSheet()bool DeleteSheet(CString SheetName)bool Convert(CString SheetOrSeparator)void BeginTransaction()bool Commit()bool RollBack()bool GetTransactionStatus()void GetFieldNames (CStringArray &FieldNames)long GetTotalRows()short GetTotalColumns()long GetCurrentRow()bool GetBackupStatus()CString GetLastError()Excel特定函數:bool ReplaceRows(CStringArray &NewRowValues, CStringArray &OldRowValues) 文本函數:尚無.函數介紹:CSpreadSheet(CString File, CString SheetOrSeparator, bool Backup = true)該構造函數將打開Excel(xls)文件或其他制定工作簿的文件以供讀寫.創建一個CSpreadSheet對象.參數:File: 文件路徑,可以是絕對路徑或相對路徑,如果文件不存在將創建一個文件.SheetOrSeparator 工作簿名.Backup 制定是否備份文件,默認未備份文件,如果文件存在,將創建一個名為CSpreadSheetBackup 的備份文件.bool AddHeaders(CStringArray &FieldNames, bool replace = false)該函數將在打開的工作簿的首行添加一個頭(字段).對于Excel,每列字段必須唯一.對于特定特征的文本文件沒有限制.對于一個打開的工作簿文件,默認將添加一列,如果設置replace=true 將替代存在的字段值.該函數返回一個Bool類型的值.對于Excel,該函數需在添加任意行之前調用.對于特定特征的文本文件,該函數可選.參數:FieldNames 字段名數組.Replace 如字段存在,該參數將決定是否替代原有字段.bool AddRow(CStringArray &RowValues, long row = 0, bool replace = false)該函數將追加、插入或替代一行到已經打開的文檔,默認追加到行的尾部.替代將以變量的值而定,新的一行將插入或替代到指定的行.參數:RowValues 行值Row 行編號,如果Row=1 第一行.即字段行.Replace 如果該行存在,指示是否替代原有行.bool AddCell(CString CellValue, short column, long row = 0)bool AddCell(CString CellValue, CString column, long row = 0,bool Auto=true)添加或替代一個打開的工作簿中的單元格,默認為該行的最后一個單元格.返回一個Bool類型的值(狀態);參數:CellValue 填充的單元格的值。Column 列編號column 列名Row 含編號,如果Row=1 第一行,即字段行.Auto 是否讓函數自動判斷自動判斷字段.bool ReadRow(CStringArray &RowValues, long row = 0)從打開的工作簿中讀取一行,默認讀取下一行,如果你沒有使用連接池,連續運行兩次,則第一次讀取第一行,第二次讀取第二行.返回一個Bool類型的值(狀態);參數:RowValues 用于存儲讀取到的值。Row 行編號.默認為第一行.bool ReadColumn(CStringArray &ColumnValues, short column)bool ReadColumn(CStringArray &ColumnValues, CString column,bool Auto = true)從打開的工作簿中讀取一列.返回一個Bool類型的值(狀態);參數:Short column 列編號CString column 列名或字段名.Columnvalues 存儲讀取到的值.Auto 設置函數自動掃描列名或字段.bool ReadCell (CString &CellValue, short column, long row = 0)bool ReadCell (CString &CellValue,CString column,long row=0,bool Auto=true)從打開的工作簿中讀取一個單元格的值。默認讀取下一行.返回一個Bool類型的值(狀態);參數:CellValue 存儲單元格的值.Short column 列編號.Row 行編號CString column 列名Auto 設置函數自動掃描列名或字段.bool DeleteSheet()從打開的文檔中刪除所有的工作簿內容.返回一個Bool類型的值(狀態);bool DeleteSheet(CString SheetName)從打開的文檔中刪除指定工作簿名的工作簿內容.返回一個Bool類型的值(狀態);參數:SheetName 工作簿名.e.G Sheet1bool Convert(CString SheetOrSeparator)將Excel(xls)文件轉換為特定特征的文本文件(.csv)或將特定特征的文本文件(.csv)轉換為Excel(xls)文件.如果將特定特征的文本文件(.csv)轉換為Excel(xls)文件SheetOrSeparator將不會被使用.返回一個Bool類型的值(狀態);參數:SheetOrSeparator 特征樣式.void BeginTransaction()bool Commit()bool Commit()與SQL語言函數,函數相似,BeginTransaction開始事務,Commit提交事務.RoolBack回滾至保存點.Commit Commit將返回一個Bool值來表示是否成功.bool GetTransactionStatus()查詢事務的狀態,如果為true 表明已經開始,false表明沒有開始或已經結束.void GetFieldNames (CStringArray &FieldNames)返回一個工作簿中的字段數組.參數:FieldNames 存儲字段名的數組.long GetTotalRows()獲得工作簿中行數.返回行數.short GetTotalColumns()獲得工作簿中列數.返回列數.long GetCurrentRow()獲得已選擇的當前行的行號.返回行號,當前行將調用默認的ReadRow函數.bool GetBackupStatus()獲得備份執行情況,true 已經執行,false沒有執行(用戶選擇)或執行錯誤.CString GetLastError()返回最后一次錯誤信息.Excel特定函數:bool ReplaceRows(CStringArray &NewRowValues, CStringArray &OldRowValues)該函數將搜索且代替多次執行的值.不支持已經回滾或釋放的文檔.執行完將返回執行的狀態.參數:NewRowValues 新的值,即更新的值.OldRowValues 原有的值,即已經存在的值.示例:// Create a new Excel spreadsheet, filename is test.xls, sheetname is TestSheetCSpreadSheet SS("Test.xls", "TestSheet");// Fill a sample 5 by 5 sheetCStringArray sampleArray, testRow, Rows, Column;CString tempString;char alphabet = 'A';SS.BeginTransaction();for (int i = 1; i <= 5; i++){sampleArray.RemoveAll();for (int j = 1; j <= 5; j++){tempString.Format("%c%d", alphabet++, i);sampleArray.Add(tempString);}alphabet = 'A';if (i == 1) // Add header rows{SS.AddHeaders(sampleArray);}else // Add data rows{SS.AddRow(sampleArray);}}// Set up test row for appending, inserting and replacingfor (int k = 1; k <= 5; k++){testRow.Add("Test");}SS.AddRow(testRow); // append test row to spreadsheetSS.AddRow(testRow, 2); // insert test row into second row of spreadsheetSS.AddRow(testRow, 4, true); // replace fourth row of spreadsheet with test rowSS.Committ();SS.Convert(";"); // convert Excel spreadsheet into text delimited format // with ; as separator// print out total number of rowsprintf("Total number of rows = %d/n/n", SS.GetTotalRows()); // Print out entire spreadsheetfor (i = 1; i <= SS.GetTotalRows(); i++){// Read rowSS.ReadRow(Rows, i);for (int j = 1; j <= Rows.GetSize(); j++){if (j != Rows.GetSize()){printf("%s/t", Rows.GetAt(j-1));}else{printf("%s/n", Rows.GetAt(j-1));}}}// print out total number of columnsprintf("/nTotal number of columns = %d/n/n", SS.GetTotalColumns());// Read and print out contents of second column of spreadsheetSS.ReadColumn(Column, 2);for (i = 0; i < Column.GetSize(); i++){printf("Column 2 row %d: %s/n", i+1, Column.GetAt(i));}// Read in and print out the cell value at column 3, row 3 of spreadsheetif (SS.ReadCell(tempString, 3, 3)){printf("/nCell value at (3,3): %s/n", tempString);}else{// print out error message if cell value cannot be readprintf("Error: %s/n", SS.GetLastError); }
FROM:http://blog.csdn.net/xautfengzi/archive/2009/09/03/4516101.aspx
參考文獻:
http://www.codeproject.com/KB/database/cspreadsheet.aspx
新聞熱點
疑難解答