from:http://www.cnblogs.com/paullam/p/3705924.html
 
使用的平台:vs2013 控制台
创建时需要注意, 安全开发生命周期(SDL)检查 不能勾选(不嫌麻烦的话就默认选吧)
 
 
本文百度云下载: http://pan.baidu.com/s/1i5NRg6x //其中ExcelRead.cpp为CSDN作者的演示
CSDN download: http://download.csdn.net/download/xcwmy/6992365 //其中ExcelRead.cpp为CSDN作者的演示
参考: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
获取单元格值类型,包括以下值:UNDEFINEDINTDOUBLESTRINGWSTRING
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
#include <QtCore/QCoreApplication>
#include "mythread.h" int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); MyThread mythread;
mythread.setCurrentDirectory(QString("C:/Program Files/360"));
mythread.setStart(); return a.exec();
}

  

mythread.h

#ifndef MY_THREAD_H
#define MY_THREAD_H #include <QThread>
#include <QMutex>
#include <QWaitCondition> #include "BasicExcel.h" using namespace YExcel; class MyThread : public QThread
{
Q_OBJECT public:
MyThread();
~MyThread(); void setStart();
void setCurrentDirectory(QString strCurrentDirectory);
void recursiveTraverseDir(QString dirString); protected:
void run(); private:
void ExportToExcel(); private:
bool bRunning;
QWaitCondition waitRunning;
QMutex mutex; QString strCurrentDirectory;
QString strFileName;
int iFileSize; BasicExcel beObject;
BasicExcelWorksheet* bewCurrentSheet;
BasicExcelCell* becCurrentCell;
char strCurrentSheet[8];
int iCurrentRow;
int iSheetIndex;
}; #endif // MY_THREAD_H

  

mythread.cpp
#include <QDir>
#include <QFileInfo>
#include <Qt>
#include <QtGlobal>
#include <QtCore/qmath.h>
#include "mythread.h" MyThread::MyThread()
{
bRunning = false; beObject.New();
bewCurrentSheet = beObject.GetWorksheet("Sheet1");
iCurrentRow = 0;
iSheetIndex = 1; start();
} MyThread::~MyThread()
{
wait();
} void MyThread::setStart()
{
QMutexLocker locker(&mutex);
this->bRunning = true;
waitRunning.wakeOne();
} void MyThread::setCurrentDirectory(QString strCurrentDirectory)
{
QMutexLocker locker(&mutex);
this->strCurrentDirectory = strCurrentDirectory;
} void MyThread::run()
{
forever
{
{
QMutexLocker locker(&mutex);
if(!bRunning)
{
waitRunning.wait(&mutex);
}
} recursiveTraverseDir(strCurrentDirectory);
beObject.SaveAs("example.xls"); {
QMutexLocker locker(&mutex);
if(bRunning)
{
bRunning = false;
}
}
} } void MyThread::recursiveTraverseDir(QString dirString)
{
QDir dir(dirString);
if (!dir.exists())
{
return;
} dir.setFilter(QDir::Dirs | QDir::Files);
dir.setSorting(QDir::DirsFirst); QFileInfoList fileInfolist = dir.entryInfoList(); int i = 0;
bool bIsDir;
QFileInfo fileInfo; do{
fileInfo = fileInfolist.at(i);
if(fileInfo.fileName() == "." | fileInfo.fileName() == "..")
{
i++;
continue;
} bIsDir = fileInfo.isDir();
if (bIsDir)
{
recursiveTraverseDir(fileInfo.filePath());
}
else
{
strFileName = fileInfo.fileName();
iFileSize = qCeil((fileInfo.size()) / 1024); cout << strFileName.toLatin1().data() << "\t\t" << iFileSize << endl; ExportToExcel();
} msleep(50);
i++; }while(i < fileInfolist.size());
} void MyThread::ExportToExcel()
{
if(bewCurrentSheet)
{
becCurrentCell = bewCurrentSheet->Cell(iCurrentRow, 0);
becCurrentCell->SetString(strFileName.toLatin1().data()); becCurrentCell = bewCurrentSheet->Cell(iCurrentRow, 1);
becCurrentCell->SetInteger(iFileSize); iCurrentRow++;
}
}

  

 
执行结果:

 
 
 

