웹서버에 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라인처럼 레코드셋을 통째로 카피해 넣을 수도 있구낭..

 

참고자료 : http://support.microsoft.com/kb/157721/ko