외부 통합 문서 참조가 포함된 스프레드 시트 가져오기 및 내보내기 (Spread.NET WinForms) > 블로그 & Tips

본문 바로가기

Spread.NET

블로그 & Tips

외부 통합 문서 참조가 포함된 스프레드 시트 가져오기 및 내보내기 (Spread.NET WinForms)

페이지 정보

작성자 GrapeCity 작성일 20-04-24 00:00 조회 357회 댓글 0건

본문

이 글은 간단한 수식을 사용하여 셀 범위에 있는 통합 문서의 외부 링크를 반환하기 위해 동적 배열을 사용하여 사용자 지정 함수를 만드는 방법에 대해 어떻게 Spread.NET Winforms을 사용해야 하는지 설명합니다.


아래는 문서가 다룰 내용입니다 :


  1. Microsoft Excel 통합 문서 ( .XLSX 또는 .XLS )를 가져오고 내보내는 방법 또는 셀 수식에 있는 다른 통합 문서외부 링크(셀 또는 범위 참조)를 포함한 Excel 통합문서( * .XLSM매크로 사용법 .
  2. IEvaluationContext.ReferenceSource를 사용하여 IWorkbook에 대한 참조를 가져온 다음 셀 수식에 외부 링크를 반환하는 사용자 지정 함수 GETLINKS()를 만드는 방법.
  3. 셀 범위에 있는 외부 링크의 목록을 보여주기 위한 동적 배열 기능의 사용법.

Spread.NET 13 WinForms는 Microsoft Excel과 같은 다른 통합 문서에 대한 외부 링크를 지원하며 이러한 외부 링크가 포함된 기존 통합 문서를 가져올 수 있습니다.


[C#]


엑셀 파일 열기

OpenFileDialog d = new OpenFileDialog();
d.Filter = "Excel Workbook (*.XLSX;*.XLSM;*.XLS)|*.XLSX;*.XLSM;*.XLS";
d.Title = "Open Excel Workbook";
if (d.ShowDialog() == DialogResult.OK)
    fpSpread1.OpenExcel(d.FileName);


[VB]


엑셀 파일 열기
Dim d As OpenFileDialog = New OpenFileDialog()
d.Filter = "Excel Workbook (*.XLSX;*.XLSM;*.XLS)|*.XLSX;*.XLSM;*.XLS"
d.Title = "Open Excel Workbook"
If d.ShowDialog() = DialogResult.OK Then FpSpread1.OpenExcel(d.FileName)


통합 문서에 외부 링크가 포함된 경우 IWorkbook.LinkSources 속성은 통합 문서의 파일 이름이 포함된 문자열 배열을 반환합니다.


서로 참조하는 관련 통합 문서가 많거나 동일한 통합 문서의 여러 버전이 연결되어 있는 경우 외부 링크의 관리에서 문제가 발생 할 수 있습니다. 사용자 지정 함수 기능을 이용하여 통합 문서의 모든 외부 링크 목록을 반환하는 간단한 셀 수식을 지원하여 계산 엔진(Calculation Engine)을 확장시킬 수 있습니다.



사용자 지정 함수 생성



사용자 지정 함수를 생성하기 위해서는 를 계산해주는 코드와 계산 엔진 결과를 반환해주는 클래스를 구현해야 합니다. 사용자 지정 함수는 GrapeCity.CalcEngine.Function 클래스로부터 상속이 되며, 이름, 최소 인자의 수, 최대 인자의 수 그리고 기본 클래스 생성자에 대한 FunctionAttributes을 지정해야 합니다.:


[C#]


GETLINKS 사용자 지정 함수 클래스 생성자

sealed class GetLinksFunction : Function
{
    public GetLinksFunction() : base("GETLINKS", 0, 0, FunctionAttributes.Array)
    {
    }
...


[VB]


GETLINKS 사용자 지정 함수 클래스 생성자

NotInheritable Class GetLinksFunction
    Inherits [Function]
    Public Sub New()
        MyBase.New("GETLINKS", 0, 0, FunctionAttributes.Array)
    End Sub
...


이 예는 인자를 받지 않고 배열값을 반환하는 GETLINKS라는 새 함수를 정의합니다.


외부 링크를 가져오기 위해 함수는 IWorkbook 인터페이스를 사용할 필요가 있으며 클래스는 IEvaluationContext로부터 IWorkbook을 반환하는 private 도우미 함수(private helper function)  GetWorkbook를 구현해야 합니다.:


[C#]


GetWorkbook 함수

...
    private IWorkbook GetWorkbook(IEvaluationContext context)
    {   // use IEvaluationContext.ReferenceSource to get the IWorkbook
        IWorkbook workbook;
        IWorksheet worksheet = context.ReferenceSource as IWorksheet;
        if (worksheet != null)
        {
            workbook = worksheet.Workbook;
        }
        else
        {
            workbook = context.ReferenceSource as IWorkbook;
        }
        return workbook;
    }
...


[VB]


GetWorkbook 함수

...
    Private Function GetWorkbook(context As IEvaluationContext) As IWorkbook
        ' Use IEvaluationContext.ReferenceSource to get the IWorkbook
        Dim workbook As IWorkbook = Nothing
        If TypeOf context.ReferenceSource Is IWorksheet Then
            Dim worksheet As IWorksheet = CType(context.ReferenceSource, IWorksheet)
            workbook = worksheet.Workbook
        ElseIf TypeOf context.ReferenceSource Is IWorkbook Then
            workbook = CType(context.ReferenceSource, IWorkbook)
        End If
        Return workbook
    End Function
...


사용자 지정 함수 평가(Evaluate) 메소드를 재정의하고 함수를 계산하여 계산된 결과를 반환할 수 있는 로직을 구현해야 합니다. GETLINKS함수의 경우, Evaluate은 문자열 배열에 외부 링크를 넣고 그 배열을 반환하기 위해서 GetWorkbook에 의해 반환된 IWorkbook을 사용해야 합니다. :



[C#]


GetLinksFunction 재정의 평가

...
    protected override void Evaluate(IArguments args, IValue result)
    {
        IWorkbook workbook = GetWorkbook(args.EvaluationContext);
        if (workbook != null && workbook.LinkSources != null && workbook.LinkSources.Length > 0)
        {   // copy the link sources to array and return
            string[] links = workbook.LinkSources;
            IValuesArray array = result.CreateValuesArray(links.Length, 1);
            for (int i = 0; i < links.Length; i++)
                array[i, 0].SetValue(links[i]);
            result.SetValue(array);
        }
        else // return #N/A error
            result.SetValue(CalcError.NotAvailable);
    }
} // class GetLinksFunction


[VB]


GetLinksFunction 재정의 평가

...
    Protected Overrides Sub Evaluate(args As IArguments, result As IValue)
        Dim workbook As IWorkbook = GetWorkbook(args.EvaluationContext)
        If Not IsNothing(workbook) AndAlso Not IsNothing(workbook.LinkSources) AndAlso workbook.LinkSources.Length > 0 Then
            ' copy the link sources to array and return
            Dim links() As String = workbook.LinkSources
            Dim array As IValuesArray = result.CreateValuesArray(links.Length, 1)
            For i As Integer = 0 To links.Length - 1
                array(i, 0).SetValue(links(i))
            Next
            result.SetValue(array)
        Else ' return #N/A error
            result.SetValue(CalcError.NotAvailable)
        End If
    End Sub
End Class


통합 문서에 외부 링크가 하나 이상 있으면 코드에서 IWorkbook.LinkSources를 가져오고 새 IValuesArray 로 설정한 다음 계산 엔진에 배열을 반환하기 위해 result.SetValue 를 사용합니다그렇지 않으면 함수는 # N / A 오류값을 반환합니다. 편의상, 세로 배열이 더 유용하기 때문에, 함수는 가로 배열이 아닌 세로 배열에서 값의 배열을 반환합니다.(이전 Excel 4.0 LINKS 매크로가를 세로 배열로 반환)



동적 배열을 사용하여 결과 보여주기



새로운 동적 배열 기능을 사용하면 사용자 지정 GETLINKS 함수를 활성화시키고 인접 셀에 결과를 보여주고 셀 범위에 외부 링크 목록을 작성할 수 있습니다. 동적 배열 기능을 사용하려면 스프레드 디자이너 도구를 열고 수식(Formulas) 탭에서 동적 배열(Dynamic Array) 체크 박스를 선택해야 합니다 .



또는 코드에서 동적 배열(Dynamic Array) 기능을 활성화할 수 있습니다 .



[C#]


코드에서 동적 배열 활성화

fpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.CalcFeatures = GrapeCity.Spreadsheet.CalcFeatures.DynamicArray;


[VB]


코드에서 동적 배열 활성화

FpSpread1.AsWorkbook().WorkbookSet.CalculationEngine.CalcFeatures = GrapeCity.Spreadsheet.CalcFeatures.DynamicArray


동적 배열 기능이 활성화되면 수식이 결과값의 배열을 반환하고 인접한 빈 셀에 보여지게 됩니다. 새 워크 시트에 있는 통합 문서에 외부 링크의 목록을 생성하고 확장된 범위의 링크를 보다 편리하게 관리하기 위해서는 GETLINKS 함수를 사용할 수 있습니다.

  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그

그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@grapecity.com | 전화 : 1670-0583 | 경기도 안양시 동안구 시민대로 230, B-703(관양동, 아크로타워) 그레이프시티(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 Copyright ⓒ 2021 GrapeCity inc.