我有一個相當簡單的請求(對我來說這是一項非常艱鉅的任務tbh)。Powershell在Excel單元格中使用多行文字工作
我有兩個CSV文件,我想要轉換爲Excel,因此這兩個CSV文件中的每一個將佔用一張紙。 到目前爲止,我已經成功了,但我想要糾正這個小問題。
之一的CSV細胞包含多個文本行,像這樣:
這是第1項
這是進入2
我想有這兩個條目需要進口到Excel單元格中以同樣的方式是在CSV,但是當我檢查我的Excel文件,第二個項目被導入到下一行:
行1個小區1 - 這是進入1
第2行第1行 - 這是條目2
我不知道我是否應該使用.NET類worksheet.UsedRange.EntireRow或worksheet.UsedRange.EntireColumn或其他。 我正在檢查MSDN,但由於我仍是一個noob,我找不到任何東西。
這是我的代碼示例:
Function Merge-CSVFiles
{
Param(
$CSVPath = ".\Reports",
$XLOutput=".\final_final_report.xlsx"
)
$csvFiles = Get-ChildItem ("$CSVPath\*") -Include *.csv
$Excel = New-Object -ComObject excel.application
$Excel.visible = $false
$Excel.sheetsInNewWorkbook = $csvFiles.Count
$workbooks = $excel.Workbooks.Add()
$CSVSheet = 1
Foreach ($CSV in $Csvfiles)
{
$worksheets = $workbooks.worksheets
$CSVFullPath = $CSV.FullName
$SheetName = ($CSV.name -split "\.")[0]
$worksheet = $worksheets.Item($CSVSheet)
$worksheet.Name = $SheetName
$TxtConnector = ("TEXT;" + $CSVFullPath)
$CellRef = $worksheet.Range("A1")
$Connector = $worksheet.QueryTables.add($TxtConnector,$CellRef)
$worksheet.QueryTables.item($Connector.name).TextFileCommaDelimiter = $True
$worksheet.QueryTables.item($Connector.name).TextFileParseType = 1
$worksheet.QueryTables.item($Connector.name).Refresh()
$worksheet.QueryTables.item($Connector.name).delete()
$worksheet.UsedRange.EntireColumn.AutoFit()
$CSVSheet++
}
$workbooks.SaveAs($XLOutput,51)
$workbooks.Saved = $true
$workbooks.Close()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbooks) | Out-Null
$excel.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
}
嗯,好像直接在Excel中打開CSV時,你可以用引號括整個進入和Excel將識別新行作爲同一項目的一部分像(http://stackoverflow.com/questions/566052/can -you編碼-CR-LF-在 - 進入 - CSV文件)。因此,您可以預處理CSV並將條目換成引號。但即使如此,使用QueryTables的方法也無法正確識別。 Excel自己的數據導入工具 - 我唯一可以實現的方法是將.csv作爲Excel中的新工作簿打開。 – Mikegrann
我可以想出的最佳解決方案:對所有數據進行預處理(例如用「,」替換),然後用'Workbooks.Open'單獨打開所有.csv文件。全部打開後,通過從所有工作簿複製到主工作簿來合併數據。 – Mikegrann
否則使用特殊代碼預處理數據以替換換行符的實例,以便excel將整個事件視爲一個條目,然後在導入後可以後處理將此代碼替換回換行符。 – Mikegrann