libxlsxwriter条件格式
今天来看一个libxlsxwriter的高级用法:一个条件格式的示例。
说它“高级”,也是基于非Excel专家的小白们的视角。对,没错,本小白正是这样的小白。
1 一个简单的问题
来看我们今天的场景问题:有一列数据,有正有负,我们希望从中找到“绝对值最大”的那个数,并将其变红、加粗;且找到“绝对值最小”的那个数,将其变绿、加粗。
我们先来看一下希望达成的效果:

在这个案例中,绝对值最大的那个数是85,绝对值最小的那个数是-1。
看起来是一个非常简单的问题,但我们提升一下难度,在以上要求的同时,不允许添加辅助列。
相信如果有辅助列,对大家来说非常简单,因为在Excel中,可以使用一个辅助列,先求出每个值的绝对值,然后对绝对值设置条件格式的最大或最小值,提取出行号后按行更改格式即可。
但现在不允许。
2 libxlsxwriter的条件格式设置
单刀直入,先放代码,关键注释已经全部写入:
#include "xlsxwriter.h"int main(int argc, char* argv[])
{lxw_workbook* workbook = workbook_new("conditionFormat.xlsx");lxw_worksheet* worksheet = workbook_add_worksheet(workbook, NULL);// 写入初始数据列worksheet_write_number(worksheet, CELL("A1"), -5, NULL);worksheet_write_number(worksheet, CELL("A2"), 12, NULL);worksheet_write_number(worksheet, CELL("A3"), -1, NULL);worksheet_write_number(worksheet, CELL("A4"), 30, NULL);worksheet_write_number(worksheet, CELL("A5"), -40, NULL);worksheet_write_number(worksheet, CELL("A6"), 4, NULL);worksheet_write_number(worksheet, CELL("A7"), 35, NULL);worksheet_write_number(worksheet, CELL("A8"), 85, NULL);worksheet_write_number(worksheet, CELL("A9"), 18, NULL);worksheet_write_number(worksheet, CELL("A10"), 10, NULL);worksheet_write_number(worksheet, CELL("A11"), 32, NULL);// 先设置两种情况下的格式lxw_format* maxValueFormat = workbook_add_format(workbook);lxw_format* minValueFormat = workbook_add_format(workbook);// 绝对值最大:加粗、红色format_set_bold(maxValueFormat);format_set_font_color(maxValueFormat, LXW_COLOR_RED);// 绝对值最大:加粗、绿色format_set_bold(minValueFormat);format_set_font_color(minValueFormat, LXW_COLOR_GREEN);// 为条件格式开辟内存lxw_conditional_format* conditionFormat = (lxw_conditional_format*)calloc(1, sizeof(lxw_conditional_format));// 条件格式类型选择以公式格式conditionFormat->type = LXW_CONDITIONAL_TYPE_FORMULA;// 最大绝对值的公式,要么等于最大值,要么等于最大值的负值conditionFormat->value_string = "=OR(A1=MAX(ABS($A$1:$A$11)), A1=-MAX(ABS($A$1:$A$11)))";conditionFormat->format = maxValueFormat;worksheet_conditional_format_range(worksheet, RANGE("A1:A11"), conditionFormat);// 最小绝对值的公式,要么等于最小值,要么等于最小值的负值conditionFormat->value_string = "=OR(A1=MIN(ABS($A$1:$A$11)), A1=-MIN(ABS($A$1:$A$11)))";conditionFormat->format = minValueFormat;worksheet_conditional_format_range(worksheet, RANGE("A1:A11"), conditionFormat);// 释放条件格式内存free(conditionFormat);// 关闭工作表,生成最终Excel表格workbook_close(workbook);return 0;
}
要点如下:
- 先为不同的目标设置格式类型,如代码中的
maxValueFormat和minValueFormat; - 再为条件格式开辟内存,注意可以选择多种模式,本例中选择
LXW_CONDITIONAL_TYPE_FORMULA; - 为所关注的目标设置公式,本例中是绝对值最大和绝对值最小(这里的技巧是纯Excel的,不在本文描述之内);
- 利用
worksheet_conditional_format_range来应用条件格式.
最终生成的效果如下:

这里细心的小伙伴可以注意到,小白第一次贴出的效果图中,字体为等线,而小白第二次贴出的效果图中,字体是宋体,这是由于第一次贴出的效果图是手动写入的,单元格默认的数据类型是“常规”,它的默认字体是等线,而代码是使用了worksheet_write_number函数写入的,在小白的电脑上,系统设置的默认字体是宋体。仅此而已。
如果想要对这个细节问题进行修复,请参看小白上一篇博客libxlsxwriter设置字体格式
ps: 条件格式中还有很多更简单的用例,比如说找一个等于、大于、小于某个阈值的数,这种情况下不需要用到本文中提到的LXW_CONDITIONAL_TYPE_FORMULA类型,只需要使用LXW_CONDITIONAL_TYPE_CELL即可,具体的使用方法可以直接查看libxlsxwriter的官方例程,小白觉得如果能够掌握本文所说的这个“高级”案例,应该不难掌握更简单的官方例程。

