libxlsxwriter条件格式

news2024/9/23 20:26:52

今天来看一个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;
}

要点如下:

  • 先为不同的目标设置格式类型,如代码中的maxValueFormatminValueFormat
  • 再为条件格式开辟内存,注意可以选择多种模式,本例中选择LXW_CONDITIONAL_TYPE_FORMULA
  • 为所关注的目标设置公式,本例中是绝对值最大和绝对值最小(这里的技巧是纯Excel的,不在本文描述之内);
  • 利用worksheet_conditional_format_range来应用条件格式.

最终生成的效果如下:
在这里插入图片描述

这里细心的小伙伴可以注意到,小白第一次贴出的效果图中,字体为等线,而小白第二次贴出的效果图中,字体是宋体,这是由于第一次贴出的效果图是手动写入的,单元格默认的数据类型是“常规”,它的默认字体是等线,而代码是使用了worksheet_write_number函数写入的,在小白的电脑上,系统设置的默认字体是宋体。仅此而已。

如果想要对这个细节问题进行修复,请参看小白上一篇博客libxlsxwriter设置字体格式

ps: 条件格式中还有很多更简单的用例,比如说找一个等于、大于、小于某个阈值的数,这种情况下不需要用到本文中提到的LXW_CONDITIONAL_TYPE_FORMULA类型,只需要使用LXW_CONDITIONAL_TYPE_CELL即可,具体的使用方法可以直接查看libxlsxwriter的官方例程,小白觉得如果能够掌握本文所说的这个“高级”案例,应该不难掌握更简单的官方例程。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/341046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统(一): 进程和线程,进程的多种状态以及进程的调度算法

文章目录前言一、进程和线程1. 进程2. 线程二、进程和线程的区别(面试常问)三、进程调度算法3.1. 批处理系统3.2. 交互式系统3.2.1 时间片轮转3.2.2 优先级调度3.2.3 多级别反馈队列3.3. 实时系统四、进程的状态五、进程同步5.1 什么是进程同步5.2 进程同步应该遵循的几点原则前…

Qt 学习(四) —— QGridLayout栅格布局

目录一、QGridLayout布局规则二、创建QGridLayout三、成员函数1. 控件间距2. 可拉伸控件(弹簧)3. 最小行高/列宽4. 行数和列数5. 锁定纵横比6. 添加控件7. 添加布局8. 设置栅格布局原点位置9. 操作布局项9.1 访问布局项9.2 删除布局项9.3 通过索引获取布…

Git教程个人分享:如何将一个本地项目上传至远程仓库的流程

前言: 今天来分享一下,关于Git的一些教程,同时这也是我自己曾今学习Git时候的笔记,之所以更,也是方便后期自己可以去回顾,当然后面也会出一部分关于Git其他操作方面的内容。 这次我们分享的是&#xff0c…

基于JavaScript的Web端股票价格查看器——大道

🐶 基于JavaScript的Web端股票价格查看器——大道 一、项目背景 当下互联网发展迅速,互联网已经不断向传统金融领域渗透。在互联网上有大量金融领域的数据,如何利用好这些数据,对于投资者来说是十分重要的一件事情。股票价格实时…

JavaSE学习day4_01 循环for,while,do...while

1. 循环高级 1.1 无限循环 for、while、do...while都有无限循环的写法。 最为常用的是while格式的。 因为无限循环是不知道循环次数的,所以用while格式的 代码示例: while(true){} 1.2 跳转控制语句(掌握) 跳转控制语句&…

MySQL 插入数据

数据库与表创建成功以后,需要向数据库的表中插入数据。在 MySQL 中可以使用 INSERT 语句向数据库已有的表中插入一行或者多行元组数据。 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。 语法 以下为向MySQL数据表…

51单片机——步进电机实验,小白讲解,相互学习

步进电机简介: 步进电机是将电脉冲信号转变为角位移或多线位移的开源控制元件。在非超载的情况下,电机的转速,停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机…

Android - 自动系统签名

一、系统签名 以下是两类应用开发场景: 普通应用开发:使用公司自定义 keystore 进行签名,如:微信、支付宝系统应用开发:使用 AOSP 系统签名或厂商自定义 keystore 进行签名,如:设置、录音 系…

