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

一、rust代码

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

rust 复制代码
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" }

相关推荐
ratel️19 分钟前
小墨析 · Office Agent 日常办公不烧心
python·langchain·word·excel·fastapi·js·ppt
轻舟技术A1 小时前
Rust 重写 Pi:会话启动耗时降 91%,就绪内存少 78%
开发语言·后端·rust
unconditional2 小时前
外部命令改不了你的 shell:sdkm 怎么做到"回车即生效"
rust·开源
程工造Agent2 小时前
从 0 到 1 学 Codex 源码:为什么 let b = a 之后,a 就不能用了?
rust·ai编程
Norna2 小时前
方差怎么会是 −32:nushell math variance 的一次数值修复
rust
JavaPub-rodert2 小时前
王仕宇分享:Oxigraph 是什么?用 Rust + RocksDB 搭一个轻量 RDF/SPARQL 知识图谱数据库
数据库·rust·知识图谱
Logic1012 小时前
没有TextSplit函数的老版本也能拆分单元格的内容
excel·拆分数据·excel技巧·数据拆分·拆分单元格·textsplit·旧版excel
骑着蜗牛撵大象3273 小时前
用 Codex 批量做数字人商品口播视频:从分镜 JSON 到成片校验的流水线
java·ffmpeg·json·音视频·数字人·视频·codex
2601_967987373 小时前
你们都用Python实现了哪些自动化办公?
python·excel·自动化办公·1024程序员节·学习资料·跨平台操作
外收内放4 小时前
FastAPI猜字谜实战(3):把每一局存成JSON
开发语言·python·学习·json·fastapi