Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#将我的代码更改为函数/类_F# - Fatal编程技术网

F#将我的代码更改为函数/类

F#将我的代码更改为函数/类,f#,F#,我用F#编写代码(将XML文件转换为Excel文件) 程序正在成功运行。 现在我添加了main函数来获取xml路径,以便从批处理文件(在cmd行中)运行程序, 我需要将代码更改为函数或类,以便将路径作为参数发送到逻辑 我试着去做,但是我有很多错误 我的代码(fs文件): // 模块XML2Excel 开放系统 开放系统 打开Microsoft.Office.Interop 开放系统.Xml open System.Xml.XPath 开放系统;绘图//字体 opensystem.Xml.Linq

我用F#编写代码(将XML文件转换为Excel文件) 程序正在成功运行。 现在我添加了main函数来获取xml路径,以便从批处理文件(在cmd行中)运行程序, 我需要将代码更改为函数或类,以便将路径作为参数发送到逻辑

我试着去做,但是我有很多错误

我的代码(fs文件):

//
模块XML2Excel
开放系统
开放系统
打开Microsoft.Office.Interop
开放系统.Xml
open System.Xml.XPath
开放系统;绘图//字体
opensystem.Xml.Linq;
打开FSharp.Data
let functionParseXmlToExcel(文件名:string)=
//函数体在这里
///////////////////////////////////////////////////加载XmlDoc
设xmlDoc=newxmldocument();;
//////////////////////////////////////////////////Xml路径
让mXmlPath=fileName
//(“C:\\Users\\rivkar\\Desktop\\myprojects\\Zmira\\XML2Excel\\”+“NIMO.xml”);;
//////////////////////////////////////////////////加载XML
加载(mXmlPath);;
//////////////////////////////表节点
let tablePath=“/OCEXPORT”
让docTablesElement=xmlDoc.DocumentElement
让nodeTablesList=docTablesElement。选择SingleNode(tablePath)。ChildNodes
//////////////////////////////////启动Excel
设xlApp=new Excel.ApplicationClass()/(Visible=true)
设xlWorkBookOutput=xlApp.Workbooks.Add()
//xlApp.Visible Excel.Worksheet
xlWorkSheetOutput.Name Seq.map(乐趣节点->节点值)
|>String.concat环境.NewLine)
|]

xlWorkSheetOutput.Cells.[1,columns]如果您想让它保持超级简单,只需将xml相关代码包装到函数中(在本例中为functionExample)。然后从main调用该函数。传递给main的任何参数都可以传递给函数:

open System
open System.IO

let functionExample (fileName:string) =
    //Function Body goes here
    File.Exists(fileName)

[<EntryPoint>]
let main argv = 
    printfn "%A" argv.[0]
    let fName = argv.[0]
    printfn "%A" (functionExample fName) |> ignore
    0 // return an integer exit code
编辑: 如果你听从福吉的建议,关于未完成的积木的错误就会消失

之后,您有两种方法来运行此操作:

[<EntryPoint>]
let main argv = 
    printfn "%A" argv.[0]
    //let fName = argv.[0]
    (functionParseXmlToExcel "C:\\Users\\rivkar\\Desktop\\My Projects\\Zmira\\XML2Excel\\NIMO.xml") |> ignore
    0 // return an integer exit code
[]
让主argv=
printfn“%A”argv。[0]
//设fName=argv[0]
(functionParseXmlToExcel“C:\\Users\\rivkar\\Desktop\\My Projects\\Zmira\\XML2Excel\\NIMO.xml”)|>忽略
0//返回整数退出代码
这将硬编码文件,所以在我看来,你应该试试这个。把你的主菜换成这个

[<EntryPoint>]
let main(args) =    
    printfn "args: %A" args
    let fName = argv.[0]
    (functionParseXmlToExcel fName) |> ignore
    Console.ReadLine()
    0
[]
let main(args)=
printfn“args:%A”args
设fName=argv[0]
(functionParseXmlToExcel fName)|>忽略
Console.ReadLine()
0
然后右键单击VisualStudio中的项目并选择Build

