链接:
http://www.codeproject.com/Articles/13852/BasicExcel-A-Class-to-Read-and-Write-to-Microsoft
参考:
OpenOffice's Excel file format (
http://sc.openoffice.org/excelfileformat.pdf
)
一个用STL C++写的读写Excel文件的类,是CSpreadSheet作者封装的,与CSpreadSheet的区别:不依赖
ODBC,而CSpreadSheet依赖ODBC,需要MFC库的支持,不能跨平台。
BasicExcel的限制:
1)不支持格式化;
2)不支持公式;
3)不支持图表;
4)不支持
Unicode UTF-32;
5)中文支持不好;
class BasicExcel
void New(int sheets=3)
创建一个新工作薄,默认3张工作表
bool Load(const char* filename)
载入一个已存在的工作薄文件
bool Save()
保存当前工作薄到已载入文件
bool SaveAs(const char* filename)
保存当前工作薄到一个新文件
size_t GetTotalWorkSheets()
获取当前工作薄的工作表数目
BasicExcelWorksheet* GetWorksheet(size_t sheetIndex)
BasicExcelWorksheet* GetWorksheet(const char* name)
BasicExcelWorksheet* GetWorksheet(const wchar_t* name)
获取指定索引的工作表对象,索引从0开始,索引无效则返回值为NULL
获取指定名称的工作表对象,名称无效则返回值为NULL
BasicExcelWorksheet* AddWorksheet(int sheetIndex=-1)
BasicExcelWorksheet* AddWorksheet(const char* name, int sheetIndex=-1)
BasicExcelWorksheet* AddWorksheet(const wchar_t* name, int sheetIndex=-1)
添加指定索引的工作表,名称默认为SheetX,X从1开始,如果sheetIndex==-1,则默认添加到最后一个位置
添加指定名称和索引的工作表,
如果sheetIndex==-1,则默认添加到最后一个位置
bool DeleteWorksheet(size_t sheetIndex)
bool DeleteWorksheet(const char* name)
bool DeleteWorksheet(const wchar_t* name)
删除指定索引或名称的工作表
char* GetAnsiSheetName(size_t sheetIndex)
wchar_t* GetUnicodeSheetName(size_t sheetIndex)
bool GetSheetName(size_t sheetIndex, char* name)
bool GetSheetName(size_t sheetIndex, wchar_t* name)
获取指定索引的工作表名称
bool RenameWorksheet(size_t sheetIndex, const char* to)
bool RenameWorksheet(size_t sheetIndex, const wchar_t* to)
bool RenameWorksheet(const char* from, const char* to)
bool RenameWorksheet(const wchar_t* from, const wchar_t* to)
重命名指定索引或名称的工作表
class BasicExcelWorksheet
char* GetAnsiSheetName()
wchar_t* GetUnicodeSheetName()
bool GetSheetName(char* name)
bool GetSheetName(wchar_t* name)
获取当前工作表的名称
bool Rename(const char* to)
bool Rename(const wchar_t* to)
重命名当前工作表
void Print(ostream& os, char delimiter=',', char textQualifier='\0')
输出整张工作表到指定输出流,指定列分隔字符和文本限定符
指定列分隔符为','和文本限定符为'\"',该函数可以用来保存当前工作表为CSV格式
size_t GetTotalRows()
获取当前工作表的总行数
size_t GetTotalCols()
获取当前工作表的总列数
BasicExcelCell* Cell(size_t row, size_t col)
获取指定行、列的单元格对象,行、列值从0开始,如果行值超过65535或者列值超过255则返回NULL
bool EraseCell(size_t row, size_t col)
清空指定行、列的单元格对象的内容
class BasicExcelCell
int Type() const
获取单元格值类型,包括以下值:
UNDEFINED
,
INT
,
DOUBLE
,
STRING
,
WSTRING
bool Get(int& val) const
bool Get(double& val) const
bool Get(char* str) const
bool Get(wchar_t* str) const
从当前单元格获取指定类型的内容
size_t GetStringLength()
获取当前单元格字符串长度
int GetInteger() const
double GetDouble() const
const char* GetString() const
const wchar_t* GetWString() const
从当前单元格获取指定类型的内容
ostream& operator<<(ostream& os, const BasicExcelCell& cell)
输出当前单元格内容到输出流中
void Set(int val)
void Set(double val)
void Set(const char* str)
void Set(const wchar_t* str)
输出指定格式的内容到当前单元格
void SetInteger(int val)
void SetDouble(double val)
void SetString(const char* str)
void SetWString(const wchar_t* str)
输出指定格式的内容到当前单元格
void EraseContents()
清空当前单元格的内容
示例代码:在Qt线程中递归遍历文件夹中文件后将文件名和文件大小写入Excel表格
main.cpp
1 #include <QtCore/QCoreApplication>
2 #include
"mythread.h"
3
4 int main(
int argc,
char *
argv[])
5 {
6 QCoreApplication a(argc, argv);
7
8 MyThread mythread;
9 mythread.setCurrentDirectory(QString(
"C:/Program Files/360"));
10 mythread.setStart();
11
12 return a.exec();
13 }
mythread.h
1 #ifndef MY_THREAD_H
2 #define MY_THREAD_H
3
4
5 #include <QThread>
6 #include <QMutex>
7 #include <QWaitCondition>
8
9 #include
"BasicExcel.h"
10
11 using namespace YExcel;
12
13 class MyThread :
public QThread
14 {
15 Q_OBJECT
16
17 public:
18 MyThread();
19 ~
MyThread();
20
21 void setStart();
22 void setCurrentDirectory(QString strCurrentDirectory);
23 void recursiveTraverseDir(QString dirString);
24
25 protected:
26 void run();
27
28
29 private:
30 void ExportToExcel();
31
32 private:
33 bool bRunning;
34 QWaitCondition waitRunning;
35 QMutex mutex;
36
37 QString strCurrentDirectory;
38 QString strFileName;
39 int iFileSize;
40
41 BasicExcel beObject;
42 BasicExcelWorksheet*
bewCurrentSheet;
43 BasicExcelCell*
becCurrentCell;
44 char strCurrentSheet[
8];
45 int iCurrentRow;
46 int iSheetIndex;
47 };
48
49 #endif // MY_THREAD_H
mythread.cpp
1 #include <QDir>
2 #include <QFileInfo>
3 #include <Qt>
4 #include <QtGlobal>
5 #include <QtCore/qmath.h>
6 #include
"mythread.h"
7
8 MyThread::MyThread()
9 {
10 bRunning =
false;
11
12 beObject.New();
13 bewCurrentSheet = beObject.GetWorksheet(
"Sheet1");
14 iCurrentRow =
0;
15 iSheetIndex =
1;
16
17 start();
18 }
19
20 MyThread::~
MyThread()
21 {
22 wait();
23 }
24
25 void MyThread::setStart()
26 {
27 QMutexLocker locker(&
mutex);
28 this->bRunning =
true;
29 waitRunning.wakeOne();
30 }
31
32 void MyThread::setCurrentDirectory(QString strCurrentDirectory)
33 {
34 QMutexLocker locker(&
mutex);
35 this->strCurrentDirectory =
strCurrentDirectory;
36 }
37
38 void MyThread::run()
39 {
40 forever
41 {
42 {
43 QMutexLocker locker(&
mutex);
44 if(!
bRunning)
45 {
46 waitRunning.wait(&
mutex);
47 }
48 }
49
50 recursiveTraverseDir(strCurrentDirectory);
51 beObject.SaveAs(
"example.xls");
52
53 {
54 QMutexLocker locker(&
mutex);
55 if(bRunning)
56 {
57 bRunning =
false;
58 }
59 }
60 }
61
62 }
63
64 void MyThread::recursiveTraverseDir(QString dirString)
65 {
66 QDir dir(dirString);
67 if (!
dir.exists())
68 {
69 return;
70 }
71
72 dir.setFilter(QDir::Dirs |
QDir::Files);
73 dir.setSorting(QDir::DirsFirst);
74
75 QFileInfoList fileInfolist =
dir.entryInfoList();
76
77 int i =
0;
78 bool bIsDir;
79 QFileInfo fileInfo;
80
81 do{
82 fileInfo =
fileInfolist.at(i);
83 if(fileInfo.fileName() ==
"." | fileInfo.fileName() ==
"..")
84 {
85 i++
;
86 continue;
87 }
88
89 bIsDir =
fileInfo.isDir();
90 if (bIsDir)
91 {
92 recursiveTraverseDir(fileInfo.filePath());
93 }
94 else
95 {
96 strFileName =
fileInfo.fileName();
97 iFileSize = qCeil((fileInfo.size()) /
1024);
98
99 cout << strFileName.toLatin1().data() <<
"\t\t" << iFileSize <<
endl;
100
101 ExportToExcel();
102 }
103
104 msleep(
50);
105 i++
;
106
107 }
while(i <
fileInfolist.size());
108 }
109
110 void MyThread::ExportToExcel()
111 {
112 if(bewCurrentSheet)
113 {
114 becCurrentCell = bewCurrentSheet->Cell(iCurrentRow,
0);
115 becCurrentCell->
SetString(strFileName.toLatin1().data());
116
117 becCurrentCell = bewCurrentSheet->Cell(iCurrentRow,
1);
118 becCurrentCell->
SetInteger(iFileSize);
119
120 iCurrentRow++
;
121 }
122 }
执行结果:
转载于:https://www.cnblogs.com/paullam/p/3705924.html
相关资源:BasicExcel源代码和使用说明