#简介 开发IDE: VS2013 使用语言:C/C++ 操作系统:window 7 x64
#赏析 利用写文件的形式,根据excel的书写格式,进行编码。 实现了excel的写,只允许写,并不支持读操作。 亲测可用。
#源码
源码注释清晰无比,不做过多赘述。
文件名:ExcelBase.h
/* * 简介:利用文件操作Excel * 作者:陈鲁勇 * 邮箱:727057301@qq.com * :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 <stdio.h> 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 * 作者:陈鲁勇 * 邮箱:727057301@qq.com * :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 <string.h> #include <exception> // 成功宏 #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; }