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;
}