首页 > 学院 > 开发设计 > 正文

CSpreedSheet操作EXCEL的函数详解

2019-11-08 02:22:26
字体:
来源:转载
供稿:网友

由于需要对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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表