如何最高效的读取Excel文件?

问题描述

需要读取一excel文件内容进行处理,此文件共约700条数据,(每条数据约12项)。每隔三分钟会有一第三方程序向此文件写入一条数据。此第三方程序不可进行二次开发,且具有最高权限,就是说此第三方程序写入数据时,其它程序不得对excel文件进行占用。请问此问题如何解决。我的思路是尽量快速读取excel文件数据然后关闭excel文件。把读取的数据生成dataset在计算机内存中处理而不在打开excel文件时一边读数一边处理。那么哪位高人可以给我一个读取快速excel文件数据并生成dataset的例子?愿给500分!注意,使用读取数据库的方法读取excel文件并生成dataset方法不可取,因为一:使用此方法必须建立数据库连接,这个过程需要耗费时间,且如果网络有问题的话时间会更长。二直接读取excel文件,按照标准的读取excel文件的range方法不可取,时间太长!

解决方案

解决方案二:
那你还不如读之前把excel复制一份,想读多久都没关系或者开文件时候开启读写共享
解决方案三:
第三方程序是怎么写excel的,你每次读取完了,就把excel初始化下,使得它清空,不就可以了。
解决方案四:
二楼:1第三方程序每隔三分钟就操作一下excel,这意味着我每隔三分钟就要拷贝一下文件,首先二十四小时对文件要拷贝许多次,而且并不只有这一个excel,实际我一次要操作大约二十个excel文件。此方法还对硬盘频繁操作,损伤寿命(机器除非断电,否则终年不停机)2我说了,打开文件方法不可取,因为一是用此方法读取数据太慢(一个不明显,二十个*700*12是龟速),且我记得在visualstudio中需要调用excel实例才能打开此文件,这个打开文件的动作似乎是独占的,如何读写共享呢?如果真可以共享,那么我读取数据时,第三方程序此时写入一条数据,然后关闭文件,由于数据有变化,那么excel文件关闭时必然弹出保存对话框,这就需要人工确认。而实际这是无人操作,无法进行保存确认的。三楼:我的程序不能对excel文件进行任何改变内容的操作。实际上这个文件是由那个第三方程序自动生成,自动写入数据。我的程序只能趁它不操作此文件时读取一下数据,其它什么都不能干!我主要是想解决当我对此文件独占使用时,恰好第三方程序也对其使用而引发的冲突问题,而此时要求第三方程序必须具有最高权限,不能影响它对excel文件的使用,且无法更改第三方程序代码。我目前的思路只能是尽快的对此文件数据读出来,然后关闭文件供第三方程序使用。当然这仍然无法保证百分百可以解决冲突问题,但可以使冲突可能性尽量降低到最小。
解决方案五:
首先参考GetinstanceofExcelapplicationwithC#byHandlehttp://stackoverflow.com/questions/1118735/get-instance-of-excel-application-with-c-sharp-by-handleusingExcel=Microsoft.Office.Interop.Excel;publicExcel.ApplicationStartExcel(){Excel.Applicationinstance=null;try{instance=(Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");}catch(System.Runtime.InteropServices.COMExceptionex){instance=newExcel.ApplicationClass();}returninstance;}

