读取Excel文件的版本
读取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文件的版本的更多相关文章
- 阿里的Easyexcel读取Excel文件(最新版本)
本篇文章主要介绍一下使用阿里开源的Easyexcel工具处理读取excel文件,因为之前自己想在网上找一下这个简单的立即上手的博客,发现很多文章的教程都针对比较旧的版本的Easyexcel,没有使 ...
- ADO.NET 读取Excel文件,并作数据源
项目中需要用的功能,贴上代码了. 需要注意的地方:配置Web.config的时候要注意版本问题! //若是在Web.config中配置数据源,如下 <add key="ExcelCon ...
- PHPExcel读取Excel文件的实现代码
<?php require_once 'PHPExcel.php'; /**对excel里的日期进行格式转化*/ function GetData($val){ $jd = GregorianT ...
- .Net读取Excel文件时丢失数据的问题 (转载)
相信很多人都试过通过OleDB读取Excel文件,这种方法效率十分高,只是有一点会让人十分头痛,就是当一列中既有混合型数据,又有纯数据时,往往容易丢失数据. 百度过后,改连接字符串 “HDR=YES; ...
- C# conn.open() 外部表不是预期的格式( 读取EXCEL文件出错)
环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...
- (实用篇)PHPExcel读取Excel文件的实现代码
用PHPExcel读取Excel 2007 或者Excel2003文件,需要的朋友,可以参考下. 涉及知识点: php对excel文件进行循环读取 php对字符进行ascii编码转化,将字符转为十进 ...
- 读取Excel文件的两种方法
第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...
- python下读取excel文件
项目中要用到这个,所以记录一下. python下读取excel文件方法多种,用的是普通的xlrd插件,因为它各种版本的excel文件都可读. 首先在https://pypi.python.org/py ...
- jspsmart(保存文件)+poi(读取excel文件)操作excel文件
写在前面: 项目环境:jdk1.4+weblogic 需求:能上传excel2003+2007 由于项目不仅需要上传excel2003,还要上传excel2007,故我们抛弃了jxl(只能上传exce ...
随机推荐
- Apache Spark技术实战之1 -- KafkaWordCount
欢迎转载,转载请注明出处,徽沪一郎. 概要 Spark应用开发实践性非常强,很多时候可能都会将时间花费在环境的搭建和运行上,如果有一个比较好的指导将会大大的缩短应用开发流程.Spark Streami ...
- DS实验题 Searchname
题目: 思路: 如果直接暴力搜索的话,时间复杂度为O(n*m),在n为百万量级的情况下,必然是T. 所以,这里通过hash函数,将字符串转换为对应的hash值:同时利用邻接表避免了hash冲突,方法是 ...
- DS实验题 Floyd最短路径 & Prim最小生成树
题目: 提示: Floyd最短路径算法实现(未测试): // // main.cpp // Alg_Floyd_playgame // // Created by wasdns on 16/11/19 ...
- GDC2016【彩虹六号:围攻 】使丰富的“突破”成为可能的破坏系统
[彩虹六号:围攻 ]使得丰富的“突破”成为可能的破坏系统 深奥的战术游戏的背景下,最新的程序化破坏技术[REALBLAST]! 进行演讲的是Ubisoft Montreal的Julien ...
- 大话数据结构(十二)java程序——KMP算法及改进的KMP算法实现
1.朴素的模式匹配算法 朴素的模式匹配算法:就是对主串的每个字符作为子串开头,与要连接的字符串进行匹配.对主串做大循环,每个字符开头做T的长度的小循环,直到成功匹配或全部遍历完成为止. 又称BF算法 ...
- ubuntu 工作区中拖动一个窗体到另一个工作区就卡住回不到桌面了
ubuntu 工作区中拖动一个窗体到另一个工作区就卡住回不到桌面了 解决方法: 按 alt + 回车 键直接就返回去了
- ArcMap 标注、注记、图形文本
标注.注记.图形文本 2016年8月10日10:29 ArcMap中怎样向地图添加文本,其中标注与注记是重点内容,此处对此进行总结. 参考链接: ①地图文本基本词汇: 什么是文本? ArcGIS 提供 ...
- Android中Intent组件详解
Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...
- Unicode与UTF8相互转化(使用MultiByteToWideChar)
1.简述 最近在发送网络请求时遇到了中文字符乱码的问题,在代码中调试字符正常,用抓包工具抓的包中文字符显示正常,就是发送到服务器就显示乱码了,那就要将客户端和服务器设置统一的编码(UTF-8),而我们 ...
- IOS 开发文件操作——NSFileManager
转自:http://blog.csdn.net/xyz_lmn/article/details/8968213,留着方便查阅 iOS的沙盒机制,应用只能访问自己应用目录下的文件.iOS不像androi ...