导出超万条DataTable为Excel:FileStream生成文件损坏问题求助
解决大型DataTable导出Excel时的文件损坏问题
你的代码核心问题是:生成的是制表符分隔的Unicode纯文本内容,但错误地使用了.xlsx扩展名。.xlsx是基于Open XML的压缩包格式,并非纯文本文件,因此Excel会提示文件损坏、格式不匹配。
无需依赖任何类库的快速解决方法:
方案一:修改文件扩展名(推荐)
将文件扩展名改为.tsv(制表符分隔值)或.txt,Excel可以直接识别并正确打开这类文本文件,且写入速度完全保留原有的高效性。
修改后的代码:
string path = path + "someFilename.tsv"; // 把xlsx改成tsv using (FileStream sw = File.Create(path)) { // 写入表头,用制表符分隔 var header = "Artikelnummer\tHersteller\tBeschreibung\tNettopreis\tBruttopreis\tZustand\tP/N\tKategorie I\tKategorie II\tKategorie III\tShop-Link\n"; var data = Encoding.Unicode.GetBytes(header); sw.Write(data, 0, data.Length); foreach (DataRow r in dt.Rows) { var rowContent = $"{r["Artikelnummer"]}\t{r["Hersteller"]}\t{r["Bezeichnung"]}\t{r["Nettopreis"]}\t{r["Bruttopreis"]}\t{r["Zustand"]}\t{r["PN"]}\t{r["Kategorie I"]}\t{r["Kategorie II"]}\t{r["Kategorie III"]}\t{r["Link"]}\n"; data = Encoding.Unicode.GetBytes(rowContent); sw.Write(data, 0, data.Length); } }
方案二:生成CSV格式(逗号分隔)
如果更习惯CSV格式,只需把制表符\t换成逗号,,扩展名改为.csv即可,同样能被Excel直接识别。
补充说明
如果必须使用.xlsx扩展名,无需类库的话需要手动构建Open XML压缩包结构,这会大幅增加代码复杂度且失去速度优势,完全没必要——TSV/CSV格式在处理大数据量时的速度和便捷性远优于xlsx,且Excel支持完美。
内容的提问来源于stack exchange,提问作者NadiaBallshek
相关产品推荐
相关产品推荐