可以直接从系统中获取已存在的excel实例,应该可以解决文件被独占访问的问题。第二步,判断文件是否已打开varxls=StartExcel();foreach(Excel.Workbookwbinxls.Workbooks){if(wb.Path==path)//文件是否打开判断}

第三步,利用二维数组映射数据,快速读取object[,]arr=(object[,])sh.UsedRange.Value;

测试:文件包含一张表7个字段,2542行数据关闭状态用时<300ms打开状态用时<50msusingSystem;usingSystem.Diagnostics;usingSystem.Runtime.InteropServices;usingSystem.Text;usingExcel=Microsoft.Office.Interop.Excel;//获取系统中已存在的ExcelApplication实例publicExcel.ApplicationGetInstance(){Excel.Applicationinstance=null;try{instance=(Excel.Application)Marshal.GetActiveObject("Excel.Application");}catch(System.Runtime.InteropServices.COMExceptionex){Console.WriteLine(ex.Message);instance=newExcel.Application();}returninstance;}privatevoidmeOnClick(objectsender,RoutedEventArgse){Stopwatchsw=newStopwatch();//启动一个计时器sw.Start();Excel.Applicationxls=GetInstance();//获取Excel实例Excel.Workbookwb=null;Excel.Worksheetsh;boolopenByMe=false;//用于标识是否是自己的程序打开的文件//程序目录中放了一个测试用的xlsx//表中有7个字段2542行数据stringpath=System.IO.Path.GetFullPath("test.xlsx");foreach(Excel.Workbookiteminxls.Workbooks){//通过路径判断文件是否已被打开if(item.FullName==path){wb=item;break;}}if(wb==null)//判断文件是否已打开{try{wb=xls.Workbooks.Open(path,ReadOnly:true);//已只读方式打开文件openByMe=true;//是自己的程序打开的}catch(Exceptionex){Console.WriteLine(ex.Message);}}if(wb==null)return;sh=(Excel.Worksheet)wb.Sheets["systems"];//获取目标Worksheetobject[,]arr=(object[,])sh.UsedRange.Value;//以最快的方式获取数据if(openByMe)//判断标识{wb.Close(SaveChanges:false);//关闭文件xls.Quit();//退出Excelsh=null;wb=null;xls=null;}Console.WriteLine("{0}",sw.Elapsed.TotalMilliseconds);if(arr==null)//判断是否获取了数据return;varsb=newStringBuilder();//将数组数据植入StringBuilderfor(inti=arr.GetLowerBound(0);i<=arr.GetUpperBound(0);i++){for(intj=arr.GetLowerBound(1);j<=arr.GetUpperBound(1);j++){if(j==arr.GetLowerBound(1)){sb.AppendFormat("{0}",arr[i,j]);//首个字段直接写值}else{sb.AppendFormat("t{0}",arr[i,j]);//非首字段写t+值}}sb.AppendLine();//写入回车}//获取一个cache.csv文件路径,该文件位于当前应用程序目录stringpath=System.IO.Path.GetFullPath("cache.csv");System.IO.File.WriteAllText(path,sb.ToString(),Encoding.Default);//写入数据sw.Stop();Console.WriteLine("{0}",sw.Elapsed.TotalMilliseconds);}

解决方案六:
上面的代码有个问题,path复用,前面的string要去掉。

时间: 2024-12-08 08:29:43

如何最高效的读取Excel文件?的相关文章

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

项目中需要用的功能,贴上代码了. 需要注意的地方:配置Web.config的时候要注意版本问题! //若是在Web.config中配置数据源,如下 <add key="ExcelConnectionString" value="Provider=Microsoft.Jet.OLEDB.4.0; Data Source='miroExcel/Info.xls';Extended Properties='Excel 8.0;HDR=yes;IMEX=2'"/>

直接读取Excel文件数据

前言 由于种种需要直接进行读取Excel文件数据,然而在网上Search多次也没有找到好的方法, 一般就通过ODBC或OLE方式进行读取,但这两种方法都具有局限性...(我相信大家都很清楚). 怎么办呢?没办法了,只好选择最艰难的路了--分析Excel文件格式. 介绍 MS Excel是众所周知的电子表格处理软件.Excel文件格式是特定的BIFF(Binary Interchange File Format),BIFF里存储了很多记录,第条记录包括记录头和记录体.记录头是4byte,前两位指定

使用Apache POI读取Excel文件

Apache POI是Apache软件基金会的开放源码函式库,用来帮助Java程序读写Microsoft Office的格式档案.POI提供了下面这几种类型对Microsoft Office的格式档案进行解析: HSSF - 提供读写Microsoft Excel XLS格式档案的功能. XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能. HWPF - 提供读写Microsoft Word DOC格式档案的功能. HSLF - 提供读写Microsoft

读取Excel文件时出现null的解决方法

在以往读取Excel文件时常常出现读取某些字段为null值,其实是有值,原因是读取文件时,Excel会以第一行的数据类型为参考,如果后边的与其不一致,则会出现些问题. 以下一个朋友的解决方案,他的Excel文件的连接串写作如下.据说可以强制数据为字符串,具体我没有再测试.仅供参考. string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + sPath + ";Extended Properties='

asp.net读取excel文件的三种方法示例

 这篇文章主要介绍了asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取,需要的朋友可以参考下 方法一:采用OleDB读取Excel文件   把Excel文件当做一个数据源来进行数据的读取操作,实例如下:  代码如下: public DataSet ExcelToDS(string Path)    {    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;&q

php读取excel文件示例

 这篇文章主要介绍了php读取excel文件示例,还有更新修改功能,需要的朋友可以参考下  代码如下: //模板存放目录 $dir = $DOCUMENT_ROOT.'/backoffice/admin/oemcheck/';   $templateName = '1.xlsx'; $outputFileName = '模板.xlsx'; $txt='test';   //实例化Excel读取类 $PHPReader = new PHPExcel_Reader_Excel2007(); if(!

.NET读取Excel文件的三种方法的区别_实用技巧

ASP.NET读取Excel文件方法一:采用OleDB读取Excel文件: 把Excel文件当做一个数据源来进行数据的读取操作,实例如下: 复制代码 代码如下: public DataSet ExcelToDS(string Path)   {    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Prop

java-在使用JXLS读取excel文件时,超过10位的数字格式错误

问题描述 在使用JXLS读取excel文件时,超过10位的数字格式错误 Hi,我正在使用jxls实现导入excel的功能.但现在遇到一个很棘手的问题:jxls在遇到长度超过10位的数字时,如12345678912,会将其转成1.2345678E10.有没有什么办法可以解决这个问题. 解决方案 excel中按右键 点击设置单元格格式 把这串数字编辑成为字符串文本格式 然后保存 解决方案二: 可以在excel中数字之前加上', 这样就可以把这个单元格的内容变成文本,程序里取字符串 不要取数字

java web-POI读取EXCEL文件的错误(invalid header signature )处理

问题描述 POI读取EXCEL文件的错误(invalid header signature )处理 如题,网上很多说是获取信息头部出错,保存或者另存为就可以,我试了下的确可以,但是我不用保存,只要打开下或者重命名也能读取了,打开也没显示格式错误,更重要的是我功能是读取客户端的excel..不可能每次都手动操作,我现在实现的功能是用jsp的FileUpload上传的临时区用poi存储,有没高手帮忙解决更奇怪的是我在eclipse调试却完全没问题,这很重要,已经穷途末路,大家给点意见 解决方案 是因