项目文件夹结构
├── bin
├── build├── CMakeLists.txt
├── docs
│ ├── excel
│ └── json
├── lib
├── src│ ├── CMakeLists.txt
│ ├── ExcelDataDeal
│ │ ├── CMakeLists.txt
│ │ ├── ExcelDataDeal.cpp
│ │ └── ExcelDataDeal.h
│ └── main.cpp
└── third_party
具体详情可见: Linux系统(Ubuntu)使用vscode进行c++开发-优快云博客
下载编译libxl库
打开Firefox进入官方地址下载tar.gz版本的压缩包
点击右边的DOWNLOAD
在gz文件所在的文件夹中右键打开终端
因为下载的是4.5.1版本,下载下来的文件名为libxl-lin-4.5.0.tar.gz
在终端输入:
tar -xzvf libxl-lin-4.5.1.tar.gz
解压完成之后在项目中的third_party中新建文件夹libxl以及libxl文件夹下新建include和lib文件夹,用于存放头文件和动态库(静态库)或者通过以下命令建立文件夹
mkdir libxl
cd libxl
mkdir include lib
将解压的文件夹中的需要的内容放进include和lib文件夹中
用的c就将include_c里面的内容放进include中,用的c++就将include_cpp里面的内容放进include中
而lib里面的内容根据直接需求存放 本文采用lib64
lib | 32位系统(通用) | 存放32位架构应用的库文件 |
lib64 | 64位系统(通常是x86-64架构) | 存放64位架构应用的库文件 |
lib-aarch64 | 64位ARM架构(aarch64) | 存放64位ARM架构设备的库文件 |
lib-armhf | 32位ARM架构(硬件浮点) | 存放32位ARM硬件浮点架构设备的库文件 |
至此,libxl的部分完成,接下来进入vscode中
vscode添加libxl库
配置tasks.json文件
1、在“args”中添加ExcelDataDeal文件夹中cpp文件的路径
"${workspaceFolder}/src/ExcelDataDeal/*.cpp"
2、在“args”中添加ExcelDataDeal文件夹中h文件的路径
"-I${workspaceFolder}/src/ExcelDataDeal"
3、在“args”中链接libxl
注意第一个是大写的I -I表示寻找include头文件 第二个-L表示寻找动态库的路径 第三个是小写的L
"-I${workspaceFolder}/third_party/libxl/include", #libxl的头文件路径
"-L${workspaceFolder}/third_party/libxl/lib", #libxl的动态库路径
"-lxl", #libxl动态库名称liblxl.so
综上
"args": [
"-fdiagnostics-color=always",
"-g",
"${workspaceFolder}/src/*.cpp",
"${workspaceFolder}/src/ExcelDataDeal/*.cpp",
"-o",
"${workspaceFolder}/bin/${fileBasenameNoExtension}",
"-I${workspaceFolder}/src/ExcelDataDeal",
// 链接libxl库
"-I${workspaceFolder}/third_party/libxl/include",
"-L${workspaceFolder}/third_party/libxl/lib",
"-lxl"
],
配置c_cpp_properties.json文件
1、在includePath中添加
ExcelDataDeal文件夹中h文件的路径
"${workspaceFolder}/src/ExcelDataDeal"
综上
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/src/ExcelDataDeal"
],
配置settings.json文件
当完成以上两步时运行还是会提示找不到libxl.so文件
我们在终端查看一下lib路径,会发现这个路径里面没有libxl.so的路径
echo $LD_LIBRARY_PATH
将有两个方法进行解决:
1、将libxl.so的路径添加到LD_LIBRARY_PATH中,然后写入~/.bashrc
文件中
export LD_LIBRARY_PATH=../third_party/libxl/lib:$LD_LIBRARY_PATH
source ~/.bashrc
但是这样在下次打开vscode时需要重新设置比较麻烦 ,下面介绍第二种方法,可以在打开vscode时自动生效,而且在删除该项目时也不会影响LD_LIBRARY_PATH
2、添加settings.json文件
按f1输入Preferences: Open Workspace Settings并打开工作区特定的设置文件(JSON)
settings.json文件就自动生成了,在settings.json文件中添加以下内容 ${workspaceFolder}表示当前根目录
"terminal.integrated.env.linux":
{
"LD_LIBRARY_PATH": "${workspaceFolder}/third_party/libxl/lib:${LD_LIBRARY_PATH}"
}
vscode调试编译运行
将环境都配置好以后编写代码 注意请在docs文件夹的excel中添加一个test.xls的表
ExcelDataDeal.h
#ifndef EXCEL_DATA_DEAL_H
#define EXCEL_DATA_DEAL_H
#include<iostream>
#include<vector>
#include <string>
#include <fstream>
#include"libxl.h"
using namespace std;
using namespace libxl;
vector<vector<string>> readExcelWholeData(const char* ExcelName);
#endif // EXCEL_DATA_DEAL_H
ExcelDataDeal.cpp
#include "ExcelDataDeal.h"
vector<vector<string>> readExcelWholeData(const char* ExcelName)
{
vector<vector<string>> Data;
Book* book = xlCreateBook();//创建一个二进制格式的XLS的实例,在使用前必须先调用这个函数创建操作excel的对象
book->setKey("key", "keypassword");//注册码 没有注册码只能读取300个数据
if (book)
{
if (book->load(ExcelName))
{
Sheet* sheet = book->getSheet(0);//添加一个工作表
if (sheet)
{
int colcount = sheet->lastFilledCol();//读取excel中数据的总列数
int rowcount = sheet->lastFilledRow();//读取excel中数据的总行数
vector<vector<string>> DataFlag(colcount,vector<string>(rowcount));
for(int i=0;i<colcount;i++)
{
DataFlag[i][0]=string(sheet->readStr(0, i));
}
for(int i=0;i<colcount;i++)
{
for(int j=1;j<rowcount;j++)
{
CellType cellType = sheet->cellType(j, i); //单元格的类型
if(cellType == CELLTYPE_STRING)// 处理字符串类型的数据
{
DataFlag[i][j]=string(sheet->readStr(j, i));
}
else if(cellType == CELLTYPE_NUMBER)// 处理数字类型的数据
{
DataFlag[i][j]=to_string(sheet->readNum(j, i));
}
}
}
Data=DataFlag;
}
}
book->release(); // 释放资源
}
return Data;
}
main.cpp
#include <iostream>
#include <vector>
#include <string>
#include "ExcelDataDeal.h"
using namespace std;
int main()
{
vector<vector<string>>data = readExcelWholeData("../docs/excel/test.xls");
return 0;
}
因为这个Linux的注册码需要自行购买,所以此代码只限于读取300个数据
cmake编译
根据目录结构CmakeLists.txt分为三层,在其三层中分别加入以下内容:
第一层根目录的CmakeLists.txt
#变量设置 ${CMAKE_CURRENT_SOURCE_DIR}表示当前cmake所在的路径
set(ExcelDataDeal_Dir ${CMAKE_CURRENT_SOURCE_DIR}/src/ExcelDataDeal) # ExcelDataDeal头文件路径#三方库变量设置
set(LIBXL_Dir ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libxl/include) # 三方库libxl头文件路径
set(LIBXL_Lib ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libxl/lib) # 三方库libxl动态库路径
第二层main函数同路径的CmakeLists.txt
# 添加头文件
target_include_directories(${PROJECT_NAME}
PUBLIC #public方式
${ExcelDataDeal_Dir}
)# 链接动态库
target_link_libraries(${PROJECT_NAME}
PUBLIC #public方式
ExcelDataDeal
)#添加子目录
add_subdirectory(ExcelDataDeal)
第三层ExcelDataDeal文件夹下的CmakeLists.txt
add_library(
${PROJECT_NAME}
SHARED
ExcelDataDeal.cpp
)
# 添加头文件
target_include_directories(${PROJECT_NAME}
PUBLIC #public方式
${LIBXL_Dir}
)# 链接动态库 同下面#的两条指令,但这种能精准验证,下面链接的可能会出现找不到的情况
find_library(XL_libDir NAMES xl PATHS ${LIBXL_Dir})
if(XL_libDir)
target_link_libraries(${PROJECT_NAME}
PUBLIC
${XL_libDir})
endif()
运行
cd build
cmake ..
make
./../bin/main