vs2015编译Xlnt库操作excel表格
xlnt是c++编写的开源excel操作工具,支持c++14标准。可以方便的通过代码的方式操作excel表格。支持sheet的读写和编辑,单元格操作支持写入和读取字符串或者数值类型。单元格样式设置等。可用于读取Excel中的单元格数据或者将数据写入单元格并保存到excel文件中。通过参考github项目主页上的Example我们可以使用Xlnt来进行excel操作。
编译Xlnt库
1, 从github上面下载代码,可以通过git命令行或者通过网页上的下载链接下载代码到本地。
通过git下载代码
git clone http://github.com/tfussell/xlnt.git
通过网页下载代码:https://github.com/tfussell/xlnt
2, Cmake配置项目
Cmake下载和安装参考:https://blog.csdn.net/sinat_36264666/article/details/73177703
step1: 打开cmake选择代码目录和build目录
step2: 点击Configure按钮,选择vs2015编译器,点击Finish开始配置
step3: 配置完成后点击Generate生成项目
3, 编译Xlnt生成Xlnt库
step1: 使用管理员权限打开vs2015,然后打开工程并设置为编译release版本,右击ALL_BUILD开始编译。
step2: 安装Xlnt库,Build INSTALL之后会把Xlnt库安装到build目录下的installed目录下
使用Xlnt库
将CMakelist文件和main.cpp放到同一目录下,使用cmake配置工程,选择Xlnt安装的目录为D:\xlnt_download\build\installed
1:将CMakeLists和main文件放到同一目录下(main函数和CMakeLists参考代码部分)
2:使用cmake配置项目,选择Xlnt安装目录以便找到Xlnt头文件和库文件。
3:编译demo代码(demo将读取一个excel表格的数据,输出到控制台,还将一个excel表格保存到磁盘)
4: 运行时报找不到xlnt.dll文件错误,将install目录(D:\xlnt_download\build\installed)下bin目录下面的xlnt.dll文件copy到xlnt_demo.exe目录下,或者将xlnt.dll所在目录添加到系统环境变量中后重启电脑生效。
- 报找不到dll错误
- 解决方式1,将dll文件copy到xlnt_demo.exe目录下
- 解决方式2,将xlnt.dll文件所在的目录添加到系统环境变量中之后重启电脑生效。
相关代码及其运行结果
main.cpp代码
#include "xlnt/xlnt.hpp"
#include <iostream>
using namespace std;
int test_read_excel()
{
/*https://blog.csdn.net/Wuzm_/article/details/83348908*/
xlnt::path pth("read_file.xlsx");
try {
xlnt::workbook wb(pth);
xlnt::worksheet ws = wb.sheet_by_index(0);
/*注意第一个参数为列数,从1开始计算,第二个参数才是行数,从1开始计算*/
int cell_value_int = ws.cell(1, 1).value<int>();/*第一列第一行*/
printf("%d %d %d\n", 1, 1, cell_value_int);
double cell_value_double = ws.cell(1, 2).value<int>();/*第一列第二行*/
printf("%d %d %f\n", 1, 2, cell_value_double);
string cell_value_string = ws.cell(1, 3).value<string>();/*第一列第三行*/
printf("%d %d %s\n", 1, 3, cell_value_string.c_str());
}
catch (std::exception e)
{
cout << e.what() <<endl;
}
return 0;
}
int test_write_excel()
{
/*https://blog.csdn.net/Wuzm_/article/details/83348908*/
/*https://github.com/tfussell/xlnt*/
xlnt::workbook wb;
xlnt::worksheet ws = wb.active_sheet();
ws.cell("A1").value(5);
ws.cell("B2").value("string data");
ws.cell("C3").formula("=RAND()");
ws.cell(6, 8).value("data:68");
ws.merge_cells("C3:C4");
ws.freeze_panes("B2");
wb.save("example.xlsx");
return 0;
}
int main(int argc, char** argv)
{
test_read_excel();
test_write_excel();
return 0;
}
CMakeLists文件内容
cmake_minimum_required (VERSION 2.6 FATAL_ERROR)
project (Xlnt_Test)
#xlnt install directory
set(XLNT_INSTALL_ROOT "" CACHE PATH "xlnt install root directory")
IF(EXISTS ${XLNT_INSTALL_ROOT})
MESSAGE(STATUS "set XLNT_INSTALL_ROOT to ${XLNT_INSTALL_ROOT}")
SET(XLNT_INCLUDE_DIR ${XLNT_INSTALL_ROOT}/include)
SET(XLNT_LIBRARY_DIR ${XLNT_INSTALL_ROOT}/lib)
ELSE()
message( FATAL_ERROR "XLNT_INSTALL_ROOT: ${XLNT_INSTALL_ROOT} is not a directory." )
ENDIF()
#xlnt include dir
IF(EXISTS ${XLNT_INCLUDE_DIR})
MESSAGE(STATUS "set XLNT_INCLUDE to ${XLNT_INCLUDE_DIR}")
ELSE()
message( FATAL_ERROR "XLNT_INCLUDE_DIR: ${XLNT_INSTALL_ROOT}/include is not exist." )
ENDIF()
#xlnt library dir
IF(EXISTS ${XLNT_LIBRARY_DIR})
MESSAGE(STATUS "set XLNT_LIBRARY_DIR to ${XLNT_LIBRARY_DIR}")
ELSE()
message( FATAL_ERROR "XLNT_LIBRARY_DIR: ${XLNT_INSTALL_ROOT}/lib is not exist." )
ENDIF()
#xlnt library
find_library(XLNT_LIBS xlnt ${XLNT_LIBRARY_DIR})
IF(EXISTS ${XLNT_LIBS})
MESSAGE(STATUS "set XLNT_LIBS to ${XLNT_LIBS}")
ELSE()
message( FATAL_ERROR "XLNT_LIBS: ${XLNT_LIBS} is not exist." )
ENDIF()
IF(XLNT_LIBS STREQUAL "")
MESSAGE("SUCCESS: FIND XLNT LIBRARY")
ENDIF()
include_directories(${XLNT_INCLUDE_DIR})
link_directories(${XLNT_LIBRARY_DIR})
SET(CMAKE_BUILD_TYPE Release)
ADD_DEFINITIONS(-D _XKEYCHECK_H)
ADD_EXECUTABLE (xlnt_demo main.cpp)
#set vs startup project
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT xlnt_demo)
TARGET_LINK_LIBRARIES (xlnt_demo ${XLNT_LIBS})
运行结果截图
写到磁盘的文件
参考资料:
C++操作Excel,xlnt库的使用:https://blog.csdn.net/u010442908/article/details/81390567
使用Xlnt来处理Excel数据:https://blog.csdn.net/Wuzm_/article/details/83348908