版权所有:陈鲁勇,转载请注明出处:http://blog.csdn.net/csnd_ayo
开发IDE: VS2013
使用语言:C/C++
操作系统:window 7 x64
利用写文件的形式,根据excel的书写格式,进行编码。
实现了excel的写,只允许写,并不支持读操作。
亲测可用。
源码注释清晰无比,不做过多赘述。
文件名:ExcelBase.h
/*
* 简介:利用文件操作Excel
* 作者:陈鲁勇
* 邮箱:[email protected]
* CSDN:http://blog.csdn.net/csnd_ayo
* 码云:https://git.oschina.net/Mr_ChenLuYong
* github:http://github.com/chenluyong
* 创建时间:2017年4月8日 20:30:27
* VS版本:VS2015
*/
#ifndef __CLY_EXCELBASE_H__
#define __CLY_EXCELBASE_H__
#include
typedef unsigned short ushort;
class ExcelBase
{
public:
ExcelBase(const char* const fileName = nullptr);
virtual ~ExcelBase(void);
/*
@ 打开一个xls文件
@ open
@ fileName 文件名
@ 0 正常
*/
int open(const char* const fileName);
/*
@ 关闭xls文件
@ close
@ 0 正常
*/
int close(void);
/*
@ 写数据
@ write
@ row 行
@ col 列
@ value 数据
@ 0 正常
*/
int write(ushort row, ushort col, int value);
int write(ushort row, ushort col, double value);
int write(ushort row, ushort col, const char * const value);
protected:
/*
@ 二进制的方式写数据
@ writeFile
@ value 数据
@ len 长度
@ 0 正常
*/
int writeFile(const void * const value, ushort len);
private:
FILE* pFile_;
};
#endif // __CLY_EXCELBASE_H__
文件名:ExcelBase.cpp
/*
* 简介:利用文件操作Excel
* 作者:陈鲁勇
* 邮箱:[email protected]
* CSDN:http://blog.csdn.net/csnd_ayo
* 码云:https://git.oschina.net/Mr_ChenLuYong
* github:http://github.com/chenluyong
* 创建时间:2017年4月8日 20:30:27
* VS版本:VS2015
*/
#include "ExcelBase.h"
#include
#include
// 成功宏
#define AYO_SUCCESS (0)
// char型数据的数据头
#define EXCEL_CHARDATA_HEAD (0x0204)
// int型数据的数据头
#define EXCEL_INTDATA_HEAD (0x027E)
// double型数据的数据头
#define EXCEL_DOUBLEDATA_HEAD (0x0203)
ExcelBase::ExcelBase(const char* const fileName)
: pFile_(nullptr)
{
if (fileName != nullptr) {
open(fileName);
}
}
ExcelBase::~ExcelBase() {
if (pFile_) {
this->close();
}
}
int ExcelBase::open(const char * const fileName) {
int ret = AYO_SUCCESS;
// 检查资源
if (pFile_ != nullptr) {
close();
}
// 打开文件
#ifdef _WIN32
#ifndef _CRT_SECURE_NO_WARNINGS
fopen_s(&pFile_, fileName, "wb+");
#else
pFile_ = fopen(fileName, "wb+");
#endif // !_CRT_SECURE_NO_WARNINGS
#else
pFile_ = fopen(fileName, "wb+");
#endif // !_WIN32
if (pFile_ == nullptr) {
return -1;
}
// 写入Excel文件的数据头,以表示数据开始
ushort excel_begin[] = { 0x0809, 0x0008, 0x0000, 0x0010, 0x0000, 0x0000 };
ret = writeFile(excel_begin, sizeof(excel_begin));
return ret;
}
int ExcelBase::close(void) {
int ret = AYO_SUCCESS;
if (pFile_ != nullptr) {
ushort excel_end[] = { 0x000A, 0x0000 };
writeFile(excel_end, sizeof(excel_end));
ret = fclose(pFile_);
pFile_ = nullptr;
}
return ret;
}
int ExcelBase::write(ushort row, ushort col, const char * const value) {
// 检查资源
if (pFile_ == nullptr) {
return -1;
}
// 获取数据大小
const ushort& data_size = (ushort)strlen(value);
// 制作数据头
const ushort& data_head = data_size + 8;
ushort excel_head[] = { EXCEL_CHARDATA_HEAD, data_head, row, col, 0, data_size };
// 写数据
if (AYO_SUCCESS == writeFile(excel_head, 12)) {
return writeFile(value, data_size);
}
else {
return -1;
}
}
int ExcelBase::write(ushort row, ushort col, int value) {
// 检查资源
if (pFile_ == nullptr) {
return -1;
}
// 获取数据大小
const ushort& data_size = sizeof(value) + 6;
int temp_value = (value << 2) | 2;
// 制作数据头
ushort excel_head[] = { EXCEL_INTDATA_HEAD, data_size, row, col, '\0' };
// 写数据
if (AYO_SUCCESS == writeFile(excel_head, 10)) {
return writeFile(&temp_value, sizeof(value));
}
else {
return -1;
}
}
int ExcelBase::write(ushort row, ushort col, double value) {
// 检查资源
if (pFile_ == nullptr) {
return -1;
}
// 获取数据大小
const ushort& data_size = sizeof(value) + 6;
// 制作数据头
ushort excel_head[] = { EXCEL_DOUBLEDATA_HEAD, data_size, row, col, '\0' };
// 写数据
if (AYO_SUCCESS == writeFile(excel_head, 10)) {
return writeFile(&value, sizeof(value));
}
else {
return -1;
}
}
int ExcelBase::writeFile(const void * const value, ushort len) {
int ret = -1;
if (pFile_ != nullptr) {
ret = fwrite(value, 1, len, pFile_);
}
if (ret > 0) {
return AYO_SUCCESS;
}
return ret;
}
文件名:main.cpp
// 请保留作者的注释信息,尊重作者版权
#include "ExcelBase.h"
int main(void) {
ExcelBase writer("F:/Ayo.xls");
for (int i = 0; i < 10; ++i) {
writer.write(0, i, (int)69766601);
writer.write(2, i, "陈鲁勇");
writer.write(3, i, "Ayo");
writer.write(1, i, (double)0.69766601);
}
return 0;
}