웹서버에 Excel 2007이 깔려 있고 Excel.Application을 사용하여 .xls 파일을 생성할 경우
Excel 97-2003 파일 형식으로 저장이 되기는 하나..
2003 버전으로 열때 "이 파일을 읽을 수 없습니다. 어쩌구 저쩌구.." 경고 문구와 함께 내용이 깨지고,
2007 버전으로 열때 "파일 형식 또는 파일 확장명이 잘 못되어 ***.xls 파일을 열 수 없습니다. 파일 확장명이 파일 형식과 일치하는지 확인 하십시오." 경고 문구가 뜨며 [예] 버튼을 누르면 내용은 멀쩡히 열리되 제목 표시줄에 [호환모드]는 표시되지 않는다.
이 파일을 다른이름으로 저장한 후 다시 열면 경고문구 없이 제목표시줄에 [호환모드]가 버젓이 뜨며 멀쩡히 열린다.
단순히 파일 확장자를 xls로 지정하여 저장했기 때문에 Excel 97-2003 파일 형식이 되기는 하였으나 약간의 포맷차가
있는듯 하다.
이럴때 2007 버전으로 빈파일을 Excel 97-2003 형식으로 저장하여 웹서버에 올리고
Workbook 추가시 이 파일의 경로를 지정해준 후 이 Workbook의 FileFormat을 구해서 저장(SaveAs)시 추가해주면
파일이 멀쩡히 생성된다.
<% Dim strQuery, objRs Dim strFilePath, strFileName, nDirectory, nFilepath '원하는 파일명 strFilePath = "/Attachment/Excel/" strFileName = "member_list.xls" Call DBOpen() '데이터 가져오기 strQuery = "SELECT User_ID 아이디, User_Name 이름, User_Email 이메일, RegDate 가입일 FROM TB_Member ORDER BY User_ID ASC" Set objRs=Server.CreateObject("ADODB.Recordset") objRs.Open strQuery, objConn '저장할 경로 유무 체크, 동일이름 파일 유무 체크 Set objFSO = CreateObject("Scripting.FileSystemObject") nDirectory = Server.MapPath(strFilePath) nFilepath = nDirectory & "\"& strFileName '저장경로 없으면 생성 if oFileFSO.FolderExists(nDirectory)=False Then oFileFSO.CreateFolder(nDirectory) End If '이미 파일이 있으면 삭제 If oFileFSO.FileExists(nFilepath) Then oFileFSO.DeleteFile(nFilepath) End If Set oFileFSO=Nothing '-------------------------------------------------------------------- Dim xlApp, nFileFormat, nFieldCount, nIndex Set xlApp = Server.CreateObject("Excel.Application") xlApp.Visible = False 'Excel Application에 Workbook 추가 (2003버전으로 생성된 템플릿이 있어야함 -- 빈파일) xlApp.Workbooks.Add(Server.MapPath("/Common/excel_97-2003_template.xls")) nFileFormat = xlApp.WorkBooks(1).FileFormat 'WorkSheet 지정 Set xlWorksheet = xlApp.ActiveWorkbook.ActiveSheet '필드수 구하기 nFieldCount = objRs.Fields.Count '첫행(타이틀) 추가 For nIndex = 1 To nFieldCount xlWorksheet.Cells(1,nIndex).Value = oRs.Fields(nIndex-1).Name Next '둘째행~(실데이터) 추가 (레로드셋을 WorkSheet에 복사) xlWorkSheet.Range("A2").CopyFromRecordSet objRs Set xlWorksheet = Nothing 'Excel 개체를 다른 이름으로 저장 (템플릿과 동일한 FileFormat으로 저장) xlApp.ActiveWorkbook.SaveAS nFilepath, nFileFormat xlApp.Quit Set xlApp = Nothing '-------------------------------------------------------------------- objRs.Close : Set oRs = Nothing Call DBClose() %> <html> <head> <title>Excel Download</title> </head> <body> 다운로드 : <a href="/Common/Download.asp?filepath=<%=strFilePath & strFileName%>"><%=strFileName%></a> </body> </html>
42라인에서 구한 nFileFormat 값을 출력해보니 56이 나왔다.
그래서 41,42 라인을 다음과 같이 바꾸고, 저장하니 그래도 된다.
xlApp.Workbooks.Add nFileFormat = 56
헌데 다른 서버에 56을 그대로 올리니 오류발생.. 다시 되돌리고 nFileFormat 값을 출력해보니 -4143이라고 찍힌다.
고정은 아닌가보다..
미리 찍어보고 하드코딩으로 나중에 바꾸는 방법을 써도 될 듯..
그리고 추가로 한가지..
일일이 셀을 추가하지 않고도 56라인처럼 레코드셋을 통째로 카피해 넣을 수도 있구낭..