C++ 二进制操作 Excel 原理(Excel 写操作)

  • 简介
  • 赏析
  • 源码

版权所有:陈鲁勇,转载请注明出处:http://blog.csdn.net/csnd_ayo

简介

开发IDE: VS2013
使用语言:C/C++
操作系统:window 7 x64

赏析

利用写文件的形式,根据excel的书写格式,进行编码。
实现了excel的写,只允许写,并不支持读操作。
亲测可用。
C++ 二进制操作 Excel 原理(Excel 写操作)_第1张图片

源码

源码注释清晰无比,不做过多赘述。

文件名: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;
}

你可能感兴趣的:(C/C++,《C++,必知必会》)