读取xls文件和xlsx文件创建的版本号。

虽然xlsx声明的是向前兼容,但是不知道OleDb是不是也是这样,没有办法所以要读取文件版本,限定只能读取Excel2007保存的文件。

 using ICSharpCode.SharpZipLib.Zip;

 public const ushort BIFF8 = 0x0600;
public const ushort BIFF7 = 0x0500;
public static string GetExcelVersion(string fileName)
{
string version = string.Empty;
try
{
if (Path.GetExtension(fileName) == ".xls")
{
BinaryReader binReader = new BinaryReader(File.Open(fileName, FileMode.Open));
try
{
byte[] testArray = new byte[];
int count = binReader.Read(testArray, , ); if (count != )
{
// Reset the position in the stream to zero.
binReader.BaseStream.Seek(, SeekOrigin.Begin);
byte[] testArray2 = new byte[];
int count2 = binReader.Read(testArray2, , );
ushort BOF = binReader.ReadUInt16();
ushort Length = binReader.ReadUInt16();
ushort Version = binReader.ReadUInt16();
ushort file = binReader.ReadUInt16();
if (Version == BIFF8)
{
version = "Excel8.0";
}
if (Version == BIFF7)
{
version = "Excel8.0";
}
}
}
catch (EndOfStreamException e)
{
throw e;
}
finally
{
binReader.Close();
}
}
else if (Path.GetExtension(fileName) == ".xlsx")
{
ZipFile zip = new ZipFile(fileName);
try
{
IEnumerator entries = zip.GetEnumerator();
while (entries.MoveNext())
{
ZipEntry current = (ZipEntry)entries.Current;
if (current.Name.Equals("docProps/app.xml"))
{
Stream stream = zip.GetInputStream(current);
XPathNavigator navigator = new XPathDocument(stream).CreateNavigator();
XmlNamespaceManager resolver = new XmlNamespaceManager(navigator.NameTable);
resolver.AddNamespace("x", "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties");
XPathNodeIterator iterator = navigator.Select("//x:AppVersion", resolver);
iterator.MoveNext();
string attribute = iterator.Current.InnerXml;
version = attribute;
}
}
}
catch (IOException ioEx)
{
throw ioEx;
}
finally
{
if (zip != null)
{
zip.Close();
}
}
}
}
catch (IOException ioEx)
{
throw ioEx;
} return version;
}

调用:

   catch
{
try
{
string version = GetExcelVersion(FilePath);
string error = string.Empty;
if (version == "")
{
error = "无法识别的Excel文件,请确保文件为有效的Excel2003或者Excel2007格式文件。";
}
else if (!version.Contains("") && !version.Contains("Excel8.0"))
{
error = string.Format("由高版本的Excel程序创建,请转换为Excel2003或者Excel2007格式文件", version);
}
throw new InvalidDataException(error);
}
catch (IOException ioEx)
{
throw ioEx;
}
}

读取Excel文件的版本的更多相关文章

  1. 阿里的Easyexcel读取Excel文件(最新版本)

      本篇文章主要介绍一下使用阿里开源的Easyexcel工具处理读取excel文件,因为之前自己想在网上找一下这个简单的立即上手的博客,发现很多文章的教程都针对比较旧的版本的Easyexcel,没有使 ...

  2. ADO.NET 读取Excel文件,并作数据源

    项目中需要用的功能,贴上代码了. 需要注意的地方:配置Web.config的时候要注意版本问题! //若是在Web.config中配置数据源,如下 <add key="ExcelCon ...

  3. PHPExcel读取Excel文件的实现代码

    <?php require_once 'PHPExcel.php'; /**对excel里的日期进行格式转化*/ function GetData($val){ $jd = GregorianT ...

  4. .Net读取Excel文件时丢失数据的问题 (转载)

    相信很多人都试过通过OleDB读取Excel文件,这种方法效率十分高,只是有一点会让人十分头痛,就是当一列中既有混合型数据,又有纯数据时,往往容易丢失数据. 百度过后,改连接字符串 “HDR=YES; ...

  5. C# conn.open() 外部表不是预期的格式( 读取EXCEL文件出错)

    环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...

  6. (实用篇)PHPExcel读取Excel文件的实现代码

    用PHPExcel读取Excel 2007 或者Excel2003文件,需要的朋友,可以参考下. 涉及知识点:  php对excel文件进行循环读取 php对字符进行ascii编码转化,将字符转为十进 ...

  7. 读取Excel文件的两种方法

    第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...

  8. python下读取excel文件

    项目中要用到这个,所以记录一下. python下读取excel文件方法多种,用的是普通的xlrd插件,因为它各种版本的excel文件都可读. 首先在https://pypi.python.org/py ...

  9. jspsmart(保存文件)+poi(读取excel文件)操作excel文件

    写在前面: 项目环境:jdk1.4+weblogic 需求:能上传excel2003+2007 由于项目不仅需要上传excel2003,还要上传excel2007,故我们抛弃了jxl(只能上传exce ...

随机推荐

  1. Frenetic Python实验(三)

    实验5 repeater 这个实验在HelloSDNWorld里面做的实验是一样的.HelloSDNWorld 目的:模拟一个有多个端口的中继器. This application implement ...

  2. IOS开发之开篇--CocoaPods安装

    CocoaPods是什么?当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而其 ...

  3. linux常用命令的英文单词缩写

    命令缩写: ls:list(列出目录内容) cd:Change Directory(改变目录) su:switch user 切换用户rpm:redhat package manager 红帽子打包管 ...

  4. 拦截webview调用系统浏览器打开链接

    给WebView设置自定义的WebViewClient即可 webview.setWebViewClient(new WebViewClient(){ @Override public boolean ...

  5. JNDI学习总结(一)——JNDI数据源的配置

    一.数据源的由来 在Java开发中,使用JDBC操作数据库的四个步骤如下:   ①加载数据库驱动程序(Class.forName("数据库驱动类");) ②连接数据库(Connec ...

  6. Jquery--array

    --遍历数组 $.each(Array, function(i, value) { this; //this指向当前元素 i; //i表示Array当前下标 value; //value表示Array ...

  7. Arrays类的十大用法

    还有很多地方需要细细斟酌 0. 声明数组 String[] aArray = new String[5]; String[] bArray = {"a","b" ...

  8. redis 应用场景

    1.string类型 : 图片和视频文件,静态文件 2.list 双向链表:回帖ID,我的关注列表,消息队列 length = redis.lpush('users:newest', 'user:go ...

  9. https://github.com/akullpp/awesome-java

    java stack https://github.com/akullpp/awesome-java

  10. HW 研发体系机构的几个术语

    PDT(product development team)产品开发团队   类似于产品经理 程序员 --  PL -- PM  --开发代表 -- PDT LEADER --------------- ...