Neally Bot<\/li>\n<\/ul>","upvoteCount":1,"datePublished":"2021-12-07T21:47:11.000Z","url":"https://community.spiceworks.com/t/powershell-script-error/819031/9","author":{"@type":"Person","name":"Neally","url":"https://community.spiceworks.com/u/Neally"}},{"@type":"Answer","text":"Function FormatID ($strID)\n{\n $modID = $strID\n\n $idLen =$modID.Length\n $idLen = 10 - $idLen\n\n if($idLen -lt 10)\n {\n for($i=0; $i -lt $idLen; $i++)\n {\n $modID = \"0$modID\"\n }\n \n }\n\n Return $modID\n}\n\nFunction ConvertFrom-CurrencyString\n { \n param($target) \n \n [ref]$number=$null \n \n $styles = [System.Globalization.NumberStyles]::AllowCurrencySymbol -bor\n [System.Globalization.NumberStyles]::AllowParentheses -bor \n [System.Globalization.NumberStyles]::AllowDecimalPoint -bor \n [System.Globalization.NumberStyles]::AllowThousands -bor\n [System.Globalization.NumberStyles]::AllowLeadingSign \n \n if([decimal]::TryParse($target, $styles, $null, $number)) { \n $number.Value \n } else { \n Write-Host 'Currency conversion error in file - ' $ExcelDoc \n } \n} \n\n$EmailDictionary = New-Object System.Collections.Generic.Dictionary“[[System.String],[System.String]]”\n\nFunction Extract-GraebelUploadData\n{\n\n$currentDirectory = Get-Location\n$outlook = new-object -comobject outlook.application\n$emails = get-childitem $msgpath -filter *.msg\n\nwrite-host \"Revewing \" + $emails.Count + \"emails....\"\n \nforeach ($email in $emails)\n{\n \n $RemoveEmail = 0\n \n $Message = $outlook.CreateitemFromTemplate($email.FullName)\n $Message.attachments|foreach{\n\n\t if($_.filename -like '*Upload*')\n\t {\n\n $EmailDictionary.Add($_.filename, $email.Name)\n \n if(-not(Test-Path (Join-Path $currentDirectory $_.filename)))\n {\n $_.saveasfile((Join-Path $currentDirectory $_.filename))\n $RemoveEmail = 1\n }\n Else\n {\n Write-Host 'A duplicate file name has been detected in message' + $_.filename\n $RemoveEmail = 0\n }\n\t }\n\t\n } \n \n #if($RemoveEmail -eq 1){Remove-Item $email.FullName} Disabling deleting the emails\n\n}\n\n}\n\nExtract-GraebelUploadData\n\n$dirLocation = Get-Location\n$ExcelFiles = Get-ChildItem $dirLocation -Filter *.xl*\n\n#Excel Conn String\n$strFileName = \"C:\\Data\\scriptingGuys\\Servers.xls;\"\n$strSheetName = 'ServerList$'\n$strProvider = \"Provider=Microsoft.ACE.OLEDB.12.0;\"\n\n$strExtend = ';Extended Properties=\"Excel 12.0; HDR=NO;IMEX=1;\"'\n #HDR=NO tells the conn string that there is no header rows avaible, it should use excel column names instead.\n$strQuery = \"Select * from [Sheet1$]\" #IMEX=1 tells the conn string to import intermixed data. this means it will not auto guess at the columns.\n\n#Build Temporary table to be used below to store data from Graebel Files\n\n$tmpTable = New-Object System.Data.DataTable\n$tmpDataColumn = New-Object System.Data.DataColumn\n\n$col1 = New-Object System.Data.DataColumn 'VendorName', ([string])\n$col2 = New-Object System.Data.DataColumn 'VendorNum', ([string])\n$col3 = New-Object System.Data.DataColumn 'VendorSiteCode', ([string])\n$col4 = New-Object System.Data.DataColumn 'InvoiceNum', ([string])\n$col5 = New-Object System.Data.DataColumn 'InvoiceDate', ([string])\n$col6 = New-Object System.Data.DataColumn 'Description', ([string])\n$col7 = New-Object System.Data.DataColumn 'InvoiceType', ([string])\n$col8 = New-Object System.Data.DataColumn 'InvoiceAmount', ([string])\n$col9 = New-Object System.Data.DataColumn 'CurrCode', ([string])\n$col10 = New-Object System.Data.DataColumn 'Paygroup', ([string])\n$col11 = New-Object System.Data.DataColumn 'LineType', ([string])\n$col12 = New-Object System.Data.DataColumn 'GLAccount', ([string])\n$col13 = New-Object System.Data.DataColumn 'LineDesc', ([string])\n$col14 = New-Object System.Data.DataColumn 'TermsName', ([string])\n$col15 = New-Object System.Data.DataColumn 'LineAmount', ([string])\n\n$tmpTable.Columns.Add($col1)\n$tmpTable.Columns.Add($col2)\n$tmpTable.Columns.Add($col3)\n$tmpTable.Columns.Add($col4)\n$tmpTable.Columns.Add($col5)\n$tmpTable.Columns.Add($col6)\n$tmpTable.Columns.Add($col7)\n$tmpTable.Columns.Add($col8)\n$tmpTable.Columns.Add($col9)\n$tmpTable.Columns.Add($col10)\n$tmpTable.Columns.Add($col11)\n$tmpTable.Columns.Add($col12)\n$tmpTable.Columns.Add($col13)\n$tmpTable.Columns.Add($col14)\n$tmpTable.Columns.Add($col15)\n\n$dirLocation = Get-Location\n\nForEach($ExcelDoc in $ExcelFiles)\n{\n\n Write-Host 'Starting work on - ' $ExcelDoc \n\n $strDataSource = \"Data Source = \" + $ExcelDoc.FullName\n $fullConnString = ($strProvider + $strDataSource + $strExtend)\n\n $objConn = New-Object System.Data.OleDb.OleDbConnection($fullConnString)\n $objConn.open()\n\n $sqlCommand = New-Object System.Data.OleDb.OleDbCommand($strQuery)\n #create connection to file\n $sqlCommand.Connection = $objConn\n\n \n $DataReader = $sqlCommand.ExecuteReader()\n\n Try\n {\n \n \n While($DataReader.Read())\n {\n if($DataReader[0].ToString() -eq 'Expense')\n {\n $DataRow = $tmpTable.NewRow()\n\n #$DataRow['Source'] = $DataReader[0].ToString()\n #$DataRow['Org'] = $DataReader[1].ToString()\n \n #Build in Logic to change Vendor Name, Vendor Number, Sitecode and Line Description if Company Code = China or Morocco\n \n $DataRow['VendorName'] = $DataReader[2].ToString()\n #$DataRow['PubCode'] = $DataReader[3].ToString()\n $DataRow['VendorNum'] = $DataReader[4].ToString()\n $DataRow['VendorSiteCode'] = $DataReader[5].ToString()\n \n \n \n \n \n $DataRow['InvoiceNum'] = $DataReader[6].ToString() \n $DataRow['InvoiceDate'] = $DataReader[7]\n $DataRow['Description'] = $DataReader[8].ToString()\n $DataRow['InvoiceType'] = $DataReader[9].ToString()\n $DataRow['InvoiceAmount'] = (ConvertFrom-CurrencyString $DataReader[10].ToString())\n $DataRow['CurrCode'] = $DataReader[11].ToString()\n $DataRow['Paygroup'] = $DataReader[12].ToString()\n #$DataRow['TermsName'] = $DataReader[13].ToString() \n #$DataRow['ImageNumber'] = $DataReader[14].ToString()\n #$DataRow['ReturnId'] = $DataReader[15].ToString()\n $DataRow['LineType'] = $DataReader[16].ToString()\n $DataRow['LineAmount'] = (ConvertFrom-CurrencyString $DataReader[17].ToString())\n #$DataRow['TaxCode'] = $DataReader[18].ToString()\n #$DataRow['TaxRecoveryRate'] = $DataReader[19].ToString()\n $tmpGl = $DataReader[20].ToString()\n if($tmpGl.Substring($tmpGl.Length - 4,4) -eq '3210')\n {\n $DataRow['GlAccount'] = $tmpGl\n }\n Else\n {\n $DataRow['GlAccount'] = $tmpGl.Substring(0, ($tmpGl.Length - 4)).ToString() + '3210'\n }\n \n \n $DataRow['LineDesc'] = $DataReader[21].ToString()\n #$DataRow['PONumber'] = $DataReader[22].ToString()\n #$DataRow['POLineNumber'] = $DataReader[23].ToString()\n #$DataRow['POShipNumber'] = $DataReader[24].ToString()\n #$DataRow['PODistNumber'] = $DataReader[25].ToString()\n #$DataRow['POReleaseNumber'] = $DataReader[26].ToString()\n #$DataRow['QtyInvoiced'] = $DataReader[27].ToString()\n #$DataRow['NetUnitPrice'] = $DataReader[28].ToString()\n #$DataRow['GLDate'] = $DataReader[29].ToString()\n \n \n #$DataRow['EmployeeName'] = $DataReader[30].ToString()\n \n #$DataRow['EID'] = FormatID $DataReader[31].ToString()\n #$DataRow['CID'] = FormatID $DataReader[32].ToString()\n \n #$DataRow['ShortDesc'] = $DataReader[33].ToString()\n #$dataRow['FileName'] = $ExcelDoc\n #$DataRow['EntryID'] = $DataReader[34].ToString()\n #$DataRow['AcctCode'] = $DataReader[35].ToString()\n #$DataRow['APROmaster'] = $DataReader[36].ToString()\n #$DataRow['APROassignment'] = $DataReader[37].ToString()\n #$DataRow['ExceptionID'] = $DataReader[38]\n\n \n\n #$table.Rows.Add($DataRow)\n $tmpTable.Rows.Add($DataRow)\n\n }\n Else\n {\n #do not add record to table\n \n }\n \n \n }\n\n #Close Reader\n $DataReader.Close()\n $objConn.Close()\n\n \n \n \n\n \n \n #checks for a \"UploadFiles\" folder, if it does not currently exists this will create it.\n if(Test-Path .\\UploadFiles)\n {\n \n }\n Else\n {\n New-Item .\\UploadFiles -ItemType Directory\n }\n \n\n #Create Directory for Uploadfile and. Emails\n\n \n \n \n if(Test-Path ($dirLocation.ToString() + '\\UploadFiles\\' + $ExcelDoc.BaseName.ToString()) )\n {\n \n }\n Else\n {\n New-Item ($dirLocation.ToString() + '\\UploadFiles\\' + $ExcelDoc.BaseName.ToString()) -ItemType Directory\n } \n\n \n\n \n\n Copy-Item -Path ($dirLocation.ToString() + '\\CreatureUploadTemplate\\creatureuploadtemplate.xlsx') -Destination ($dirLocation.ToString() + '\\UploadFiles\\' + $ExcelDoc.BaseName.ToString() + '\\' + $ExcelDoc.BaseName.ToString() + '.xlsx')\n\n #$tmpTable to write to Creature Upload File\n #Open newly created Creature file\n\n $ExcelObject = New-Object -comobject Excel.Application\n $strPath = ($dirLocation.ToString() + '\\UploadFiles\\' + $ExcelDoc.BaseName.ToString() + '\\' + $ExcelDoc.BaseName.ToString() + '.xlsx')\n $ActiveWorkbook = $ExcelObject.Workbooks.Open($strPath)\n $ActiveWorksheet = $ActiveWorkbook.Worksheets.Item(1)\n \n \n #Input on creature 2.0 template starts on row 3\n $ExceliRow = 3\n\n \n\n \n\n ForEach($tmpRow in $tmpTable.Rows)\n {\n $ActiveWorksheet.Cells($ExceliRow,1) = $tmpRow['VendorName']\n $ActiveWorksheet.Cells($ExceliRow,3) = $tmpRow['VendorNum']\n $ActiveWorksheet.Cells($ExceliRow,4) = $tmpRow['VendorSiteCode']\n $ActiveWorksheet.Cells($ExceliRow,5) = $tmpRow['InvoiceNum']\n $ActiveWorksheet.Cells($ExceliRow,6) = $tmpRow['InvoiceDate']\n $ActiveWorksheet.Cells($ExceliRow,7) = $tmpRow['Description']\n $ActiveWorksheet.Cells($ExceliRow,8) = $tmpRow['InvoiceType']\n $ActiveWorksheet.Cells($ExceliRow,9) = $tmpRow['InvoiceAmount']\n $ActiveWorksheet.Cells($ExceliRow,10) = $tmpRow['CurrCode']\n $ActiveWorksheet.Cells($ExceliRow,11) = $tmpRow['Paygroup']\n $ActiveWorksheet.Cells($ExceliRow,12) = $tmpRow['TermsName']\n $ActiveWorksheet.Cells($ExceliRow,15) = $tmpRow['LineType']\n $ActiveWorksheet.Cells($ExceliRow,16) = $tmpRow['LineAmount']\n $ActiveWorksheet.Cells($ExceliRow,19) = $tmpRow['GLAccount']\n $ActiveWorksheet.Cells($ExceliRow,20) = $tmpRow['LineDesc']\n\n \n\n $ExceliRow ++\n\n }\n\n #File write complete, save and close the conneciton\n $ActiveWorkbook.Save()\n $ActiveWorkbook.Close()\n $ExcelObject.Quit()\n\n $tmpTable.Clear()\n\n \n Write-Host $ExcelDoc\n\n \n #Else\n #{\n #Write-Host $ExcelDoc \" (Error: Not 40 columns): Current Count = \" $DataReader.FieldCount\n $DataReader.Close()\n $objConn.Close()\n $ExcelObject.Quit()\n #}\n\n Move-Item ($dirLocation.ToString() + '\\' + $EmailDictionary[$ExcelDoc.Name]) ($dirLocation.ToString() + '\\UploadFiles\\' + $ExcelDoc.BaseName.ToString()) \n #Move-Item ($dirLocation.ToString() + '\\RE ' + $EmailDictionary[$ExcelDoc.Name].ToString()) ($dirLocation.ToString() + '\\UploadFiles\\' + $ExcelDoc.BaseName.ToString())\n Remove-Item ($dirLocation.ToString() + '\\' + $ExcelDoc.Name.ToString())\n\n }\n Catch [System.Exception]\n {\n Write-Host $ExcelDoc $_\n $tmpTable.Clear() #On error clear out temp table so that no records are imported.\n $ExcelObject.Quit()\n\n }\n\n \n\n Write-Host 'Ending work on - ' $ExcelDoc\n\n}\n\n \n\n<\/code><\/pre>","upvoteCount":0,"datePublished":"2021-12-07T21:54:43.000Z","url":"https://community.spiceworks.com/t/powershell-script-error/819031/10","author":{"@type":"Person","name":"spiceuser-bexok","url":"https://community.spiceworks.com/u/spiceuser-bexok"}},{"@type":"Answer","text":"This is where you call the OLEDB stuff<\/p>\n
$objConn = New-Object System.Data.OleDb.OleDbConnection($fullConnString)\n$sqlCommand = New-Object System.Data.OleDb.OleDbCommand($strQuery)\n\n<\/code><\/pre>\nMake sure you have the right version (32 bit vs 64 bit) of the redistributable installed and rebooted.<\/p>\n
if it still does not work, as said, use the ImportExcel module.<\/p>","upvoteCount":1,"datePublished":"2021-12-07T21:58:38.000Z","url":"https://community.spiceworks.com/t/powershell-script-error/819031/11","author":{"@type":"Person","name":"Neally","url":"https://community.spiceworks.com/u/Neally"}}]}}
Neally
(Neally)
December 7, 2021, 9:47pm
9
Please read this:
If you post code, please use the ‘Insert Code’ button. Please and thank you!
Hi, and welcome to the PowerShell forum!
Don’t apologize for being a “noob” or “newbie” or “n00b.” There’s just no need – nobody will think you’re stupid, and the forums are all about asking questions. Just ask!
Use a descriptive subject. Don't say "Need help" or "PowerShell Help", actually summarize what the problem is. It helps the rest of us keep track of which problem is which.
Don’t post massive scripts. We’re all volunteers and we don’t have time to read all that, nor will we copy, past…
1 Spice up