它将在ProjectName\Debug\bin下构建一个可执行文件。我的名为
StackOverflow3.exe
。它可能在Release\bin下,但您可以在VS中签入exe的保存位置

你的将是你命名的任何项目。然后,您可以像这样将文件名传递给此exe:
StackOverflow3.exe“C:\\Users\\rivkar\\Desktop\\My Projects\\Zmira\\XML2Excel\\NIMO.xml”


您可以从批处理文件调用此exe,循环此文件,并传递要处理的不同文件名。这不是构造它的最佳方式,但它是最简单的

谢谢你的回答

以下代码正在运行:

//
module XML2Excel

open System
open System.IO
open Microsoft.Office.Interop
open System.Xml
open System.Xml.XPath
open System.Drawing;; //For Font
open System.Xml.Linq;
open FSharp.Data

let functionParseXmlToExcel (fileName:string) =
            //Function Body goes here


        ///////////////////////////////////////////////////Load XmlDoc
        let xmlDoc = new XmlDocument()
        //////////////////////////////////////////////////Xml Path
        let mXmlPath = fileName
        //("C:\\Users\\rivkar\\Desktop\\My Projects\\Zmira\\XML2Excel\\" + "NIMO.xml");;
        //////////////////////////////////////////////////Load XML
        xmlDoc.Load(mXmlPath)


        //////////////////////////////Tables Nodes
        let tablePath="/OCEXPORT"
        let docTablesElement = xmlDoc.DocumentElement
        let nodeTablesList = docTablesElement.SelectSingleNode(tablePath).ChildNodes



        ////////////////////////////////// Start Excel
        let xlApp = new Excel.ApplicationClass()//(Visible = true)
        let xlWorkBookOutput = xlApp.Workbooks.Add()
        //xlApp.Visible <- true

        ////////////////////////////////////Load Excel Format
        //let xlWorkBookFormat = xlApp.Workbooks.Open(@"C:\Users\rivkar\Desktop\My Projects\Zmira\XML2Excel\nimo2_types.xlsx")

        //////////////////////////////////// Loop on Tables (Excel Sheets)
        for tabs in 1 .. nodeTablesList.Count do   

            let tableNamePath="/OCEXPORT/TABLE"
            let docElement = xmlDoc.DocumentElement
            let nodeTableNameList = docElement.ChildNodes.[tabs-1].FirstChild

            let columnsPath= tableNamePath+"/"+nodeTableNameList.Name

            let nodeColumsList = docElement.SelectSingleNode(columnsPath).ChildNodes

            let xlWorkSheetOutput = xlWorkBookOutput.Worksheets.[tabs] :?> Excel.Worksheet
            xlWorkSheetOutput.Name <- nodeTableNameList.Name
            xlWorkSheetOutput.get_Range("A1:Z1").Interior.Color <- Color.SkyBlue

            /////////////////////////////////////Loop on Columns    
            for columns in 1.. nodeColumsList.Count do
                     let Node = "/OCEXPORT/TABLE/"+nodeTableNameList.Name+"/"+nodeColumsList.Item(columns-1).Name+"/text()"   
                     let data = [|
                          (xmlDoc.SelectNodes Node
                              |> Seq.cast<XmlNode>
                              |> Seq.map (fun node -> node.Value)
                              |> String.concat Environment.NewLine)
                              |]
                     xlWorkSheetOutput.Cells.[1, columns] <- nodeColumsList.Item(columns-1).Name
                     let rows = data.[0].Split '\n'// rows

                     //let row = xlWorkBookFormat.

                     for j in 1 .. rows.Length do
                           xlWorkSheetOutput.Cells.[j+1, columns] <- rows.[j-1]
                           xlWorkSheetOutput.Range("A1:A100").NumberFormat <- "0.0"

            //if (tabs <= nodeTablesList.Count) then
            xlWorkBookOutput.Worksheets.Add(After=xlWorkBookOutput.Worksheets.[xlWorkBookOutput.Worksheets.Count])

        /////////////////////////////Delete Unnecessary Sheets
        //xlWorkBookOutput.Worksheets.Visible <- true
        //xlWorkBookOutput.Worksheets.Delete()


        ////////////////////////////Save the Excel File
        let excelPath = "C:\\Users\\rivkar\\Desktop\\My Projects\\Zmira\\XML2Excel\\"+DateTime.Today.ToString("yyyy_dd_MM_BNA")+".xls"
        if File.Exists(excelPath) then
                 File.Delete(excelPath)

        xlWorkBookOutput.SaveAs excelPath, -4143
        File.Exists(fileName)

