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