달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31


* 시나리오
      1. Excel 2007이 설치된 Local PC
      2. response 객체를 통한 Local에서의 Excel File 생성.
      3. Excel 2003이 설치된 서버에서 동작하는 Excel File Read 메서드.
      4. Excel File Read 메서드는 Oledb 를 통해 데이터를 가져 옴.


자자. 시작해볼까아?!

가끔 필요에 의해서 웹 상에 출력된 자료를 엑셀로 저장해야 할 경우가 있다.

그 경우 대부분.. 간편하고, 또 샘플 소스로 쉽게 접근 할 수 있는 게.

public static void ToExcel(string HTML, string fileName, HttpResponse response)
 {
  var excelHTML = HTML;
  
  response.Clear();
  response.AppendHeader("Content-Type", "application/vnd.ms-excel");
  response.AppendHeader("Content-disposition", "attachment; filename=" + fileName);
  response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
  response.Write(excelHTML);
  response.Flush();
  response.End();
 }

이런 녀석이다.

response 객체로 걍.. 엑셀..처럼 떨구는..

뭐 엑셀에서 파일 열면 최초에 경고 메시지 하나 덜렁 떨구는거 말고는 실제로 읽는데 아무런 장애도 없다.
(이게 정말 문제인건데.. 이씨 -_-.....)

저 메서드를 통해서 만들어진 엑셀 파일을 Oledb를 통해서 읽는 순간!!!!!!

어떻게 될까???


아아.. 이거 전에 집고 넘어가야 할 문제가 있음.

** Target Excel File 의 생성에 관한 경우 2가지 
  
1. 엑셀 2007이 설치된 PC에서 위 메서드를 통해 엑셀 파일이 생성된 경우. (.XLS)

2. 엑셀 2003이 설치된 PC에서 위 메서드를 통해 엑셀 파일이 생성된 경우. (.XLS)

위 두 가지 경우가 "대체 뭔 차이냐!!" 라고 물으신다면.. "함 해보셈.." 하고 대답해버리겠음 ㅡ0ㅡ;;

** Excel File Reading 에 관한 경우 2가지. 

1). 엑셀 2007이 설치된 PC에서 Oledb를 통해 읽는 경우.

2). 엑셀 2003이 설치된 PC에서 Oledb를 통해 읽는 경우.


자 여기서 잠시 머리 식히기 위한 문제~ 위 2가지 조건이 가질 수 있는 경우의 수는??? 









4개 인거 모르는 분은 없겠죠 슬마... ㅋㅋㅋ.



자 뻘소린 요까지만 하고. 

1) 번의 경우 1., 2. 두 가지 조건에 대해서 아~무~ 문제 없음.
     (착해 착해. 쥐알도 모르는 날 위해서... 알아서 다 해주는거구나!)

뭐.. 내가 개발하는 PC에는 2007이다 -_-ㅋ 그래서 서버에 적용시켜놓고 한동안 몰랐다. 문제가 있는지 없는지.. 쿨럭.

2) 번의 경우 1. 조건에 대해서 예외, 2. 조건에 대해서 문제 없음. 
     


Response 객체를 통해 만들어진 엑셀 파일은 무늬만 .XLS 파일인 것이다..

요즘엔.. 파일도 짝퉁이... 쿨럭 쿨럭. (중국 산인가 =ㅅ=;;;)

더군다나.. 읽히지 않을라면 다 읽히지나 말지. 엑셀 버젼 특성을 타는건 아니라고 봐요 ㅠ_ㅠ

여튼 -_-ㅋ 파일의 헤더 정보를 정상적으로 가져오지 못하므로.. Oledb를 통해서 백날 읽어봐야. 읽히지 않는다..


아는 범위 내에선 Oledb를 통해 읽는 거로 해결할 수 있는 방법은 모르겠고..

해결책으로 하고 있는 건. 

Excle application 을 통해서 파일을 읽어서 데이터를 가져오는 방법이다. 


public DataTable Excel_Order_File_Read_To_App(string filePath)
 {
  string file_name = filePath.Split('?')[1];
  Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
  
  excelApp.Visible = true;
  
  Microsoft.Office.Interop.Excel._Workbook excelWb =
   excelApp.Workbooks.Open(filePath.Split('?')[0], Type.Missing, Type.Missing, Type.Missing, Type.Missing,
         Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
         Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
  Microsoft.Office.Interop.Excel._Worksheet excelSheet
= (Microsoft.Office.Interop.Excel.Worksheet)excelWb.Worksheets[1];

  Range aa = excelSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing);
  int a = aa.Row;
  int b = aa.Column;
  //Microsoft.Office.Interop.Excel.Range ran = GetUsedRange(excelSheet,
  for (int i = 0; i <= excelSheet.Rows.Count; i++)
  {
  }

  //Process Kill
  int hWnd = FindWindow(null, "Microsoft Excel - " + file_name);
  SendMessage(hWnd, Process_Terminate, 0, 1);
  return null;
 }

일단은 이정도..?!

처리해주어야 할 부분은 Range 인데. 

이건 지금 신나게 삽질 중이니 완료 되는대로 추가하겠음~

아우~ 신나~!


By.R.E.Ms



 



Posted by 은하비류연
|