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)
<?php include_once("xlsxwriter.class.php"); ini_set('display_errors', 0); ini_set('log_errors', 1); error_reporting(E_ALL & ~E_NOTICE); $f