json转excel,读取json文件写入到excel中【rust语言】

 一、rust代码

将json文件写入到 excel中。(保持json :key原始顺序)

use indexmap::IndexMap;
use serde::Deserialize;
use serde_json::{Value, from_str};
use std::error::Error;
use std::io::{self, Write};
use std::path::{Path};
use rust_xlsxwriter::{Workbook, Format, RowNum};
use std::fs;


#[derive(Debug, Deserialize)]
struct DataItem {
    #[serde(flatten)]
    data: IndexMap<String, Value>,
}

fn main() -> Result<(), Box<dyn Error>> {
    let args: Vec<String> = std::env::args().collect();
    if args.len() < 3 {
        writeln!(io::stderr(), "Usage: {} <json_file> <excel_file>", args[0]).unwrap();
        std::process::exit(1);
    }

    let json_path = &args[1];
    let excel_file_path = &args[2];

    // 检查输入文件是否存在
    if !Path::new(json_path).exists() {
        return Err("输入文件不存在".into());
    }

    // 读取并解析JSON
    let json_str = fs::read_to_string(json_path)
        .map_err(|e| format!("读取JSON文件失败: {}", e))?;
    let data_items: Vec<DataItem> = from_str(&json_str)
        .map_err(|e| format!("解析JSON失败: {}", e))?;

    // 创建Excel文件
    convert_json_to_excel(&data_items, excel_file_path)?;

    println!("Excel文件已生成: {}", excel_file_path);
    Ok(())
}

fn convert_json_to_excel(data_items: &[DataItem], output_path: &str) -> Result<(), Box<dyn Error>> {
    // 创建一个新的工作簿
    let mut workbook = Workbook::new();

    // 添加一个工作表
    let mut sheet = workbook.add_worksheet();

    // 创建标题格式
    let header_format = Format::new()
    .set_bold()
    .set_align(rust_xlsxwriter::FormatAlign::Center)
    .set_border(rust_xlsxwriter::FormatBorder::Thin);

    // 创建数据格式
    let mut data_format = Format::new()
    .set_border(rust_xlsxwriter::FormatBorder::Thin)
    .set_align(rust_xlsxwriter::FormatAlign::Left);



    if data_items.is_empty() {
        return Err("JSON数组为空".into());
    }

    // 获取第一个对象的键值对,保持原始顺序
    let first_item = &data_items[0];
    let ordered_keys: Vec<String> = first_item.data.keys().cloned().collect();

    // 写入表头
    for (col, key) in ordered_keys.iter().enumerate() {
        sheet.write_string_with_format(0, col as u16, key,&header_format)?;
    }

    // 写入数据
    for (row, item) in data_items.iter().enumerate() {
        for (col, key) in ordered_keys.iter().enumerate() {
            if let Some(value) = item.data.get(key) {
                let cell_value = match value {
                    Value::Null => "null".to_string(),
                    Value::Bool(b) => b.to_string(),
                    Value::Number(n) => n.to_string(),
                    Value::String(s) => s.clone(),
                    Value::Array(a) => serde_json::to_string(a).unwrap_or_else(|_| "[]".to_string()),
                    Value::Object(o) => serde_json::to_string(o).unwrap_or_else(|_| "{}".to_string()),
                };
                sheet.write_string_with_format((row + 1) as u16 as RowNum, col as u16, &cell_value,&data_format)?;
            }
        }
    }

    // 调整列宽
    for col in 0..ordered_keys.len() {
        sheet.set_column_width(col as u16, 20)?;
    }

    // 保存工作簿
    workbook.save(output_path)?;

    Ok(())
}

二、json 示例 

 [
  {
    "id": 1,
    "name": "张三",
    "age": 28,
    "email": "zhangsan@example.com"
  },
  {
    "id": 2,
    "name": "李四",
    "age": 34,
    "email": "lisi@example.com"
  },
  {
    "id": 3,
    "name": "王五",
    "age": 22,
    "email": "wangwu@example.com"
  },
  {
    "id": 4,
    "name": "赵六",
    "age": 45,
    "email": "zhaoliu@example.com"
  },
  {
    "id": 5,
    "name": "孙七",
    "age": 31,
    "email": "sunqi@example.com"
  }
]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

理想火车站定位(字节青训)

题目 小F是A市的市长&#xff0c;正在计划在A市新建一个火车站以方便市民的日常出行。市区内的街道布局十分规整&#xff0c;形成网格状。从一个位置[x1, y1]到另一个位置[x2, y2]的距离计算方法为 |x1 - x2| |y1 - y2|&#xff0c;即曼哈顿距离。 在初步考察后&#xff0c;…

5位机械工程师如何共享一台工作站的算力?

在现代化的工程领域中&#xff0c;算力已成为推动创新与技术进步的关键因素之一。对于机械工程师而言&#xff0c;强大的计算资源意味着能够更快地进行复杂设计、模拟分析以及优化工作&#xff0c;从而明显提升工作效率与项目质量。然而&#xff0c;资源总是有限的&#xff0c;…

使用微信云开发,实现链接激活微信小程序(微信内部和外部H5访问)

首先小程序项目开发&#xff0c;需得支持云开发如何开通云开发&#xff1f;&#xff08;网上教程很多&#xff0c;也很全面&#xff0c;这里仅带过&#xff09; 配置云函数在项目根目录找到 project.config.json 文件&#xff0c;新增 cloudfunctionRoot 字段&#xff0c;指定本…

NVM 介绍及使用指南