[<EntryPoint>]
let main(args) =    
    //printfn "args: %A" args.[0]
    let fName = args.[0]
    //"C:\\Users\\rivkar\\Desktop\\My Projects\\Zmira\\XML2Excel\\NIMO.XML"
    printfn "%A" (functionParseXmlToExcel fName) |> ignore
    //Console.ReadLine()

    0
//
模块XML2Excel
开放系统
开放系统
打开Microsoft.Office.Interop
开放系统.Xml
open System.Xml.XPath
开放系统;绘图//字体
opensystem.Xml.Linq;
打开FSharp.Data
let functionParseXmlToExcel(文件名:string)=
//函数体在这里
///////////////////////////////////////////////////加载XmlDoc
设xmlDoc=newxmldocument()
//////////////////////////////////////////////////Xml路径
让mXmlPath=fileName
//(“C:\\Users\\rivkar\\Desktop\\myprojects\\Zmira\\XML2Excel\\”+“NIMO.xml”);;
//////////////////////////////////////////////////加载XML
加载(mXmlPath)
//////////////////////////////表节点
let tablePath=“/OCEXPORT”
让docTablesElement=xmlDoc.DocumentElement
让nodeTablesList=docTablesElement。选择SingleNode(tablePath)。ChildNodes
//////////////////////////////////启动Excel
设xlApp=new Excel.ApplicationClass()/(Visible=true)
设xlWorkBookOutput=xlApp.Workbooks.Add()
//xlApp.Visible Excel.Worksheet
xlWorkSheetOutput.Name Seq.map(乐趣节点->节点值)
|>String.concat环境.NewLine)
|]

xlWorkSheetOutput.Cells。[1,columns]感谢您的回答,但当我这样做时,我会得到很多错误(关于let语法),例如:let xmlDoc=new XmlDocument();-此let后面的块未完成。。。你知道这件事吗?谢谢你将不得不显示错误,将这些错误作为编辑添加到原始问题中是个好主意。非常感谢!!!!你想要我可以从cmd运行它-我如何编写参数-xml文件的路径?@RivkaRot请查看如何使用文件名构建和调用exe。我需要发送3个参数:xml文件的路径、Excel文件的路径和另一个路径,我尝试编写[]let main(args)=Array.iter(fun x->printfn“%s”x)args//printfn“args:%A”args.[0]让xmlP=args.[0]让excelformat=args.[1]让excelP=args.[2]/“C:\\Users\\rivkar\\Desktop\\myprojects\\Zmira\\XML2Excel\\NIMO.XML”printfn”%A“(函数解析xmltoExcel(xmlP,excelformat,excelP))|>忽略0但它不起作用我知道我需要解析参数你知道吗?我尝试将所有代码插入函数中,以便能够从主函数调用它并发送
[<EntryPoint>]
let main(args) =    
    printfn "args: %A" args
    let fName = argv.[0]
    (functionParseXmlToExcel fName) |> ignore
    Console.ReadLine()
    0
//
module XML2Excel

open System
open System.IO
open Microsoft.Office.Interop
open System.Xml
open System.Xml.XPath
open System.Drawing;; //For Font
open System.Xml.Linq;
open FSharp.Data

