C++二进制导出到Excel代码

来源:互联网 发布:拼长图的软件 编辑:程序博客网 时间:2024/06/05 21:16

我使用C++语言编写的导出Excel文件的代码。

功能:

1:可生成Xls的Excel二进制文件,但不包括最新的2007格式(此格式正在编写学习中)。

2:生成字符串、数字、日期等格式的单元格,可以自由设置格式。

3:自由嵌入多个图片(目前不需要也不想支持线型、文本框等图型元素)。

4:自由合并单元格,设置列宽和行高(以像素为单位)。

5:可同时生成多个命名的Sheet。

 

特点:

1:快速。

2:体积小且格式正确,未发现生成的文件有任何异常。

3:C++语言编写的。(2011-02-26)

 

主要用途:

目的是主要应用于在项目中生成Excel,比如在报表中导出Excel等,所以不包括像公式这样的在导出时用不到的功能。

 

代码分为头文件和Cpp文件,但不包括里面用到的一个自定义类CTArray,这个类是我自己实现的。看情况如果需要再贴出。

 

ExcelWorkBook1.h:

ExcelWorkBook1.cpp:

下载链接

 

template<typename T, int I=256, bool Auto=false>class CTArray{public:CTArray(void): m_Array(NULL), m_Count(0), m_MaxSize(I), m_AutoSize(Auto){this->m_Array=new T[this->m_MaxSize];/*尊重元素的构造函数,不能强制的都初始化为0值memset(this->m_Array, 0, sizeof(T)*this->m_MaxSize);*/}CTArray(CTArray& src){this->m_MaxSize=src.m_Count;//Copy合适的大小this->m_Count=src.m_Count;this->m_AutoSize=src.m_AutoSize;this->m_Array=new T[src.m_Count];memcpy_s(this->m_Array, sizeof(T)*src.m_Count, src.m_Array, sizeof(T)*src.m_Count);}~CTArray(void){ delete[] this->m_Array;}int Count(void){return this->m_Count;}void RemoveAll(void){this->m_Count=0;}void DeleteAll(void){for(int i=0;i<this->m_Count;i++){delete *(this->m_Array+i);}this->m_Count=0;}void Zero(){memset(this->m_Array, 0, sizeof(T)*this->m_MaxSize);}CTArray& operator=(CTArray& src){this->m_MaxSize=src.m_Count;//Copy合适的大小this->m_Count=src.m_Count;this->m_AutoSize=src.m_AutoSize;this->m_Array=new T[src.m_Count];memcpy_s(this->m_Array, sizeof(T)*src.m_Count, src.m_Array, sizeof(T)*src.m_Count);return *this;}T& operator[](int index){if(m_AutoSize){this->EnsureSize(index+1);}return this->m_Array[index];}T* GetAt(int index){if (m_AutoSize){this->EnsureSize(index+1);}return this->m_Array+index;}int Add(T value){this->EnsureSize();this->m_Array[this->m_Count]= value;return this->m_Count++;}int Add(T value, int length){this->EnsureSize();memcpy(this->m_Array[this->m_Count++], value, length*(sizeof value[0]));return this->m_Count;}int Insert(int index, T value){this->EnsureSize();for(int i=this->m_Count-1;i>index-1;i--){this->m_Array[i+1]=this->m_Array[i];}this->m_Array[index]=value;return ++this->m_Count;}int Insert(int index, T value, int length){this->EnsureSize();for(int i=this->m_Count-1;i>index-1;i--){memcpy(this->m_Array[i+1], this->m_Array[i], sizeof this->m_Array[i]);}memcpy(this->m_Array[index], value, length*(sizeof value[0]));return ++this->m_Count;}void EnsureSize(int size=0){//int count=this->m_Count;if (size>0 && this->m_Count<size){this->m_Count=size;}if (this->m_Count<this->m_MaxSize){/*尊重元素的构造函数,不能强制的都初始化为0值for(int i=count;i<this->m_Count;i++){memset(this->m_Array+count, 0, sizeof(T)*(this->m_Count-count));}*/return;}this->m_MaxSize=this->m_Count+I;T* tmpArray=new T[this->m_MaxSize];memcpy(tmpArray, this->m_Array, this->m_Count*sizeof(T));/*尊重元素的构造函数,不能强制的都初始化为0值memset(tmpArray+count, 0, sizeof(T)*(this->m_MaxSize-count));*/delete[] this->m_Array;this->m_Array=tmpArray;}void Sort(){CTArray::quickSort(this->m_Array, 0, this->m_Count-1);}T* Array(){return this->m_Array;}void static quickSort(T* tArray, int left, int right){do{int lindex = left;int rindex = right;int m = (lindex + rindex) >> 1;T mv = tArray[m];do{while (tArray[lindex]<mv){lindex++;}while (mv<tArray[rindex]){rindex--;}if (lindex > rindex){break;}if (lindex < rindex){T lv = tArray[lindex];tArray[lindex] = tArray[rindex];tArray[rindex] = lv;}lindex++;rindex--;}while (lindex <= rindex);if ((rindex - left) <= (right - lindex)){if (left < rindex){quickSort(tArray, left, rindex);}left = lindex;}else{if (lindex < right){quickSort(tArray, lindex, right);}right = rindex;}}while (left < right);}public:T* m_Array;int m_Count;bool m_AutoSize;private:int m_MaxSize;};


欢迎给出意见!2011-02-26 09:58:49

 

原创粉丝点击