服务器上的代码导出Excel文件,核心思路是让代码“生成”Excel文件,而非直接下载服务器文件夹你在服务端用代码扫描目标目录,把文件清单或代码内容写进Excel工作表,再通过HTTP响应或SSH把文件拉回本地,这就是最稳妥的解法。
很多朋友第一次遇到这个问题,以为要把服务器上的某个文件夹整个“变成”Excel,这个理解有偏差,服务器上的代码只能通过脚本去“读”和“写”,Excel文件本质上是代码运行时生成的新文件,而不是对现有文件夹做格式转换,搞清楚这个底层逻辑,后面的操作就顺了。
明确需求:你是要导出文件清单,还是导出代码内容?
动手之前,先问自己一句:到底要什么?这是两个完全不同的场景。
- 场景A:文件清单导出把服务器某个目录下的文件名、大小、修改时间、代码行数整理成Excel表格,这种需求常见于项目交接、代码审计、工作量统计。
- 场景B:代码内容导出把代码文件里的源码直接写进Excel单元格,方便评审、归档、或非技术人员查阅,这种需求常见于给业务部门看代码逻辑,或者做离线备份。
场景不同,写法完全不同,如果你上来就搜“服务器上的代码怎么导出excel文件夹”,大概率你遇到的是场景A要一份清单,而不是一整坨源码,但下面两种方案我都会覆盖,你按需取用。
最常用方案:Python脚本扫描目录,直接生成Excel表格
目前主流服务器环境(Linux居多)基本都预装或可快速安装Python,用Python做这件事,路径最短,代码也最容易看懂。
环境准备:确认Python和依赖库
先登录服务器,敲两行命令确认环境:
python3 --version pip3 list | grep -E "openpyxl|pandas"
如果没有相关库,安装命令如下(二选一):
pip3 install openpyxl # 或者用 pandas + openpyxl 引擎 pip3 install pandas openpyxl
行业共识认为,openpyxl是处理Excel读写最稳定的Python库,支持xlsx格式,兼容WPS和微软Office全系列。
核心代码:导出文件清单到Excel
import os
from openpyxl import Workbook
target_dir = "/var/www/project" # 换成你的真实目录
output_file = "code_list.xlsx"
wb = Workbook()
ws = wb.active= "代码文件清单"
ws.append(["文件名", "相对路径", "大小(KB)", "修改时间", "代码行数"])
for root, dirs, files in os.walk(target_dir):
# 跳过不需要的目录
if ".git" in root or "node_modules" in root or "venv" in root:
continue
for name in files:
file_path = os.path.join(root, name)
# 只统计代码文件,按后缀过滤
if not name.endswith(('.py', '.java', '.js', '.php', '.go', '.c', '.cpp', 
'.h', '.vue')):
continue
rel_path = os.path.relpath(file_path, target_dir)
size = round(os.path.getsize(file_path) / 1024, 2)
mtime = os.path.getmtime(file_path)
# 统计代码行数
try:
with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
line_count = sum(1 for _ in f)
except:
line_count = 0
ws.append([name, rel_path, size, mtime, line_count])
wb.save(output_file)
print(f"导出完成,文件位于: {os.path.abspath(output_file)}")
运行后,服务器上会生成一个code_list.xlsx文件,然后用scp或rz命令把它拉回本地即可:
scp root@你的服务器IP:/var/www/project/code_list.xlsx ./
编码乱码问题:服务器导出excel乱码怎么办
大多数人在这一步翻车生成的文件在服务器上打开一切正常,拿到Windows上一打开全乱码,或者中文文件名直接变问号,这个坑有几个成因,逐一排查:
- 服务器系统语言不是UTF-8,执行
echo $LANG查看,如果输出非en_US.UTF-8或zh_CN.UTF-8,在运行Python脚本前先执行export LANG=zh_CN.UTF-8。 - Excel打开xlsx时对UTF-8编码支持不友好,解决方法是写一个CSV文件,并加上BOM头:
import csv
with open('code_list.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(["文件名", "路径", "大小(KB)", "修改时间"])
# ...写入数据
然后打开Excel,用“数据→自文本”导入这个CSV,选择UTF-8编码,中文就正常了。
- 代码读取文件本身编码初始化,如果你要导出代码内容到Excel,读文件时务必加
errors='ignore'参数,否则遇到GBK或其他编码的文件,脚本直接中断。
linux服务器导出excel文件,核心操作路径就是Python+openpyxl,没有更短的路,别去折腾PHPExcel或者Node.js的xlsx库,Python生态的成熟度和文档丰富度碾压一切。
备选方案:Shell命令配合纯CSV导出
有些服务器环境极其精简,连Python都不方便装,但一定有find和ls,这种时候就走Shell路线:
find /var/www/project -type f ( -name ".java" -o -name ".py" ) > code_list.txt # 加上文件名、大小、修改时间等字段 find /var/www/project -type f -name ".java" -printf "%ft%pt%st%TY-%Tm-%Tdn" > code_list.tsv
TSV文件用Excel打开时,直接复制到Excel里,用“数据→分列→按制表符分割”就能变成规整表格。
但这条路有个硬伤:没有代码行数统计,如果你只需要文件清单,Shell方案足够;如果还想要行数、复杂度等指标,绕不开Python。
更常见的业务场景:tomcat服务器导出excel文件给用户下载
上面聊的是运维视角,还有一种高频需求:你是开发人员,要让用户在浏览器里点击按钮,就能从tomcat服务器上导出excel文件(通常是数据库查询结果),这个场景的写法完全不同。
Java后端导出Excel(POI框架)
Java服务器导出excel文件,绝大多数团队用的是Apache POI,关键代码如下:
// 设置响应头,告诉浏览器这是下载文件
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=code_export.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("代码文件");
// 创建表头、填充数据...
workbook.write(response.getOutputStream());
几个易错点:
Content-Disposition里的文件名必须是URL编码,否则中文文件名导出后乱码,写URLEncoder.encode("代码导出", "UTF-8")。- tomcat默认上传/下载大小有限制,如果是大文件导出,需要调整
server.xml中的maxPostSize和连接器属性。 - 内存溢出问题,数据量大时别用
XSSFWorkbook(它把整个Excel放内存),改用SXSSFWorkbook流式写入。
导出后文件打不开或提示损坏
这个问题相当一部分原因是响应头设置错误,或者workbook.write()和response.getOutputStream()之间还有多余的输出。记住一个铁律:workbook.write之后立即return,中间不做任何log输出或二次写入操作,否则二进制流被污染,文件必坏。
导出:把源码写进Excel单元格
如果你的需求是“导出代码内容”,而不是文件清单,思路略有不同,以Python为例,核心逻辑是读文件内容,逐行写入Excel单元格,并设置单元格换行格式:
from openpyxl import Workbook
from openpyxl.styles import Alignment
wb = Workbook()
ws = wb.active= "源码"
for root, dirs, files in os.walk("/var/www/project"):
for name in files:
if name.endswith(".java"):
full_path = os.path.join(root, name)
with open(full_path, 'r', encoding='utf-8', errors='ignore') as f:
lines = f.readlines()
# 每个文件占一块区域,首行写路径
start_row = ws.max_row + 1
ws.cell(row=start_row, column=1, value=f"文件路径: {full_path}")
for idx, line in enumerate(lines):
ws.cell(row=start_row + 1 + idx, column=1, value=line.rstrip())
break # 只处理根目录一层,不递归
wb.save("code_dump.xlsx")
注意:导出代码内容时,xlsx单单元格的字符数上限是32767,如果代码文件非常长,需要在写入前做截断或拆分到多行,这个限制在官方文档中有明确说明,很多新手第一次遇到会以为自己的代码丢了。
导出效率优化:面对上百个文件时怎么提速
如果你的服务器上代码文件数量很大(比如说几千个),直接写入Excel会极慢,这时候建议分两步走:
- 先用脚本把文件清单或代码内容写入CSV(纯文本IO,速度快一个数量级)。
- 再用Python或本地Excel打开CSV,另存为xlsx。
实测下来,CSV转Excel的耗时几乎可以忽略,而直接写xlsx文件的耗时主要花在xlsxwriter(另一个Python库)的压缩算法上。
另一个提速技巧:使用multiprocessing并行扫描目录,对于大项目(比如一个包含数千个文件的微服务代码库),单线程扫描可能需要几十秒,并行处理后可以压到几秒内,但要注意,写入Excel时必须回到主进程汇总,不能多进程同时写同一个文件。
安全与权限:导出操作本身也有坑
服务器上的代码通常涉及敏感信息,导出Excel前要想清楚几点:
- 权限边界:运行的Python或Java进程,尽量用最小化权限账号,不要直接用root跑导出脚本,否则一旦脚本被篡改,攻击者可以导出整个文件系统。
- 脱敏处理:代码中的数据库连接串、API密钥、密码等敏感信息,在导出前做正则替换,这个行业有血的教训有些公司把含硬编码密码的代码导出给外包团队,直接导致数据泄露。
- 访问日志:如果是Web端触发导出,务必在nginx或tomcat访问日志中记录导出操作的时间、IP、用户ID,便于事后审计。
Q&A:服务器导出excel的常见疑问
Q: 服务器上的代码导出excel文件夹,能用现成工具吗,比如宝塔面板?
A: 宝塔面板本身不提供“导出代码到Excel”的功能,它只能在文件管理里批量压缩、下载,但你可以通过宝塔的“终端”功能登录服务器,执行Python脚本或Shell命令生成Excel文件,然后再在文件管理器里下载到本地。
Q: 导出的Excel文件在Mac和Windows上打开显示不一致怎么办?
A: 这通常是因为两个系统的默认字体不同,导致单元格宽度和行高自适应异常,解决方案是在生成Excel时,手动指定单元格的列宽和行高,并设置字体为“等线”或“Microsoft YaHei”,这两个字体在Mac和Windows上都有对应替代,显示效果接近,列宽建议用字符数估算:中文按2个字符宽度算,英文按1个字符宽度算,实测误差最小。
Q: 服务器导出excel文件很慢,有什么通用调优思路?
A: 三个方向:第一,检查是否是网络传输瓶颈内网导出让运维确认带宽;第二,检查是否是Excel写入逻辑慢换成CSV中间格式再转;第三,如果是Java POI导出慢,把workbook换成SXSSFWorkbook(流式版本),可以显著降低内存占用和写入时间。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/751656.html





