Linux C/C++解析xls

2023-11-17

libxls作为开源库,支持在Linux C/C++ 环境下解析(读)xls文件,github提供了源码:

https://github.com/libxls/libxls

但是github的源码需要一堆辅助工具,才能够编译出libxls的C静态库,因此琢磨了下手动编译libxls的静态库/动态库方法,可以摆脱辅助工具缺失乃至版本问题导致的抓狂,尤其适合不方便联网的内网开发环境。

将fuzz、src、include目录下所有文件拷贝到一个目录下,修改*.c和*.h文件中指定的include文件路径为当前目录下
然后将locale.c、endian.c、fuzz_xls.c、ole.c、xls.c、xlstool.c编译成相应的.o文件
locale.h文件中需要添加语句“#include<stddef.h>”
gcc -c locale.c
gcc -c endian.c
gcc -c ole.c
gcc -c xls.c
gcc -c xlstool.c
gcc -c fuzz_xls.c -std=c99 (fuzz_xls.c源文件需要指定c99标准)
选择test.c编译成.o文件
gcc -c test.c
将所有.o文件链接在一起生成可执行demo程序
gcc locale.o endian.o fuzz_xls.o ole.o xls.o xlstool.o test.o -o demo
也可以将locale.o、endian.o、fuzz_xls.o、ole.o、xls.o、xlstool.o编译成静态库
ar -rc libxls.a locale.o endian.o fuzz_xls.o ole.o xls.o xlstool.o

gcc -c test.c -L . -lxls -o demo

或者将locale.o、endian.o、fuzz_xls.o、ole.o、xls.o、xlstool.o编译成动态库
gcc -fPIC -shared locale.o endian.o fuzz_xls.o ole.o xls.o xlstool.o -o libxls.so

demo程序链接库
gcc test.c -L . -lxls -o demo

如果想要在C++代码中使用libxls,需要将XlsReader.cpp和XlsReader.h编译后链接到程序
g++ XlsReader.cpp main.cpp -L. -lxls -o demo -std=c++11

编写一个xls文件中获取指定id行的信息的demo:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>

#include "XlsReader.h"

using namespace std;
using namespace xls;

