2014-01-20 7 views
0

엑셀 파일의 데이터를 읽고 데이터베이스에 저장하는 프로그램에서 작업하고 있습니다. 이 프로그램은 C#을 사용하여 Visual Studio 2010로 작성되었으며 NPOI 라이브러리를 사용하고 있습니다.엑셀 셀 형식 읽기

과거에는 스프레드 시트 행을 셀 단위로 읽을 수 있었지만 데이터를 가져올 수는 있지만 새로운 형식의 Excel 파일을 사용하면 쉽게이 작업을 수행 할 수 없습니다. (Excel은 다른 사용자가 제공하므로 실제로 큰 변화를 만들 수는 없습니다.)

한 시트에 여러 개의 "테이블"이 있습니다 (각 열 이름에 테두리와 헤더 사용). 주로 테이블에서 데이터를 가져와야하지만 때로는 테이블 외부에서도 데이터를 가져와야합니다.

행별로 스프레드 시트 행을 읽어야하는지 궁금해했습니다. (익숙한 점은 무엇입니까), 제가 테이블에 도달했다고 말할 수있는 방법이 있습니까? 셀의 "형식"을 읽을 수있는 방법이 있습니까?

입니다 내 말은, 예를 들어, "이 셀은. 그래서이 행을 시작 주위 테두리 테이블입니다있다"또는 "이 셀의 텍스트가 굵게 , 그래서이 행이에 대한 헤더 행입니다 새 테이블 "

과거에는 형식/스타일이 아닌 스프레드 시트의"텍스트 "만 읽을 수있었습니다. 나는 인터넷에서 검색을 해왔고 출력 형식을 설정하는 방법 만 찾을 수 있지만 입력 형식을 읽는 방법은 찾을 수 없습니다.

도움 주시면 감사하겠습니다.

답변

2

원본 통합 문서의 여러 테이블을 알려진 이름의 명명 된 범위로 정의하는 것이 좋습니다. 원본 스프레드 시트 통제 할 수 없으며 명명 된 범위로 테이블을 정의 할 수없는 경우 당신이 제안대로 셀 형식을 읽을 수

using System.IO; 
using System.Windows; 
using NPOI.SS.UserModel; 
using NPOI.XSSF.UserModel; 

// ... 
     using (var file = new FileStream(workbookLocation, FileMode.Open, FileAccess.Read)) 
     { 
      var workbook = new XSSFWorkbook(file); 
      var nameInfo = workbook.GetName("TheTable"); 
      var tableRange = nameInfo.RefersToFormula; 
      // Do stuff with the table 
     } 

을 - 그럼 당신은이 같은 관련 영역을 얻을 수 있습니다. 다음은 TopBorder 스타일을 읽는 예입니다. -

 using (var file = new FileStream(workbookLocation, FileMode.Open, FileAccess.Read)) 
     { 
      var workbook = new XSSFWorkbook(file); 
      var sheet = workbook.GetSheetAt(0); 

      for (int rowNo = 0; rowNo <= sheet.LastRowNum; rowNo++) 
      { 
       var row = sheet.GetRow(rowNo); 
       if (row == null) // null is when the row only contains empty cells 
        continue; 
       for (int cellNo = 0; cellNo <= row.LastCellNum; cellNo++) 
       { 
        var cell = row.GetCell(cellNo); 
        if (cell == null) // null is when the cell is empty 
         continue; 
        var topBorderStyle = cell.CellStyle.BorderTop; 
        if (topBorderStyle != BorderStyle.None) 
        { 
         MessageBox.Show(string.Format("Cell row: {0} column: {1} has TopBorder: {2}", cell.Row.RowNum, cell.ColumnIndex, topBorderStyle)); 
        } 
       } 
      } 
     }