记录一个 C# 导出 Excel 的坑

?  简介

其实该文章并没有什么技术含量,只是记录下个人心得。在以后有朋友遇到类似问题,可以借鉴下,或者遇到相同问题时的提供个参考方向。

 

也算我的一个经历吧,这个问题我花了足足一天多的时间才找到问题,解决问题。因为刚开始进公司,对项目不怎么熟,所以有点慢!话不多说,上正题:

 

1.   相关描述

1)   项目导出 Excel 还是采用比较原始的方式,对,就是我们大名鼎鼎的 Microsoft.Office.Interop.Excel.dll 程序集,使用包括以下对象:

Microsoft.Office.Interop.Excel.Application

Microsoft.Office.Interop.Excel.Workbook

Microsoft.Office.Interop.Excel.Worksheet

 

2)   问题描述

可以正常导出,但是打开 Excel 文件时:

1.   有些单元格有数据,但是显示为空白

记录一个 C# 导出 Excel 的坑

2.   会显示“受保护的视图”的警告

记录一个 C# 导出 Excel 的坑

 

2.   解决办法

1)   首先说第一个问题

进过一番调试,发现是因为该单元格的数据(也就是字符串)的字节长度大于 255 bytes 时,就会出现显示空白的情况。如果小于 255 个字节,则正常显示。

 

2)   然后,忽略第一个问题,尝试解决第二个问题“受保护的视图”的警告

1.   经过,在网上找了一些导出 Excel 的代码,各种尝试发现,原来网上的代码导出并不会出现以上问题;

 

2.   好,问题可以断定,是我们导出的代码出问题了,再经过一番“代码分段执行法”(我找问题的一个方法)或者“代码替换执行”,最后将问题指向了下面这行代码:

workbook.SaveAs(filePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel7, m_objOpt, m_objOpt, m_objOpt, m_objOpt, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt, m_objOpt, m_objOpt, m_objOpt);

这段代码没什么问题,主要是标红的这个参数。没错,就是这个参数导致了整个问题。

 

3.   以上这个参数表示导出为"Micorosoft   Excel   5.0/95   工作薄(*.xls)" 格式的 Excel. 什么意思?其实我也不知道,应该是一个 Excel 内部版本号?

参考:https://www.cnblogs.com/mingjing/p/5955725.html

 

4.   该参数是一个枚举,后来了解到指定为 XlFileFormat.xlWorkbookNorma 即可,再次运行程序,导出 Excle, OK,没有了警告,长字符也正常显示了。

记录一个 C# 导出 Excel 的坑

 

3.   友情提示

xls 表示适用于 Excel97-2003 的版本;

xlsx 则表示当前最新的工作簿后缀名,适用于 Excel2007及以上版本。

 

如果导出的 Excel 文件,在打开时报类似“格式不一致”的问题,则可以判断是否是因为文件后缀(如:*.xls)与导出时,代码中指定的格式是否一致?不一致时,就会引发该问题。

记录一个 C# 导出 Excel 的坑

上一篇:WIN10 报错 "此共享需要过时的SMB1协议,而此协议是不安全"的解决方法


下一篇:win安装Redis