如何通过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
相关产品推荐
相关产品推荐

