当前位置: 首页 > news >正文

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());}// 读取并解析JSONlet 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"
  }
]

http://www.lryc.cn/news/482301.html

相关文章:

  • Java面试要点06 - static关键字、静态属性与静态方法
  • 动态规划-背包问题——416.分割等和子集
  • Pr:视频过渡快速参考(合集 · 2025版)
  • 网络安全---安全见闻2
  • 解决因为TortoiseSVN未安装cmmand line client tools组件,导致idea无法使用svn更新、提交代码
  • Ubuntu 20.04安装CUDA 11.0、cuDNN 8.0.5
  • 鸿蒙 APP 发布上架
  • 【C++笔记】C++三大特性之继承
  • 如何在CentOS 7上搭建SMB服务
  • linux详解,基本网络枚举
  • 5G智能对讲终端|北斗有源终端|北斗手持机|单兵|单北斗
  • 第七部分:2. STM32之ADC实验--AD多通道(AD采集三路传感器模块实验:光敏传感器、热敏传感器、反射式传感器附赠温湿度传感器教程)
  • js.零钱兑换
  • GitHub 上的开源项目推荐
  • 实现Reactor反应堆模型:框架搭建
  • UE5 样条线组件(未完待续)
  • 计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
  • sql速度优化多条合并为一条语句
  • 用 PHP或Python加密字符串,用iOS解密
  • docker容器启动报错error creating overlay mount to /var/lib/docker/overlay2解决办法
  • 人工智能在智能家居中的应用
  • MySQL数据库备份与恢复:全面深入指南
  • 前端请求后端php接口跨域 cors问题
  • 【软件工程】ATAM架构权衡评估方法
  • MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击
  • c和cpp的异常处理
  • monkey-安卓稳定性测试
  • 【贪心算法】贪心算法三
  • LeetCode 40-组合总数Ⅱ
  • STM32WB55RG开发(1)----开发板测试