2013-04-25 2 views
3

F # 프로그램의 일부 입력을 정의하는 문서 리포지토리에 사용자 편집 가능한 Excel 파일이 있습니다. 나는 F # -y를 사용하여 그것을 읽고 싶습니다, 그래서 나는 FSharpX와 ExcelFile 타입 제공자를 시험해 볼 것이라고 생각했습니다.F # 형식 공급자 FSharpX.ExcelFile 및 다른 입력으로 작성하려고하는 이상한 형식 오류

공급자는 NuGet을 통해 설치 및 사용할 수 있습니다

작동 무엇

,이 작품 :

open FSharpX 
type Example = ExcelFile<"example.xlsx", "Worksheet1", true> 
let file = new Example() 
for row in File.Data do ...... 

내가 다른과 생성자를 초기화 할 때, 그러나하지

않습니다 파일 (하나는 런타임에 데이터베이스에서 꺼내어 임시 위치에 숨김)을 사용하면 정말 이상한 형식 오류가 발생합니다.

The type provider 'FSharpx.TypeProviders.ExcelProvider+ExcelProvider' reported an error in the context of provided type 'FSharpx.ExcelFile,filename="example.xlsx",sheetname="Worksheet1",forcestring="True"', member '.ctor'. The error: Type mismatch when splicing expression into quotation literal. The type of the expression tree being inserted doesn't match the type expected by the splicing operation. Expected 'System.String', but received type 'System.Tuple`2[System.String,System.String]'. Consider type-annotating with the expected expression type, e.g., (%% x : string) or (%x : string). Parameter name: receivedType

허에서

let file = new Example(@"c:\temp\path\to.xlsx") 

결과?

터플이 어디서오고 있는지에 대해서는 잘 모릅니다. 초기화 방법에 대한 아이디어는 없습니다.

보너스 질문 : 런타임시 워크 시트 이름을 바꿀 경우 어떻게해야합니까? 기존 FSharpx 공급자는이를 허용하지 않습니다.

답변

4

이것은 공급자의 버그이며 코드는 아닙니다. 제공되는 생성자는 전달한 파일 이름을 사용하지만 기본 코드는 파일 이름과 통합 문서 이름 (튜플을 가져올 위치)을 필요로합니다.

+0

확인을, 그냥 확인 내가 미친 또는 뭔가 잘못하고 생각했다. 버그를 제기합니다. –

+2

이 버그가 수정되었습니다. https://github.com/fsharp/fsharpx/commit/e9912d9cb68cedd723e351748c47f9fefc7bbb3d (154 줄 참조) –

4

버그가있는 것 같습니다. 사무실 반대로 그 (ClosedXML를 사용하므로 수정, 나는 잠시 전 FSharpx.Excel 유형 제공자를 포크

ty.AddMember(ProvidedConstructor([ProvidedParameter("filename", typeof<string>)], InvokeCode = fun [filename] -> <@@ ExcelFileInternal(%%filename) @@>)) 
.... 
type ExcelFileInternal(filename, sheetorrangename) 

: 하나의 파일 이름 매개 변수를 받아들이는 제공된 생성자는 인용 올바르게 내부 생성자를 호출하지 않습니다 interop), 파일이> = office 2007 인 경우 (귀하의 워크 북은 다음과 같습니다). 또한 워크 시트 (및/또는 범위)를 제공된 유형, '행'제공 유형 및 '행 {n}'유형으로 표시하여 API를 약간 변경했습니다.

type exc = ExcelFile<"C:\\temp\\Template.xlsx",false> 
let file = new exc(@"C:\\temp\\Book.xlsx") 
for row in file.Sheet1.Rows do 
    printfn "%s" row.BID 
let sht1Row1Col20 = file.Sheet1.Row1.BID 

'스프레드 시트'유형이 제공되지 않으므로 런타임시 워크 시트 이름을 변경할 수 없습니다. 문자열 [] 'SheetAndRangeNames'유형이 있지만 그다지 유용하지는 않습니다. 그러나 구현하기가 까다로울 필요는 없습니다. 당신은 여기에서 찾을 수 있습니다

https://github.com/bennylynch/ExcelTypeProvider/

+1

감사합니다! 나는 그들이 당신의 변화를 이끌어 내야한다고 생각합니다. interop을 피하는 것은 * 위대함 *입니다 ... 이것은 우선 순위 목록에서 매우 높지는 않지만, 어쩌면 저는 여러분의 포크를 포크하고 언젠가는 그것에 계속 추가 할 것입니다. –

+1

항상 의미가 있었지만, 결코 그것에 도달하지 못했습니다 .... 그리고 나는 그것이 지금 sycn에서 다소 벗어날 것으로 생각합니다. 최신 정보를 포크하여 업데이트하고 끌어 오기 요청을 보내면 .... 이제는 사용 가능할 것입니다. 그냥 내 코드를 공개적으로 웃지 않기를 바란다 ..... –