C#使用NPOI修改xlsx文件,文件损坏

aogusidulw 2015-01-07 11:42:09
对excel里的数据修改后再保存回去,一直有问题,于是直接写了个最简单的

FileStream fs = new FileStream("D:\\test.xlsx", FileMode.Open, FileAccess.Read);
XSSFWorkbook wb = new XSSFWorkbook(fs);
using (FileStream fs1 = File.OpenWrite("D:\\test.xlsx"))
{
wb.Write(fs1);
}
直接读取保存然后再打开test.xlsx的时候还是会报错



如果下面不是覆盖原有的xlsx文件而是新建
using (FileStream fs1 = File.OpenWrite("D:\\NEW1231313test.xlsx"))
{
wb.Write(fs1);
}
就没有问题,可以打开

这是怎么回事呢??
...全文
1585 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-01-07
  • 打赏
  • 举报
回复
其实你看OFFICE自己就是这么干的,打开xlsx后会生成一个前缀名为~$的隐藏临时文件,而打开xls的时候不会生成临时文件
於黾 2015-01-07
  • 打赏
  • 举报
回复
xls文件没有文件头的信息 所以你在txt里写点东西然后把扩展名改成xls,用excel也能打开,最多告诉你格式不符,不会告诉你文件损坏
引用 6 楼 aogusidulw 的回复:
[quote=引用 2 楼 Z65443344 的回复:] 如果你不管原来的文件里到底有什么,就是想覆盖,可以删除原文件之后新建
我也想这么干来着,有人说万一删完报错,没覆盖成文件不就都没了吗[/quote] 你可以先生成个扩展名为.tmp的临时文件,如果生成成功了,再把原文件删除,并修改扩展名 或者将新文件生成到临时文件夹,使用File.Move指令将原文件替换
aogusidulw 2015-01-07
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
如果你不管原来的文件里到底有什么,就是想覆盖,可以删除原文件之后新建
我也想这么干来着,有人说万一删完报错,没覆盖成文件不就都没了吗
aogusidulw 2015-01-07
  • 打赏
  • 举报
回复
引用 3 楼 nicholasvb 的回复:
我也遇到这个问题,后来把excel文件换成xls版本后,就没有问题了
xls是没问题,但是人家的文件就是xlsx的,不能给他将版本啊
aogusidulw 2015-01-07
  • 打赏
  • 举报
回复
引用 1 楼 Z65443344 的回复:
xlsx不是文本文档,文件头里会有文件大小等信息 所以你应该先读出来,修改内容后写回去,而不是用空的文件流去直接覆盖它,那样会造成文件头里显示文件字节数为0,可是后面其实还有数据
我这就是直接全读出来,然后全部覆盖的啊
nicholasvb 2015-01-07
  • 打赏
  • 举报
回复
我也遇到这个问题,后来把excel文件换成xls版本后,就没有问题了
於黾 2015-01-07
  • 打赏
  • 举报
回复
如果你不管原来的文件里到底有什么,就是想覆盖,可以删除原文件之后新建
於黾 2015-01-07
  • 打赏
  • 举报
回复
xlsx不是文本文档,文件头里会有文件大小等信息 所以你应该先读出来,修改内容后写回去,而不是用空的文件流去直接覆盖它,那样会造成文件头里显示文件字节数为0,可是后面其实还有数据

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