Windows下LibXL库使用

Windows下LibXL库使用

1、LibXL下载

地址:https://www.libxl.com/download.html

解压后包结构

在这里插入图片描述

2、主要API

所有API详细地址:https://www.libxl.com/documentation.html

// 工厂接口:
// 用于创建xls格式的book实例;返回一个Book对象指针
// 在libxl namespace中
Book* xlCreateBook()

//用于创建xlsx格式的book实例;返回一个Book对象指针
// 在libxl namespace中
Book* xlCreateXMLBook()
    
// 其他主要API
/***   Book Class ***/
/*** 用于操作Book的***/
/*!
    @brief 加载一个文件到内存中

    将@filename文件加载到内存中,可以指定一个@tempFile临时文件减少内存的消耗

    @param[in] filename需要加载到内存中的具体文件名
    @param[in] tempFile临时文件,用于减少内存消耗,(本人没有用到过)
    @return bool.
            可以使用Book::errorMessage()查看失败的原因
*/
bool load(const wchar_t* filename, const wchar_t* tempFile = 0)
    
/*!
    @brief 加载文件中指定的一张表进内存中

    将@filename文件的@sheetIndex下标的表加载到内存中,可以指定一个@tempFile临时文件减少内存的消耗

    @param[in] filename需要加载到内存中的具体文件名
    @param[in] sheetIndex表格文件中的指定的一张表下表
    @param[in] tempFile临时文件,用于减少内存消耗,(本人没有用到过)
    @return bool.
            可以使用Book::errorMessage()查看失败的原因
*/
bool loadSheet(const wchar_t* filename, int sheetIndex, const wchar_t* tempFile = 0)
   
/*!
    @brief 设置用户许可证密钥

    我只读excel表格时,这里设不设置没有关系

    @param[in] name 密钥名
    @param[in] key 密钥
    @return void.
            可以使用Book::errorMessage()查看失败的原因
*/
void setKey(const wchar_t* name, const wchar_t* key)
    
/*!
    @brief 释放create打开的资源
*/
void release()


/***     Sheet Class    *****/
/***   用于操作表数据的,包括但不限于获取表总行数、总列数、判断单元格数据类型、读取单元格数据、向单元格写入数据、合并或拆分单元格等等。。。 ****/
    
/*!
    @brief 获取单元格类型

    @param[in] row 行
    @param[in] col 列
    @return CellType.
    CELLTYPE_EMPTY	empty, the cell doesn't exist
    CELLTYPE_NUMBER	number value
    CELLTYPE_STRING	string value
    CELLTYPE_BOOLEAN	boolean value
    CELLTYPE_BLANK	blank, the cell contains only format information
    CELLTYPE_ERROR	error
            可以使用Book::errorMessage()查看失败的原因
*/
CellType cellType(int row, int col) const

/*!
    @brief 以字符串的方式读取指定的单元格

    @param[in] row 行
    @param[in] col 列
    @param[in] format(没用过)
    @return wchar_t* 不要手动释放返回的指针,立刻拷贝到自己的内存中
            可以使用Book::errorMessage()查看失败的原因
*/
const wchar_t* readStr(int row, int col, Format** format = 0)

/*!
    @brief 向指定的单元格写入一个字符串

    @param[in] row 行
    @param[in] col 列
    @param[in] value 需要写入的值
    @param[in] format(没用过)
    @param[in] type(没用过)
    @return bool
            可以使用Book::errorMessage()查看失败的原因
*/
bool writeStr(int row, int col, const wchar_t* value, Format* format = 0, CellType type = CELLTYPE_STRING)
    
/*!
    @brief 以数值的形式读取一个数值或时间(date/time)

    @param[in] row 行
    @param[in] col 列
    @param[in] format(没用过)
    @return double
            可以使用Book::errorMessage()查看失败的原因
    
    使用Book::dateUppack接口从double返回值中提取时间(date/time)
*/
double readNum(int row, int col, Format** format = 0) const

3、在Visual Studio中使用LibXL

  • add include directory in your project, for example: c:\libxl\include_cpp

    Project -> Properties -> C/C++ -> General -> Additional Include Directories

  • add library directory in your project, for example: c:\libxl\lib

    Project -> Properties -> Linker -> General -> Additional Library Directories

  • add libxl.lib in project dependencies:

    Project -> Properties -> Linker -> Input -> Additional Dependencies

  • copy bin\libxl.dll to directory of your project

4、示例代码

#include <Windows.h>
#include <iostream>
#include "libxl.h"
#include <string>
using namespace libxl;

char* UnicodeToAnsi(const wchar_t* szStr)
{
	int nLen = WideCharToMultiByte(CP_ACP, 0, szStr, -1, NULL, 0, NULL, NULL);
	if (nLen == 0)
	{
		return NULL;
	}
	char* pResult = new char[nLen];
	WideCharToMultiByte(CP_ACP, 0, szStr, -1, pResult, nLen, NULL, NULL);
	return pResult;
}

void getExcelCellString(Sheet* sheet, int row, int col, std::string& value)
{
	if (sheet->cellType(row, col) == CELLTYPE_STRING)
	{
		value = UnicodeToAnsi(sheet->readStr(row, col));
	}
	else if (sheet->cellType(row, col) == CELLTYPE_NUMBER)
	{
		value = std::to_string((LONG64)sheet->readNum(row, col));
	}
}

void getExcelCellNum(Sheet* sheet, int row, int col, int& value)
{
	if (sheet->cellType(row, col) == CELLTYPE_NUMBER)
	{
		value = (int)sheet->readNum(row, col);
	}
}

void getExcelCellNum(Sheet* sheet, int row, int col, double& value)
{
	if (sheet->cellType(row, col) == CELLTYPE_NUMBER)
	{
		value = sheet->readNum(row, col);
	}
}

int main()
{
    std::cout << "Hello World!\n";
	Book* book = xlCreateBook();
	if (!book)
	{
		return -1;
	}
	std::string excelPath = "F:\\demo\\xlrw\\data\\template.xls";
	TCHAR path[1024];
#ifdef UNICODE
	MultiByteToWideChar(CP_ACP, 0, excelPath.c_str(), -1, path, 100);
#else
	strcpy(excelPath.c_str(), strUsr);
#endif

	if (!book->load(path))
	{
		book->release();
		book = xlCreateXMLBook();
		if (!book->load(path))
		{
			std::cout << book->errorMessage() << std::endl;
			return -1;
		}
	}

	book->setKey(L"Halil Kural", L"windows-2723210a07c4e90162b26966a8jcdboe");

	size_t sheetIndex = 0;
	Sheet* sheet = book->getSheet(sheetIndex);

	if (sheet)
	{
		int firstRow = sheet->firstRow(); //有数据的第一行行号
		int lastRow = sheet->lastRow();//有数据的最后一行行号
		int firstCol = sheet->firstCol(); //有数据的第一列列号
		int lastCol = sheet->lastCol();   //有数据的最后一列列号

		for (size_t row = 1; row < lastRow; ++row)
		{
			int col = 0;
			std::string IDCardNo;
			getExcelCellString(sheet, row, col++, IDCardNo);
			std::string Name;
			getExcelCellString(sheet, row, col++, Name);
			std::string PhoneNumber;
			getExcelCellString(sheet, row, col++, PhoneNumber);
			std::string Sex;
			getExcelCellString(sheet, row, col++, Sex);
			int Age;
			getExcelCellNum(sheet, row, col++, Age);
			double Height;
			getExcelCellNum(sheet, row, col++, Height);
			double Weight;
			getExcelCellNum(sheet, row, col++,Weight);
		}
	}

	book->release();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值