let functionParseXmlToExcel (fileName:string) =
            //Function Body goes here


        ///////////////////////////////////////////////////Load XmlDoc
        let xmlDoc = new XmlDocument()
        //////////////////////////////////////////////////Xml Path
        let mXmlPath = fileName
        //("C:\\Users\\rivkar\\Desktop\\My Projects\\Zmira\\XML2Excel\\" + "NIMO.xml");;
        //////////////////////////////////////////////////Load XML
        xmlDoc.Load(mXmlPath)


        //////////////////////////////Tables Nodes
        let tablePath="/OCEXPORT"
        let docTablesElement = xmlDoc.DocumentElement
        let nodeTablesList = docTablesElement.SelectSingleNode(tablePath).ChildNodes



        ////////////////////////////////// Start Excel
        let xlApp = new Excel.ApplicationClass()//(Visible = true)
        let xlWorkBookOutput = xlApp.Workbooks.Add()
        //xlApp.Visible <- true

        ////////////////////////////////////Load Excel Format
        //let xlWorkBookFormat = xlApp.Workbooks.Open(@"C:\Users\rivkar\Desktop\My Projects\Zmira\XML2Excel\nimo2_types.xlsx")

        //////////////////////////////////// Loop on Tables (Excel Sheets)
        for tabs in 1 .. nodeTablesList.Count do   

            let tableNamePath="/OCEXPORT/TABLE"
            let docElement = xmlDoc.DocumentElement
            let nodeTableNameList = docElement.ChildNodes.[tabs-1].FirstChild

            let columnsPath= tableNamePath+"/"+nodeTableNameList.Name

            let nodeColumsList = docElement.SelectSingleNode(columnsPath).ChildNodes

            let xlWorkSheetOutput = xlWorkBookOutput.Worksheets.[tabs] :?> Excel.Worksheet
            xlWorkSheetOutput.Name <- nodeTableNameList.Name
            xlWorkSheetOutput.get_Range("A1:Z1").Interior.Color <- Color.SkyBlue

            /////////////////////////////////////Loop on Columns    
            for columns in 1.. nodeColumsList.Count do
                     let Node = "/OCEXPORT/TABLE/"+nodeTableNameList.Name+"/"+nodeColumsList.Item(columns-1).Name+"/text()"   
                     let data = [|
                          (xmlDoc.SelectNodes Node
                              |> Seq.cast<XmlNode>
                              |> Seq.map (fun node -> node.Value)
                              |> String.concat Environment.NewLine)
                              |]
                     xlWorkSheetOutput.Cells.[1, columns] <- nodeColumsList.Item(columns-1).Name
                     let rows = data.[0].Split '\n'// rows

                     //let row = xlWorkBookFormat.

                     for j in 1 .. rows.Length do
                           xlWorkSheetOutput.Cells.[j+1, columns] <- rows.[j-1]
                           xlWorkSheetOutput.Range("A1:A100").NumberFormat <- "0.0"

            //if (tabs <= nodeTablesList.Count) then
            xlWorkBookOutput.Worksheets.Add(After=xlWorkBookOutput.Worksheets.[xlWorkBookOutput.Worksheets.Count])

        /////////////////////////////Delete Unnecessary Sheets
        //xlWorkBookOutput.Worksheets.Visible <- true
        //xlWorkBookOutput.Worksheets.Delete()


        ////////////////////////////Save the Excel File
        let excelPath = "C:\\Users\\rivkar\\Desktop\\My Projects\\Zmira\\XML2Excel\\"+DateTime.Today.ToString("yyyy_dd_MM_BNA")+".xls"
        if File.Exists(excelPath) then
                 File.Delete(excelPath)

        xlWorkBookOutput.SaveAs excelPath, -4143
        File.Exists(fileName)

[<EntryPoint>]
let main(args) =    
    //printfn "args: %A" args.[0]
    let fName = args.[0]
    //"C:\\Users\\rivkar\\Desktop\\My Projects\\Zmira\\XML2Excel\\NIMO.XML"
    printfn "%A" (functionParseXmlToExcel fName) |> ignore
    //Console.ReadLine()

    0