js读取 EXCEL 文件 的实现代码,比较全了大家可以自行测试了。
首页给个有中文说明的例子,下面的例子很多大家可以多测试。
<script language="javascript" type="text/javascript"><!-- function readExcel() { var excelApp; var excelWorkBook; var excelSheet; try{ excelApp = new ActiveXObject("Excel.Application"); excelWorkBook = excelApp.Workbooks.open("C:\\XXX.xls"); excelSheet = oWB.ActiveSheet; //WorkSheets("sheet1") excelSheet.Cells(6,2).value;//cell的值 excelSheet.usedrange.rows.count;//使用的行数 excelWorkBook.Worksheets.count;//得到sheet的个数 excelSheet=null; excelWorkBook.close(); excelApp.Application.Quit(); excelApp=null; }catch(e){ if(excelSheet !=null || excelSheet!=undefined){ excelSheet =nul; } if(excelWorkBook != null || excelWorkBook!=undefined){ excelWorkBook.close(); } if(excelApp != null || excelApp!=undefined){ excelApp.Application.Quit(); excelApp=null; } } // --></script>
如果是在网页上打开EXCEL 文件,那么在关闭的时候,进程里还有EXCEL.EXE,所以必须关闭后,刷新本页面!
<script> function ReadExcel() { var tempStr = ""; var filePath= document.all.upfile.value; var oXL = new ActiveXObject("Excel.application"); var oWB = oXL.Workbooks.open(filePath); oWB.worksheets(1).select(); var oSheet = oWB.ActiveSheet; try{ for(var i=2;i<46;i++) { if(oSheet.Cells(i,2).value =="null" || oSheet.Cells(i,3).value =="null" ) break; var a = oSheet.Cells(i,2).value.toString()=="undefined"?"":oSheet.Cells(i,2).value; tempStr+=(" "+oSheet.Cells(i,2).value+ " "+oSheet.Cells(i,3).value+ " "+oSheet.Cells(i,4).value+ " "+oSheet.Cells(i,5).value+ " "+oSheet.Cells(i,6).value+"\n"); } }catch(e) { document.all.txtArea.value = tempStr; } document.all.txtArea.value = tempStr; oXL.Quit(); CollectGarbage(); } </script> <html> <input type="file" id="upfile" /><input type="button" onclick="ReadExcel();" value="read"> <br> <textarea id="txtArea" cols=50 rows=10></textarea> </html>
二、
js读取excel文件
<script> <br>function readThis(){ <br>var tempStr = ""; <br>var filePath= document.all.upfile.value; <br>var oXL = new ActiveXObject("Excel.application"); <br>var oWB = oXL.Workbooks.open(filePath); <br>oWB.worksheets(1).select(); <br>var oSheet = oWB.ActiveSheet; <br>try{ <br>for(var i=2;i<46;i++){ <br/>if(oSheet.Cells(i,2).value =="null" || oSheet.Cells(i,3).value =="null" ) <br/>break; <br/>var a = oSheet.Cells(i,2).value.toString()=="undefined"?"":oSheet.Cells(i,2).value; <br/>tempStr+=(" "+oSheet.Cells(i,2).value+" "+oSheet.Cells(i,3).value+" "+oSheet.Cells(i,4).value+" "+oSheet.Cells(i,5).value+" "+oSheet.Cells(i,6).value+"\n"); <br/>} <br/>} <br/>catch(e){ <br/>//alert(e); <br/>document.all.txtArea.value = tempStr; <br/>} <br/>document.all.txtArea.value = tempStr; oXL.Quit(); <br/>CollectGarbage(); <br/>} <br/></script>
三、
我在vs2005平台上要实现这么一个功能,点击一个按钮一次将大量的excel文件数据导入到sqlserver2005中
我用的是ajax技术,在前台用javascript操做excel文件,循环读取所有的excel文件,每读取一行就放进一个数组里通过web服务传到后台用c#语言将一行数据插入到数据库。思路大概就是这样。
现在功能已经实现了,具体代码如下
用javascript定义一个函数,循环读取excel文件数据
function readExcel()
{
try
{
var ExcelNum=new Array();
//重复导入之前,删除上次导入的同期数据
WebServiceExcel.deleteOldNumber();
var oXL = new ActiveXObject( "Excel.Application ");
\\r_c_num[5]的值为excel文件的名字
var path=document.all.excelpath.value+ "\\ "+r_c_num[5]
var oWB = oXL.Workbooks.open(path);
\\如果excel文件有多个sheet的话从第一个sheet循环读取
for(var x=1;x <=oWB.worksheets.count;x++)
{
oWB.worksheets(x).select();
var oSheet =oWB.ActiveSheet;
\\按指定开始行和开始列读取excel文件的数据
for(var i=parseInt(r_c_num[6]);i <=parseInt(r_c_num[7]);i++)
{
for(var j=parseInt(r_c_num[8]);j <=parseInt(r_c_num[9]);j++)
{
if(typeof(oSheet.Cells(i,j).value)== "undefined ")
{
ExcelNum[j-parseInt(r_c_num[8])+6]= " ";
}
else
{
switch_letter(j);
ExcelNum[j-parseInt(r_c_num[8])+6]=oSheet.Cells(i,j).value;
}
}
//将读取的一行数据传到后台插入到数据库
WebServiceExcel.insert_From_Excel(ExcelNum);
}
}
}
}
catch(err)
{
alert( "出错了, "+err.message);
}
}
这只是前台的关键代码。
现在的问题是,如果excel文件数据太多的话,导入过程要等好长时间,性能太差了,不知道该怎么改进???如果导几千行数据就不行了,时间让我无法忍受。请高手赐教,很着急用,谢谢了!!!
一个用JavaScript结合Excel.Application读取本地excel文件并以表格呈现的简单例子
<%
''
'************************************** ******* **********************
' 목적 : 엑셀 데이터를 읽어 들인 후 데이터베이스에 삽입하고 횟수를 기록 성공 및 실패
' 전달:
' 반환:
'******************************** ************ ******************
GetExcel() 함수
Dim conn
Dim StrConn
Dim rs
Dim Sql
file= ""
Set conn=Server.CreateObject("ADODB.Connection")
StrConn="Driver={Microsoft Excel 드라이버(*.xls)};DBQ ="& Server.MapPath("EXCEL_DATA.xls" )
''StrConn = "공급자=Microsoft.Jet.OLEDB.4.0;데이터 소스=dd.xls;확장 속성=Excel 8.0"
conn.Open StrConn
Set rs = Server.CreateObject(" ADODB.Recordset")
Sql="select * from [Sheet1$]"
rs.Open Sql,conn,2,2
''Read Excel에서 필드 이름을 확인하고 i=0에서 rs.Fields.Count-1
FILE_HEAD=FILE_HEAD&rs(i).Name
다음
'응답에 대해 필드 순서가 올바른
지 확인하세요. write FILE_HEAD
IF Trim(FILE_HEAD)< >"버전 단위 범주 개요 프로그램 설명 개요 설명 파일명 저장 기간 공통 분류 번호" THEN
RESPONSE.WRITE ""
exit 함수
END IF
''Excel에서 데이터 읽기
do while Not rs.EOF
''는 i=0에서 rs.Fields.Count-1
EDITION=rs(0)
FILE_CODE=rs(2에 대해
검색된 데이터를 oracle 데이터베이스에 INSERT합니다. ) rs(3) rs(4) rs( 5)
FILE_NAME=rs(9)
KIND1_DESC=rs(6)
KIND2_DESC=rs(7)
KIND3_DESC=rs(8)
KIND4_DESC=rs(9)
SAVE_YEAR=rs(10)
FILE_UNIT=rs(1)
COM_FILE_CODE=rs(11)
''========== ============ ========================
CHECED_SQL="nvl(FILE_CASE,'' 선택) ) FILE_CASE FROM ODM67 where EDITION='"&TRIM(EDITION )&"' and FILE_CODE='"&TRIM(FILE_CODE)&"' "
MobjDB.OpenSQL(CHECED_SQL)이면
mobjDB.IsEmpty이면
FILE_CASE="0001"
CASE_DESC=" 일반 사례"
INS_SQL=""
INS_SQL=INS_SQL & " INSERT INTO ODM67(" & VBCRLF
INS_SQL=INS_SQL & " EDITION,FILE_CODE,FILE_CASE ," & VBCRLF
INS_SQL=INS_SQL & " CASE_DESC,CRT_USER,CRT_DATE," & VBCRLF
INS_SQL=INS_SQL & " CRT_TIME,MDF_USER,MDF_DATE,MDF_TIME)" & VBCRLF
INS_SQL=INS_SQL & " VALUES( " & VBCRLF
INS_SQL=INS_SQL & " ' "&TRIM(EDITION)&"','"&TRIM(FILE_CODE)&"'," & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM(FILE_CASE)&" ','"&TRIM(CASE_DESC)&"', " & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM(SESSION("USER_ID"))&"','"&TRIM(TODAY)&"'," & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM (NOWTIME)&"','"&TRIM(SESSION("USER_ID"))&"'," & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM(TODAY )&"','"&TRIM(NOWTIME)& "')"
CALL mobjDB.ExecSQL(INS_SQL)
End If
End If
''========= ============= =========================
INS_SQL=""
INS_SQL= INS_SQL & " INSERT INTO ODM61( " & VBCRLF
INS_SQL=INS_SQL & " EDITION,FILE_CODE,FILE_NAME,KIND1_DESC," & VBCRLF
INS_SQL=INS_SQL & " KIND2_DESC,KIND3_DESC,KIND4_DESC,SAVE_YEAR," & VBCRLF
INS_SQL=INS_SQL & " FILE_UNIT,COM_FILE_CODE,CRT_USER, CRT_DATE ," & VBCRLF
INS_SQL=INS_SQL & " CRT_TIME,MDF_USER,MDF_DATE,MDF_TIME)" & VBCRLF
INS_SQL=INS_SQL & " VALUES(" & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM(EDITION) &"','"&TRIM(FILE_CODE)&"'," & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM(FILE_NAME)&"','" &TRIM(KIND1_DESC)&"'," & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM(KIND2_DESC)&"','"&TRIM(KIND3_DESC)&"'," & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM(KIND4_DESC)&"','"&TRIM(SAVE_YEAR)&"'," & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM(FILE_UNIT)&"','"&TRIM(COM_FILE_CODE)&"' ," & VBCRLF
INS_SQL=INS_SQL & " ' "&TRIM(SESSION("USER_ID"))&"','"&TRIM(TODAY)&"'," & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM(NOWTIME)&"','"&TRIM(SESSION("USER_ID"))&"'," & VBCRLF
INS_SQL=INS_SQL & " '"&TRIM(TODAY)&"' ,'"&TRIM(NOWTIME)&"')"
''RESPONSE.WRITE INS_SQL& "
"
IF mobjDB.ExecSQL(INS_SQL) THEN
InCount=InCount 1
ELSE
NoCount=NoCount 1
file=file&TODAY&" "&NOWTIME&" "&EDITION&" "&FILE_CODE & VBCRLF
END IF
exit for
next
rs.MoveNext
Loop
rs.close
set rs=nothing
Conn.close
set StrConn=nothing
if file<>"" then
CALL CreateFolder()
SetFile(file) 호출
strpath=server.mappath("EXCEL_DATA.xls")
DeleteFolder(strpath) 호출
file=""
end if
함수 종료
'******* ************************************************** *
' 목적: 지정된 새 파일을 생성합니다. 존재하는 경우 새 파일을 생성하지 않고 파일에 레코드를 추가합니다.
' 전달: 파일: 추가할 데이터
' 반환:
'**** ******************************************** ******* ***
함수 SetFile(file)
file_path="C:LOGOD60err.log"
set fstemp=server.CreateObject("Scripting.FileSystemObject")
IF (fstemp.FileExists(file_path) ) THEN
ELSE
set filetemp=fstemp.CreateTextFile(file_path,true)
filetemp.writeLine "실패한 가져오기 데이터 기록"
filetemp.close
END IF
''실패 정보 OpenTextFile 추가
set filetemp=fstemp.OpenTextFile(file_path,8,true)
filetemp.writeLine 파일
filetemp.close
set filetemp=Nothing
set fstemp =없음
함수 종료
'******************************************** ********* *************
' 목적: 지정된 새 폴더를 생성합니다. 폴더가 있으면 생성하지 마세요.
' 전달:
' 복귀:
'** *************************************** ************ *****
함수 CreateFolder()
Dim fso, f
folder="c:LOG"
Set fso = CreateObject(" Scripting.FileSystemObject")
IF fso.FolderExists(폴더) THEN
ELSE
Set f = fso.CreateFolder(folder)
CreateFolderDemo = f.Path
END IF
끝 기능
'******** ************************************** ***********
' 목적 : 업로드된 파일 삭제,
' 전달 : 업로드된 파일의 가상 경로 전달
' 반환 :
'** **************** ********************************** *******
함수 DeleteFolder(filepath)
Dim fso, f
folder="EXCEL_DATA.xls"
Set fso = CreateObject("Scripting.FileSystemObject")
' 'response.write fso.FileExists(filepath)
IF fso.FileExists(filepath) THEN
fso.DeleteFile filepath
END IF
End Function
%>
코드는 다음과 같습니다.