1. 程式人生 > >C++ 二進位制操作 Excel 原理(Excel 寫操作)

C++ 二進位制操作 Excel 原理(Excel 寫操作)

簡介

開發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 <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
* 作者:陳魯勇
* 郵箱:[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 <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;
}

相關推薦

C++ 二進位制操作 Excel 原理Excel 操作

簡介 賞析 原始碼 簡介 開發IDE: VS2013 使用語言:C/C++ 作業系統:window 7 x64 賞析 利用寫檔案的形式,根據excel的書寫格式,進行編碼。 實現了excel的寫,只允許寫,並不支援讀操作。 親測

c# excel學習操作

#需要的dll Microsoft.Office.Interop.Excel (安裝了office,都會找到這個dll) //需要匯入 using Microsoft.Office.Interop.Excel; using System.Reflection; //1.建立Applic

使用者登入介面重點是python對excel檔案的讀操作

4 原始碼 加入excel的內容如下 # -*- coding: utf-8 -*- """ Created on Sun Jun 11 16:55:44 2017 @author: grace """ import xlrd#匯入xlrd庫 from xlutils.copy import copy

Python實現Excel檔案的讀操作

在Python的學習過程中,有時候需要對Excel檔案進行讀寫操作。其中主要用到兩大模組:使用xlwt module將資料寫入Excel表格,使用xlrd module從Excel讀取資料。下面介紹如何實現使用python對Excel進行讀寫操作。 安裝模組 $ sudo pip

C++ 儲存Excel檔案帶密碼保護

最近有客戶需求報表儲存為xls的功能,需要儲存的檔案設定密碼保護,特進行嘗試! Workbook.SaveAs method (Excel) 引數詳情:https://docs.microsoft.com/en-us/office/vba/api/excel.workbook.saveas

[python]使用xlrd對Excel表格進行讀操作

一、安裝xlrd模組到python官網下載http://pypi.python.org/pypi/xlrd 二、使用介紹 2.1 匯入模組import xlrd2.2 開啟Excel檔案讀取資料data = xlrd.open_workbook("excelFile.x

怎麼在delphi中讀取Excel資料各種詳細操作

( 一 ) 使用動態建立的方法首先建立 Excel 物件,使用ComObj :VarExcelApp : Variant ;ExcelApp := CreateOleObject ( '' Excel.Application'' ) ;1 ) 顯示當前視窗:Exce

Python對excel寫入資料操作例項程式碼只供參考

#coding=utf8 ''' 把buffer中的資訊,寫入到excel中。 並按照要求,構造表格樣式 ''' #匯入readCSV模組,用來獲取buffer資料 from readCSV import readCSV from readConfig import Con

C#匯出excel表格xls、xlsx

預備知識: 關於excel workbook:工作簿,每一個xls或xlsx相當於一個工作簿。 sheet:工作表,每個工作簿可以有多個工作表。工作表相當於一張紙,工作簿相當於一個本子,將過個

C語言學習系列——文件讀操作詳解

記錄 源程序 8.4 lib 令行 stdio.h 空串 表示 參數 當文件按指定的工作方式打開以後,就可以執行對文件的讀和寫。下面按文件的性質分類進行操作。針對文本文件和二進制文件的不同性質,對文本文件來說,可按字符讀寫或按字符串讀寫;對二進制文件來說,可進行

C++實現操作配置檔案告別跨平臺問題

CConfig.h #ifndef _CCONFIG_H #define _CCONFIG_H #include <iostream> #include <string> #include <fstream> #include <vector>

Linux安裝Tkinter+Python版本升級+Excel外掛xlrd和xlwt安裝

一、Tkinter安裝 在Python3中安裝Tkinter,需要對Python版本進行升級,重新編譯即可!!! 1、系統版本及Python版本 [[email protected] ~]# cat /etc/redhat-release Re

2017java檔案操作操作

java的讀寫操作是學java開發的必經之路,下面就來總結下java的讀寫操作。 從上圖可以開出,java的讀寫操作(輸入輸出)可以用“流”這個概念來表示,總體而言,java的讀寫操作又分為兩種:字元流和位元組流。 什麼是流? 流是一個抽象的概念。當Java程式需要從資料來源讀取資料時,會開啟一個到

宿主語言c++呼叫Lua原理lua的堆疊

本文主要介紹宿主語言是如何一步步呼叫lua的,這裡選取c++作為宿主語言,以前使用cocos呼叫lua的時候只知道是通過lua虛擬機器中的棧來實現的一直沒有深入理解,藉著這次重新使用的機會,深入理解並作出總結,做一記錄(記性不好,可以常回來看看鞏固下)先來理一理lua虛擬機器的棧: 我

C# winform 安裝程式打包自定義操作

(一),安裝程式 以前用vs製作過安裝程式,現在把步驟寫出來,有幫助的大家一定要頂哦 第一步:建立工程 1.開啟vs,新建專案->其他專案型別->安裝和部署(這個子項下面有安裝專案和Web安裝專案等,安裝專案就是普通的桌面程式安裝,Web安裝就是安裝網

C# 模擬鍵盤、滑鼠操作外部程式模擬使用者操作3DMARK

1.FROM1 CLASS SOURCE CODE: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; u

C++迭代器實現原理附帶了Java

前言 只要用過C++的容器,相信大家對迭代器都不會陌生。它提供一種統一的介面形式來遍歷相應的容器(例如陣列,連結串列,map等)。 例子1:迭代器的遍歷 利用迭代器遍歷陣列vector vector<int> vi{ 1, 3, 5, 7,

淺談C++多型實現原理虛繼承的奧祕

大夥都知道,如果要實現C++的多型,那麼,基類中相應的函式必須被宣告為虛擬函式(或純虛擬函式)。舉個例子: class Point { public: Point(float x = 0.0, float y = 0.0) : _x(x), _y(y) { } virtual fl

C語言操作mysql範例增刪查改

    C程式碼的API是隨MySQL一起釋出的. 它包含在mysqlclient庫中, 可以使C程式來訪問資料庫.     MySQL原始碼包中的許多客戶端都是用C寫的. 如果你正在找使用這些C API的例子, 可以看看客戶端的寫法.你可以在MySQL原始碼包的clie

PHP快速匯出Excel檔案 採用xlsx Writer

&lt;?php include_once("xlsxwriter.class.php"); ini_set('display_errors', 0); ini_set('log_errors', 1); error_reporting(E_ALL &amp; ~E_NOTICE); $f