int main(int argc, char *argv[])
{
	if (argc < 2)
	{
		cout << "Usage: ./demo  <file.xls>" << endl;
		exit(1);
	}
	
	string width,  depth;
	int id = 3;
	flaot size[2] = {0};
	
	string file = string(argv[1]);
	WorkBook foo(file);
	
	cellContent cell = foo.GetCell(0, 1, 2);
	
	for (int sheetNum = 0; sheetNum < foo.GetSheetCount; ++ sheetNum) //遍历xls所有sheet的列表
	{
		if  ( "sheet 1" != foo.GetSheetName(sheetNum) ) //选择sheet 1
			continue;
		
		cout << "find sheet 1." << endl;
		foo.InitIterator(sheetNum);
		
		while (ture)
		{
			cellContent c = foo.GetNextCell();
			
			if (c.type == cellBlank)
				break;
				
			if (c.row == 1)
				continue;
				
			if (c.col == 1)
			{
				if (stoi(c.str) == id)
				{
					width.assign(foo.GetCell(sheetNum, c.row, 3).str);
					depth.assign(foo.GetCell(sheetNum, c.row, 4).str);
					
					break;  //找到后即退出
				}
			
			}
		
		}
	}
	
	size[0] = atof(width.c_str());
	size[1] = atof(depth.c_str());
	
	cout << "Die No. : " << id << ", width: " << size[0] << ", depth: " << size[1] << endl;

	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux C/C++解析xls 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • std::bind 重载解析

    下面的代码工作正常 include
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12

随机推荐

  • 【数据结构】栈的知识点总结--关于栈的定义和基本操作;C语言实现栈;顺序栈;链栈;共享栈;栈的易错点的总结

    欢迎各位看官 目录 1 栈的定义 2 栈的基本操作 2 1创建 2 2销毁 2 3插入Push 2 4删除Pop 2 5获得栈顶元素GetTop 2 6判空 2 7清空栈 3 C语言实现栈 4 顺序栈 4 1数组实现顺序栈 4 2链表实现顺
  • 【毕业设计】单片机 图像分类 智能识别机器人 - 物联网 深度学习 AI

    文章目录 0 前言 1 项目背景 2 在 Arduino IDE 上安装 ESP32 Cam 3 用 BLINK 测试电路板 4 测试 WiFi 5 测试相机 6 运行你的网络服务器 7 水果与蔬菜 图像分类 8 结论 9 最后 0 前言
  • Element Ruoyi 若依跳转后没有滚动条

    Vue Element Ruoyi 若依跳转后页面没有滚动条的解决办法 页面 路由跳转后 body 的内联样式变成 overflow hidden 在src main js中增加一下代码 解决bug 页面 路由跳转后 滚动条消失 页面无法滚
  • DI/IOC

    控制反转 依赖注入 主要说的是通过java的反射机制将xml文件解析 主动解释依赖关系 并实例化相关bean package com bjsxt spring import java lang reflect Method import j
  • 智能合约转java_第四章 自定义sol合约转化java代码,并实现调用

    鉴于笔者以前各大博客教程都有很多人提问 早期建立一个技术交流群 里面技术体系可能比较杂 想了解相关区块链开发 技术提问 请加QQ群 538327407 准备工作 1 官方参考说明文档 2 已经在ubuntu 上搭建好FISCO BCOS 底
  • 快慢指针之练习【2】

    学习安排根据 代码随想录 leetcode 283 移动零 思路 1 直接从大到小排序 不可 需保持原来的相对顺序 2 快慢指针 如何将0移位 gt 快慢指针 赋值 代码 class Solution public void moveZer
  • Java设计模式

    一 采用设计模式的目的 二 设计模式的七大设计原则 三 常见的设计模式
  • 通过命令行开启和关闭oracle

    1 启动oracle10g 建一个以bat结尾的文件 内容为 net start OracleServiceORCL net start OracleORADB10gTNSListener 2 关闭oracle10g 建一个以bat结尾的文
  • 西门子PLC中如何解决流量累积问题

    现在上位机系统中很多要求具备流量计的流量累计功能 由此引出的几个问题 期望与大家分享 问题1 自行编写流量累计程序 自行编写流量累计程序的原理 其实就是积分的最原始算法概念 把单位小间隔时间内的瞬时流量乘以单位间隔时间 得到单位小间隔时间内
  • kafka详解及集群环境搭建

    一 kafka详解 安装包下载地址 https download csdn net download weixin 45894220 87020758 1 1Kafka是什么 1 Kafka是一个开源消息系统 由Scala写成 是由Apac
  • layout注意事项_注意事项

    layout注意事项 In the post we will look at how you can orchestrate real time customer journeys with Adobe s Journey Orchestr
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • from: can't read /var/mail/xxx 解决方法

    在执行一个发包脚本的时候 遇到了如下问题 from can t read var mail scapy all 原因 脚本是没有问题的 但它并不是可以被python执行的可执行文件 解决方法 1 使用python 脚本名字 命令执行脚本 2
  • k210自学快速入门(附网址)

    一 获得下载工具IDE https dl sipeed com MAIX MaixPy ide 安装和配置见该博客 http t csdn cn 464lj 二 下载固件 1 用于程序的执行下载站 Sipeed 注意 minimum是最小版
  • sqlalchemy create_engine关于连接池的几个参数

    pool size 设置连接池中 保持的连接数 初始化时 并不产生连接 只有慢慢需要连接时 才会产生连接 例如我们的连接数设置成pool size 10 如果我们的并发量一直最高是5 那么我们的连接池里的连接数也就是5 当我们有一次并发量达
  • 级联菜单的动态实现(数据库绑定)

    效果预览 数据库设计 第一类型 第二类型 第三类型 Controller层代码 RequestMapping noFilterGetAllInfo public void noFilterGetAllInfo Integer firstSe
  • 【调试经验】MySQL - fatal error: mysql/mysql.h: 没有那个文件或目录

    机器环境 Ubuntu 22 04 3 LTS 报错问题 在编译一个项目时出现了一段SQL报错 CGImysql sql connection pool cpp 1 10 fatal error mysql mysql h 没有那个文件或目
  • python推荐系统学习笔记(5)——基于图的模型推荐算法

    python推荐系统学习笔记 5 基于图的模型推荐算法 2 1 用户行为数据的二分图表示 为可以把基于邻域的模型看作基于图的模型的简单形式 用户物品二分图模型 对于数据集中每一个二元组 u i 图中都有一套对应的边e vu vi 其中vu属
  • java listnode 合并链表_java实现链表合并

    输入两个单调递增的链表 输出两个链表合成后的链表 当然我们需要合成后的链表满足单调不减规则 最容易想到的就是新建一个链表 一个一个将节点连接到新链表中 代码 public ListNode Merge ListNode list1 List
  • Linux C/C++解析xls

    libxls作为开源库 支持在Linux C C 环境下解析 读 xls文件 github提供了源码 https github com libxls libxls 但是github的源码需要一堆辅助工具 才能够编译出libxls的C静态库