C# 使用Microsoft.Office.Interop.Excel将DataTable写入Excel报错如何处理
问题根因
报错的直接原因是你生成的文件名包含Windows系统禁止使用的特殊字符:你在拼接文件名时使用了DateTime.Now.ToString("dd-MM-yy_hh:mm:ss"),输出的时间部分带有冒号:,该字符属于系统禁止出现在文件名中的字符,直接触发保存失败。
修复方案
- 修改时间格式,替换非法的冒号字符
将生成文件路径的代码中的时间格式调整,把冒号替换为下划线、短横线等合法字符即可,修改后代码如下:
- 修改时间格式,替换非法的冒号字符
// 原代码 // string location = Path.Combine(dir, "HavingDues_log_"+name+"_" + DateTime.Now.ToString("dd-MM-yy_hh:mm:ss") + ".xls"); // 修改后代码 string location = Path.Combine(dir, "HavingDues_log_"+name+"_" + DateTime.Now.ToString("dd-MM-yy_hh-mm-ss") + ".xls");
- 过滤其他变量的非法字符
如果name变量来自数据库、用户输入等不可控来源,建议对name也做非法字符过滤,避免特殊字符导致报错,参考代码:
- 过滤其他变量的非法字符
char[] invalidFileNameChars = Path.GetInvalidFileNameChars(); // 把name中的非法字符替换为下划线 string safeName = new string(name.Select(c => invalidFileNameChars.Contains(c) ? '_' : c).ToArray()); string location = Path.Combine(dir, "HavingDues_log_"+safeName+"_" + DateTime.Now.ToString("dd-MM-yy_hh-mm-ss") + ".xls");
- 确认目录写入权限
部分Windows设备会限制普通权限程序写入C盘根目录的文件夹,你可以先手动打开C:\Output\Log\HavingDuesLog目录,尝试新建文件确认权限正常,也可以将输出目录修改为当前用户的个人目录,避免权限问题:
- 确认目录写入权限
// 将输出目录设置为我的文档下的HavingDuesLog文件夹 string dir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "HavingDuesLog");
- 兼容高版本Excel格式
如果你使用的是Excel 2007及以上版本,建议保存为xlsx格式,避免旧版xls格式的兼容限制,修改两处即可: - 将文件名后缀从
.xls改为.xlsx - 将SaveAs方法的格式参数从
XlFileFormat.xlWorkbookNormal改为XlFileFormat.xlOpenXMLWorkbook
- 兼容高版本Excel格式
内容的提问来源于stack exchange,提问作者Moeez
相关产品推荐
相关产品推荐