BasicExcel的使用的更多相关文章

  1. BasicExcel说明文档

    BasicExcel说明文档 BasicExcel原始链接:http://www.codeproject.com/Articles/13852/BasicExcel-A-Class-to-Read-a ...

  2. Excel文件操作方式比较

    C++读取Excel的XLS文件的方法有很多,但是也许就是因为方法太多,大家在选择的时候会很疑惑. 由于前两天要做导表工具,比较了常用的方法,总结一下写个短文, 1.OLE的方式 这个大约是最常用的方 ...

  3. 在 VS2008 下操作 Excel 的方法总结

      这些天做个软件,需要读取 Excel 并导入到数据库中,所以研究了一下在 VC 下操作 Excel 的方法,这里做个总结,以作备忘. 一.最常用的 OLE 自动化方式 这个方式应该说是功能最全的方 ...

  4. C++读写EXCEL文件OLE,java读写excel文件POI 对比

    C++读写EXCEL文件方式比较 有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看.http://www.cnblogs.com/destim/p/5476915.html C++ ...

  5. C/C++读写excel文件 的几种方式

    因为有些朋友问代码的问题,将OLE读写的代码分享在这个地方,大家请自己看. http://blog.csdn.net/fullsail/article/details/8449448 C++读取Exc ...

随机推荐

  1. Mac OS X下搭建Android开发环境(包括SDK和NDK)

    资源准备:  JDK Eclipse Android SDK Android NDK ADT CDT ANT 搭建Android SDK开发环境: 1.JDK安装,要求版本>1.5, Mac O ...

  2. linux中的信号简介和trap命令

    1.信号 linux通过信号来在运行在系统上的进程之间通信,也可以通过信号来控制shell脚本的运行 主要有一下信号 1 ##进程重新加载配置 2 ##删除进程在内存中的数据 3 ##删除鼠标在内存中 ...

  3. GIT生成 SSH Key步骤

    //设置user.name和email 提交到git之后会显示用户名(在随意一个目录打开git-bash执行就行)Administrator@DESKTOP-BP3H0HS MINGW64 /d/mi ...

  4. struts2——文件下载自定义文件名,包括中文

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. Binder机制-简单用法(一)

    Binder算是android里面比较难懂的部分了,但是非常重要,基本上,当我们深入到进程交互的阶段,Binder都是一个绕不开的槛,所以我也希望帮助大家更浅显地了解到这个知识点.笔者想通过3篇博文简 ...

  6. 导出成可运行jar包时所遇问题的解决办法 - 转载

    Could not find main method from given launch configuration 当我把我的Java工程导出为可运行的jar包时,遇到了“Could not fin ...

  7. GridView右键菜单

    一.添加右键菜单 1.在VS工具箱中的“菜单和工具栏”找到ContextMenuStrip控件,双击添加. 2.点击ContextMenuStrip右上方的小三角形,打开编辑项,可以添加菜单项.至于菜 ...

  8. mysql实际使用思路

    在熟悉mysql语法的基础上,想在自己的应用程序中使用它,应该怎么操作呢? 自然的想法就是找到相应语言的mysql接口,然后熟悉接口,对其进行调用. 具体的做法与思路如下: 找到C的mysql接口 新 ...

  9. server_2003_r2_standard_sp2_vl_X13-46532

    1. 安装的是 cn_win_srv_2003_r2_standard_with_sp2_vl_cd1_X13-46532.iso CD2 它没有要求装 也就没装,貌似 网上搜到 安装CD2需要另外的 ...

  10. Reflection01_获取Class对象

    1.java 代码: package reflectionZ; public class TreflectionZ { public static void main(String[] args) t ...