在日常的开发工作中&#xff0c;我们往往会遇到需要在同一台机器上同时管理多个版本的 Node.js 的情况。为了解决这个问题&#xff0c;我一个同事推荐了NVM&#xff08;Node Version Manager&#xff09;。NVM 是一个用于管理 Node.js 版本的工具&#xff0c;可以方便地在不同的…

vscode 全局搜索的用法:

搜索栏最右边功能是区分大小写&#xff0c;全字匹配&#xff08;比如搜索abc&#xff0c;就不会显示abcd或者ab这些内容&#xff09;&#xff0c;使用正则表达式。变成高亮就是开启对应功能。包含的文件&#xff1a;这栏里如果最右边高亮填入带路径的文件&#xff0c;指的是在文…

如何从 Nutanix 迁移至 SmartX 超融合?解读 4 类迁移方案和 2 例迁移实践

随着 Nutanix&#xff08;路坦力&#xff09;将大陆区域的销售和部分维保工作交由联想负责&#xff0c;不少用户也在寻求 Nutanix 的替代方案。现阶段是否有必要换掉 Nutanix&#xff1f;有哪些成熟的国产替代方案&#xff1f;这些方案在性能和功能上是否具备与 Nutanix 同等的…

C++常见概念问题(3)

C常见概念问题&#xff08;3&#xff09; 1. 构造函数的初始化顺序 基类构造函数&#xff1a;在派生类的构造函数中&#xff0c;基类的构造函数在派生类构造函数体执行之前调用。 成员变量初始化&#xff1a;类中的成员变量会按照其在类中声明的顺序进行初始化&#xff0c;而…

「QT」几何数据类 之 QVector2D 二维向量类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

运维智能化转型:AIOps引领IT运维新浪潮

1. AIOps是什么&#xff1f; AIOps&#xff08;Artificial Intelligence for IT Operations&#xff09;&#xff0c;即人工智能在IT运维中的应用&#xff0c;通过机器学习技术处理运维数据&#xff08;如日志、监控信息和应用数据&#xff09;&#xff0c;解决传统自动化运维…

C++练习 二维数组的应用

1&#xff09;超女有3个小组&#xff0c;每组有4名选手&#xff0c;请提供一个界面&#xff0c;输入每个超女的体重&#xff0c;然后&#xff0c;计算出每组的超女的平均体重和全部超女的平均体重。 #include <iostream> using namespace std;int main() {float sum1 0…

Vue3安装、创建到使用

vue安装 npm install vuenext # 全局安装 vue-cli npm install -g vue/cli #更新插件 项目中运行 vue upgrade --nextvue create 命令 vue create [options] <app-name> options 选项可以是&#xff1a; -p, --preset <presetName>&#xff1a; 忽略提示符并使用已…

JavaWeb:文件上传1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

第2章2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步&#xff1a;市场趋势判断2.3.2 第二步&#xff1a;竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步&#xff1a;客户分析2.3.4 第四步&#xff1a;产品定义2.3.5 第五步&#xff1a;开发执…

视频播放相关的杂记

基于QT FFMPEG设计一款 RTMP协议推流、视频录制软件 实现的功能&#xff1a; &#xff08;1&#xff09;将摄像头视频流 麦克风音频流合并&#xff0c;并推到流媒体服务器 &#xff08;2&#xff09;将摄像头视频流 麦克风音频流保存到本地磁盘 基于QtFFMPEG设计一款RTM…

oracle如何创建两个数据库,以及如何用navicat连接,监听、数据泵

项目背景oracle11g, 已经非常老了&#xff0c; 2017年的左右&#xff1b;谨慎参考 W11直接搜索就行 dbca唯一需要注意的地方就是一定一定一定要以管理身份运行&#xff0c;否则会提示各种因为文件权限问题报的错误 然后弹出程序提示&#xff0c;图形化开始操作了&#xff1b; …

LeetCode 509.斐波那契数

动态规划思想 五步骤&#xff1a; 1.确定dp[i]含义 2.递推公式 3.初始化 4.遍历顺序 5.打印dp数组 利用状态压缩&#xff0c;简化空间复杂度。在原代码中&#xff0c;dp 数组保存了所有状态&#xff0c;但实际上斐波那契数列的计算只需要前两个状态。因此&#xff0c;我们…

Qml 中的那些坑(七)---ComboBox嵌入Popup时,滚动内容超过其可见区域不会关闭ComboBox弹窗

【写在前面】 最近在写信息提交 ( 表单 ) 的窗口时发现一个奇怪的 BUG&#xff1a; 其代码如下&#xff1a; import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Window 2.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")B…

Softing工业将在纽伦堡SPS 2024上展示Ethernet-APL现场交换机

今年&#xff0c;Softing工业将在纽伦堡SPS贸易展览会上展示aplSwitch Field —— 一款先进的过程自动化解决方案。这款16端口以太网高级物理层&#xff08;APL&#xff09;现场交换机的防护等级高达IP30&#xff0c;可提供从应用到现场级别的无缝以太网连接&#xff0c;专为Ex…

Local Transfer 致力于更加便捷地共享传输文件

软件主页&#xff1a;https://illusionna.github.io/LocalTransfer

分布式——BASE理论

简单来说&#xff1a; BASE&#xff08;Basically Available、Soft state、Eventual consistency&#xff09;是基于CAP理论逐步演化而来的&#xff0c;核心思想是即便不能达到强一致性&#xff08;Strong consistency&#xff09;&#xff0c;也可以根据应用特点采用适当的方…