相关文章:
libxlsxwriter条件格式
今天来看一个libxlsxwriter的高级用法:一个条件格式的示例。 说它“高级”,也是基于非Excel专家的小白们的视角。对,没错,本小白正是这样的小白。 1 一个简单的问题 来看我们今天的场景问题:有一列数据,有…...
nodejs+vue+elementui在线求助系统vscode
目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 前端技术:nodejsvueelementui,视图层其实质就是vue页面,通过编写vue页面从而展示在浏览器中,编写完成的vue页面要能够和控制器类进…...
电子技术——BJT差分输入对
电子技术——BJT差分输入对 本节我们来讨论BJT差分输入对。 共模输入 下图是BJT差分输入对的基本原理图: 首先我们考虑两端输入共模信号 VCMV_{CM}VCM : 此时 vB1vB2VCMv_{B1} v_{B2} V_{CM}vB1vB2VCM 因为电路的对称结构,所以 i…...
[MySQL教程②] - MySQL介绍和发展史
目录 ❤ MySQL介绍 ❤ 什么是数据库 ❤ 什么是数据 ❤ 数据库管理系统 ❤ NoSQL特性总览 ❤ NoSQL的分类、特点、典型产品 ❤ 常见的数据库产品有哪些? ❤ Oracle公司产品介绍 Oracle数据库版本介绍 Oracle的市场应用 MySQL数据库版本介绍 MyS…...
多表查询--实例
1 创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下: CREATE TABLE score ( id INT…...
Differentially Private Grids for Geospatial Data
文章目录abstractintroabstract 在本文中,我们解决了为二维数据集(如地理空间数据集)构建差异私有概要的问题。目前最先进的方法通过执行数据域的递归二进制分区和构造分区的层次结构来工作。我们表明,基于分区的概要方法的关键挑战在于选择正确的分区粒…...
Java学习记录day8
类与对象 继承例题 https://www.bilibili.com/video/BV1PU4y1E7nX?p55&vd_source8f80327daa664c039f5c342a25bcbbae(B站千峰马剑威Java基础入门视频第P55,记录的重要学习内容之一) final关键字 作用: 声明一个常量&…...
Solon2 开发之容器,三、注入或手动获取 Bean
1、如何注入Bean? 先了解一下Bean生命周期的简化版: 运行构建函数尝试字段注入(有时同步注入,没时订阅注入。不会有相互依赖而卡住的问题)Init 函数(是在容器初始化完成后才执行)…释放&#…...
微信小程序_调用openAi搭建虚拟伙伴聊天
微信小程序_调用openAi搭建虚拟伙伴聊天背景效果关于账号注册接口实现8行python搞定小程序实现页面结构数据逻辑结速背景 从2022年的年底,网上都是chagpt的传说,个人理解这个chatgpt是模型优化训练,我们在用chatgpt的时候就在优化这个模型&a…...
硬件工程师入门基础知识(一)基础元器件认识(一)
硬件工程师入门基础知识 (一)基础元器件认识(一) 今天水一篇hhh。介绍点基础但是实用的东西。 tips:学习资料和数据来自《硬件工程师炼成之路》、百度百科、网上资料。 1.贴片电阻 2.电容 3.电感 4.磁珠 1.贴片电…...
TCP的运输连接管理
TCP的运输连接管理 文章目录TCP的运输连接管理TCP报文格式简介首部各个字段的含义控制位(flags)TCP的连接建立抓包验证一些细节及解答TCP连接释放抓包验证一些细节及解答参考TCP是面向连接的协议。运输连接是用来传送TCP报文的。TCP运输连接的建立和释放时每一次面向连接的通信…...
地级市用电、用水、用气数据指标
用电用水量和煤气及液化石油气供应及利用情况可以反映出城市基础设施的建设情况!之前我们基于历年的《中国城市统计年鉴》整理了1999—2020年的人口数量数据指标、人口变动数据指标、用地相关数据指标、污染物排放和环境治理相关数据指标、地区生产总值及一二三产构…...
安装deepinlinuxV20.8配置docker和vscode开发c语言
# 重装的原因 某个开发任务时,发现需要glibc2.25,本机版本比较低,就下载源码configure make makeinstall,结果失败了, 看来与系统用的glibc有冲突,造成部分库版本不一致,打开终端出现段错误&#x…...
java08-面向对象3
一:static 关键字:静态的 1.可以用来修饰的结构:主要用来修饰类的内部结构 属性、方法、代码块、内部类 2. static 修饰属性:静态变量(或类变量) 2.1 属性,是否使用static修饰,又分为静态属…...
【Spark分布式内存计算框架——Spark Core】8. 共享变量
第七章 共享变量 在默认情况下,当Spark在集群的多个不同节点的多个任务上并行运行一个函数时,它会把函数中涉及到的每个变量,在每个任务上都生成一个副本。但是,有时候需要在多个任务之间共享变量,或者在任务(Task)和…...
C++多态常见面试题
1.什么是多态 简单点说,就是多种形态,具体就是完成某个行为,当不同的对象去完成时产生的不同形态。多态分为静态多态和动态多态,静态多态一般指的是函数重载,在编译阶段通过函数名修饰规则,不同类型调用不同…...
字母板上的路径 题解,力扣官方出来挨打(小声)
字母板上的路径 我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。 我们可以按下面的指令规则行动:…...
代码随想录算法训练营第二十六天 | 39. 组合总和,40.组合总和II,131.分割回文串
一、参考资料组合总和题目链接/文章讲解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html 视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ 组合总和II题目链接/文章讲解:https://programmercarl.com/004…...
vueday01-脚手架安装详细
一、vue脚手架安装命令npm i -g vue/cli 或 yarn global add vue/cli安装上面的工具,安装后运行 vue --version ,如果看到版本号,说明安装成功或 vue -V工具安装好之后,就可以安装带有webpack配置的vue项目了。创建项目之前&#…...
初识cesium3d(一)
使用ViteVue3.2Cesium。Vite需要Node.js版本14.18及以上版本。Vite命令创建的工程会自动生成vite.config.js文件,来配置一些相关的参数。 1、使用Vite创建vue3项目 # npm npm init vitelatest cesium-app -- --template vue # yarn yarn create vite cesium-app…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
