본문 바로가기

코딩의 유익함/스위프트(Swift)

Swift(스위프트) - 엑셀파일(xlsx) 읽고 출력하기

엑셀파일 읽기

1. GitHub에 있는 엑셀(XLSX) 라이브러리 사용


1.1 자신의 프로젝트 선택 ->  Frameworks.. 선택 -> + 클릭

 

1.2 왼쪽 하단 Add Package Dependency... -> https://github.com/CoreOffice/CoreXLSX.git 삽입 ->  Next 클릭

 

1.3 CoreOfiice/CoreXLSX 라이브러리 생성 확인

 

1.4 엑셀과 직접적으로 관련있는 swift파일은 "CoreXLSX" 폴더에서 확인

 

위 순서는 지난 번에 포스팅한 글과 유사하여 그림을 뺐는데, 따라가기가 어려우시면 아래의 포스팅을 한번 확인 해주세요.

 

https://value-of-life.tistory.com/150

 

 

2. 엑셀 파일 불러오기


2.1 엑셀 파일 생성 -> Playground -> Resource로 넣기

엑셀 파일을 불러오기 위해서는 먼저 엑셀 파일 1개를 생성해주세요. 저는 Playground를 이용했는데, 해당 프로젝트 아래 Resource에 넣어주시면 됩니다. (Playground파일 생성 방법 : xcode - file - new - Playground...)

2.1(xlsx)

2.2 불러올 엑셀 파일 지정

위 2.1 에서 email이라는 이름의 엑셀 파일을 하나 생성했습니다. 다음은 이 엑셀 파일을 지정할 수 있어야 하는데요. 아래와 같은 코드로 해당 엑셀파일의 위치한 경로를 가져오고, 파일을 지정할 수 있습니다.

2.2(xlsx)

제가 임의로 생성한 클래스 OpenXlsx 인데요. 프로퍼티로 3가지(파일 이름, 파일 타입, 파일 경로)를 만들었습니다. 즉, 이 3가지를 알면 파일을 열수 있도록 말이지요. 이니셜라이저에서 filepath를 초기화 할 때는 파일 이름과 타입을 알면 Resource에서 찾아 경로를 알려줍니다.

 

2.3 지정한 엑셀 파일 불러오기

위에서 지정한 엑셀 파일을 열겠습니다. 지금부터는 GitHub에서 가져온 라이브러리를 사용합니다.

2.3(xlsx)

위에서 지정했던 엑셀파일이 존재한다면 그 파일을 가져오고, 없다면 에러메시지를 출력합니다.

 

2.4 sheet의 이름과 지정한 열의 이름 출력하기

아래 그림에 해당하는 라이브러리들의 함수와 변수들을 하나하나 확인하고 싶지만, 그 내용이 굉장히 복잡할뿐더러 시간이 오래걸리고, 저도 이해하기가 매우 어려워 대략적인 설명만을 담았습니다.

2.4(xlsx)

각 줄의 주석의 설명을 참고하시면 sheet의 이름과, 특정 열의 값을 어떻게 가져와 출력할 수 있는지 대략적으로 알 수 있으실겁니다. 이것을 참조해서 응용하면 엑셀의 모든 내용을 자유롭게 가져올 수 있을 것으로 보입니다.

 

2.4 출력 결과 확인

아래 그림은 2.4의 코드를 실행한 출력 결과입니다.

2.5(xlsx)

 

3. 전체 소스코드


MyPlayground.playground

import
Foundation

import CoreXLSX

 

class OpenXlsx {

    

    public var fileName: String

    public var fileType: String

    public let filePath : String?

    

    init(fileName: String,

         fileType: String,

         filepath: String?)

    {

        self.fileName = fileName

        self.fileType = fileType

        self.filePath = Bundle.main.path(forResource: fileName, ofType: fileType)

    }

    convenience init()

    {

        self.init(fileName: "email", fileType: "xlsx", filepath: nil)

    }

        

    func OpenXlsxTest() {

        if let fpath = self.filePath {

            guard let file = XLSXFile(filepath: fpath) else {

                fatalError("XLSX file at \(String(describing: self.filePath)) is corrupted or does not exist")

              }

            

        do { // 파일에서 excel의 통합문서를 지칭하는 workbook을 배열로 반환합니다. 여기서는 email.xlsx

            for wbk in try file.parseWorkbooks() {

                 // woorkbook에서 sheet의 이름과 그 경로를 순환하며 name과 path 변수에 반환합니다.

                for (name, path) in try file.parseWorksheetPathsAndNames(workbook: wbk) {

                    

                    if let worksheetName = name {

                        // workbook에 있는 모든 sheet의 이름을 출력합니다.

                       print("\(worksheetName)")

                    }

                    // sheet의 경로(path)를 이용하여 해당 sheet를 worksheet 변수에 반환합니다.

                    let worksheet = try file.parseWorksheet(at: path)

                    // 아래의 세 줄이 sheet별 A열에 해당하는 값을 배열로 반환합니다.

                    if let sharedStrings = try file.parseSharedStrings() {

                      let columnCStrings = worksheet.cells(atColumns: [ColumnReference("A")!])

                        .compactMap { $0.stringValue(sharedStrings) }

                        // 해당 sheet의 A열에 해당 하는 값들 출력

                        print(columnCStrings)

                    }

                   //let worksheet = try file.parseWorksheet(at: path)

                 /*   for row in worksheet.data?.rows ?? [] {

                        for c in row.cells {

                            print(c)

                          }

                    }*/

                  }

                }

            }

            catch{}

        }

    }

}

var xlsx: OpenXlsx = OpenXlsx()

print(xlsx.OpenXlsxTest())

보시고 궁금한 사항이 있으시면 댓글 부탁드리고, 계속 공부하며 업데이트 해보도록 하겠습니다.

 

감사합니다.