You need to enable JavaScript to run this app. 如何通过shell脚本将MySQL查询结果输出到Excel的不同工作表
优惠活动
大模型
产品
解决方案
定价
更多

如何通过shell脚本将MySQL查询结果输出到Excel的不同工作表

多工作表Excel导出实现方案

你当前的需求完全可以通过Shell脚本实现,首先需要明确:你现有代码直接将查询结果重定向到.xlsx后缀文件,本质上生成的是纯文本TSV格式文件,并非标准Excel格式,天然不支持多工作表存储,需要借助轻量命令行工具完成标准Excel的多工作表合并。

前置依赖安装

需要先安装csvkit工具集和Gnumeric的ssconvert工具,对应不同系统安装命令如下:

  • Debian/Ubuntu系列:apt install csvkit gnumeric
  • RHEL/CentOS系列:yum install csvkit gnumeric
  • macOS:brew install csvkit gnumeric

可直接使用的脚本示例

#!/bin/bash

# 定义最终输出的Excel文件名
FINAL_EXCEL="query_result.xlsx"
# 清理旧文件避免冲突
rm -f ${FINAL_EXCEL}

# 按"查询SQL|工作表名称"格式配置你需要执行的所有查询
QUERY_LIST=(
    "select * from ITEMS|商品清单"
    "select * from USERS|用户列表"
    "select * from ORDERS|订单记录"
)

# 遍历执行查询、生成临时文件、合并到同一个Excel的不同工作表
for item in "${QUERY_LIST[@]}"; do
    IFS="|" read -r run_sql sheet_name <<< "${item}"
    # 注意去掉了原命令的-it参数,非交互执行不需要分配伪终端,避免报错
    docker exec mysql3 mysql -uroot -ppassword project -B -e "${run_sql}" | tail -n +2 > "tmp_${sheet_name}.tsv"
    
    if [ ! -f ${FINAL_EXCEL} ]; then
        # 第一个查询直接生成初始Excel文件
        in2csv --format tsv "tmp_${sheet_name}.tsv" --outfile ${FINAL_EXCEL} --sheet "${sheet_name}"
    else
        # 后续查询追加为新工作表
        csvmerge --outfile ${FINAL_EXCEL} --overwrite-sheets ${FINAL_EXCEL} <(in2csv --format tsv "tmp_${sheet_name}.tsv" --sheet "${sheet_name}")
    fi
done

# 清理所有临时文件
rm -f tmp_*.tsv

注意事项

  • 如果需要保留查询结果的表头,删除管道里的tail -n +2即可
  • 如果你不想安装过多依赖,也可以写一段简短的Python+pandas辅助脚本配合Shell调用,实现逻辑和上述流程完全一致

内容的提问来源于stack exchange,提问作者Foody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 19:06:04