数学建模拓展内容:卡方检验和Fisher精确性检验(附有SPSS使用步骤)

卡方检验和Fisher精确性检验卡方拟合度检验卡方独立性检验卡方检验的前提假设Fisher精确性检验卡方拟合度检验 卡方拟合度检验概要:卡方拟合度检验也被称为单因素卡方检验,用于检验一个分类变量的预期频率和观察到的频率之间是否存在显著差异。 卡方拟…

第一部分:简单句——第二章:简单句的补充

简单句的核心构成:一主一谓 主语/宾语/表语 可以变成名词/代词/doing/to do 谓语动词有四种核心变化:三态 一否 时态语态情态否定 简单句的核心:将简单句给写对 简单句的补充:将简单句给写的更好、更充分 简单句的补充 1、限定…

计算机网络之HTTP04ECDHE握手解析

DH算法 离散读对数问题是DH算法的数学基础 (1)计算公钥 (2)交换公钥,并计算 对方公钥^我的私钥 mod p 离散对数的交换幂运算交换律使二者算出来的值一样,都为K k就是对称加密的秘钥 2. DHE算法 E&#…

DNS 原理入门指南(一)

DNS 是互联网核心协议之一。不管是上网浏览,还是编程开发,都需要了解一点它的知识。 本文详细介绍DNS的原理,以及如何运用工具软件观察它的运作。我的目标是,读完此文后,你就能完全理解DNS。 一、DNS 是什么&#xff1…

记录每日LeetCode 1138.字母板上的路径 Java实现

题目描述: 我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。 在本题里,字母板为board ["abcde", "fghij", "klmno", "pqrst", "uvwxy", "z"]&#x…

Linux重定向符、管道符讲解

目录 重定向 将命令与文件进行互动 输出重定向 输入重定向 管道符 将命令与命令互动起来 重定向 将命令与文件进行互动 重定向分类 一般情况下,Linux命令运行时都会打开一下三个文件 标准输入文件:stdin文件,文件描述符为0,Li…

自定义ESLint规则开发与使用

自定义eslint及使用 项目结构 |-eslint-plugin-demo //自定义eslint插件项目 | |-demo-app // 使用自定义eslint的测试应用 |-README.md 项目效果: github项目地址 自定义ESLint环境准备 安装脚手架 执行下列命令来安装开发eslint的脚手架。 yo(y…

中小学信息学相关编程比赛清单及报名网站汇总(C++类)

1、NOI系列比赛(CSP-J CSP-S NOIP NOI APIO CTSC IOI ISIJ等) NOI官网 NOI全国青少年信息学奥林匹克竞赛https://www.noi.cn/ 2、蓝桥杯青少年创意编程大赛 https://www.lanqiaoqingshao.cn/home 3、中国电子协会考评中心

数据结构 - Set 与 Map 接口介绍(TreeMap,HashMap,TreeSet,HashSet类)

文章目录前言1. Set / Map接口2. TreeSet类3. TreeMap 类4. HashSet 与 HashMap4.1 HashSet / HashMap 底层哈希表4.2 解决哈希冲突总结✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得…

神经网络基础知识

神经网络基础知识 文章目录神经网络基础知识一、人工神经网络1.激活函数sigmod函数Tanh函数Leaky Relu函数分析2.过拟合和欠拟合二、学习与感知机1.损失函数与代价函数2. 线性回归和逻辑回归3. 监督学习与无监督学习三、优化1.梯度下降法2.随机梯度下降法(SGD)3. 批量梯度下降法…

JavaScript系列之new运算符

文章の目录一、什么是new?二、new经历了什么过程?三、new的过程分析四、其他作用参考写在最后一、什么是new? 众所周知,在JS中,new的作用是通过构造函数来创建一个实例对象。 像下面这样:(和普…

Centos篇-Centos Minimal安装

安装Centos Minimal 下载镜像 由于使用Centos主要是安装K8s以及使用K8s或者docker安装各种服务,可以理解为就是单纯的服务器使用,所以不需要GUI,直接使用Centos的Server版本。 所以选择centos的minimal版本进行下载: 地址&#…