如何使用 Excel 插入所有文本。应用程序

如何使用 Excel 插入所有文本。应用程序

我有以下来自 powershell 逐行 foreach 的文本:

get-content C:\temp\data.txt | where-object {$_}

output:

usuario   nombre    dni  instalacion  sede
dni  JOSE 45 grupo: SI  MURCIA
dni  ANGEL 45 grupo: SI ALMERIA
dni MARIA 56 grupo: SI  BARCELONA
dni M. PILAR 65 grupo: SI  ALBOX
dni M. PAZ 75  grupo: SI MADRID
dni FLOREN  57 grupo: SI MADRID

我怎样才能将其插入到 Excel 中,以便经常使用 Excel.Application 对象插入它,而不必放置 powershell 的精确列和行,如下所示:

在此处输入图片描述

答案1

根据我的评论。这是处理此清理方法的一个例子。

我在用Powershell 变量压缩显示写入变量的内容并输出到屏幕,以便立即查看结果是否成功或失败。不需要包含该功能。

Clear-Host
@'
usuario   nombre    dni  instalacion  sede
dni  JOSE 45 grupo: SI  MURCIA
dni  ANGEL 45 grupo: SI ALMERIA
dni MARIA 56 grupo: SI  BARCELONA
dni M. PILAR 65 grupo: SI  ALBOX
dni M. PAZ 75  grupo: SI MADRID
dni FLOREN  57 grupo: SI MADRID
'@ | Out-File -FilePath 'D:\Temp\UserList.txt'

# Clean-up by planned property and replace with comma
Clear-Host
(
$ExcelReport = (Get-Content -Path 'D:\Temp\UserList.txt') -Replace '\s\s+|[ ]+(?=\d)', ',' -Replace 'dni\s', 'dni,' -replace '\sgrupo:', ',grupo:' -replace 'SI\s', 'SI,' | 
ConvertFrom-Csv | 
Format-Table -AutoSize
)
# Results
<#
usuario nombre   dni instalacion sede     
------- ------   --- ----------- ----     
dni     JOSE     45  grupo: SI   MURCIA   
dni     ANGEL    45  grupo: SI   ALMERIA  
dni     MARIA    56  grupo: SI   BARCELONA
dni     M. PILAR 65  grupo: SI   ALBOX    
dni     M. PAZ   75  grupo: SI   MADRID   
dni     FLOREN   57  grupo: SI   MADRID
#>

# More succinctly  - Clean-up by specific space removal and replace with a comma
Clear-Host
(
$ExcelReport = (Get-Content -Path 'D:\Temp\UserList.txt') -Replace '\s\s+|\s+(?=\d)|(?<=\d)+\s|(?<=[i])+\s|(?<=[SI])+\s', ',' | 
ConvertFrom-Csv | 
Format-Table -AutoSize
)
# Results
<#
usuario nombre   dni instalacion sede     
------- ------   --- ----------- ----     
dni     JOSE     45  grupo: SI   MURCIA   
dni     ANGEL    45  grupo: SI   ALMERIA  
dni     MARIA    56  grupo: SI   BARCELONA
dni     M. PILAR 65  grupo: SI   ALBOX    
dni     M. PAZ   75  grupo: SI   MADRID   
dni     FLOREN   57  grupo: SI   MADRID 
#>


# Convert to true CSV
$ExcelReport = (Get-Content -Path 'D:\Temp\UserList.txt') -Replace '\s\s+|\s+(?=\d)|(?<=\d)+\s|(?<=[i])+\s|(?<=[SI])+\s', ',' | 
Select-Object -Skip 1 | 
ConvertFrom-Csv -Delimiter ',' -Header usuario, nombre, dni, instalacion, sede 
# Results
<#
usuario     : dni
nombre      : JOSE
dni         : 45
instalacion : grupo: SI
sede        : MURCIA

usuario     : dni
nombre      : ANGEL
dni         : 45
instalacion : grupo: SI
sede        : ALMERIA

usuario     : dni
nombre      : MARIA
dni         : 56
instalacion : grupo: SI
sede        : BARCELONA

usuario     : dni
nombre      : M. PILAR
dni         : 65
instalacion : grupo: SI
sede        : ALBOX

usuario     : dni
nombre      : M. PAZ
dni         : 75
instalacion : grupo: SI
sede        : MADRID

usuario     : dni
nombre      : FLOREN
dni         : 57
instalacion : grupo: SI
sede        : MADRID
#>
 

<#
THus enableing member dot refreenceing of properties. for leverageing as needed
in any tool that can read/use CSV files.
#>

$ExcelReport.Count
# Results
<#
6
#>

$ExcelReport | 
Select-Object -Property usuario, nombre
# Results
<#
usuario nombre  
------- ------  
dni     JOSE    
dni     ANGEL   
dni     MARIA   
dni     M. PILAR
dni     M. PAZ  
dni     FLOREN 
#>

$ExcelReport.sede
# Results
<#
MURCIA
ALMERIA
BARCELONA
ALBOX
MADRID
MADRID
#>

更新:

根据我的评论 - 这就是您应该使用的。同样,您可以使用您选择的任何文件名。

# Make avaialbe for import into MSExcel
(Get-Content -Path 'D:\Temp\UserList.txt') -Replace '\s\s+|\s+(?=\d)|(?<=\d)+\s|(?<=[i])+\s|(?<=[SI])+\s', ',' | 
Out-File -FilePath 'D:\Temp\UserList.csv' -Force
Get-Content -Path 'D:\Temp\UserList.csv'
# Results
<#
usuario,nombre,dni,instalacion,sede
dni,JOSE,45,grupo: SI,MURCIA
dni,ANGEL,45,grupo: SI,ALMERIA
dni,MARIA,56,grupo: SI,BARCELONA
dni,M. PILAR,65,grupo: SI,ALBOX
dni,M. PAZ,75,grupo: SI,MADRID
dni,FLOREN,57,grupo: SI,MADRID
#>

Import-Csv -Path 'D:\Temp\UserList.csv' | 
Format-Table -AutoSize
# Results
<#
usuario nombre   dni instalacion sede     
------- ------   --- ----------- ----     
dni     JOSE     45  grupo: SI   MURCIA   
dni     ANGEL    45  grupo: SI   ALMERIA  
dni     MARIA    56  grupo: SI   BARCELONA
dni     M. PILAR 65  grupo: SI   ALBOX    
dni     M. PAZ   75  grupo: SI   MADRID   
dni     FLOREN   57  grupo: SI   MADRID 
#>

Start-Process -FilePath 'Excel' -ArgumentList 'D:\Temp\UserList.csv'

在此处输入图片描述

更新

通过 COM 调用 Excel,无需像上图所示创建单独的 CSV 文件或使用变量

Add-Type -AssemblyName  System.Drawing,
                        PresentationCore,
                        PresentationFramework,
                        System.Windows.Forms,
                        Microsoft.VisualBasic
[System.Windows.Forms.Application]::EnableVisualStyles()

(Get-Content -Path 'D:\Temp\UserList.txt') -Replace '\s\s+|\s+(?=\d)|(?<=\d)+\s|(?<=[i])+\s|(?<=[SI])+\s', ',' | 
Set-Clipboard

$MSExcel         = New-Object -ComObject excel.application 
$MSExcel.visible = $True

[Microsoft.VisualBasic.Interaction]::AppActivate((Get-Process -Name 'Excel').MainWindowTitle)

$NewWorksheet = $MSExcel.Workbooks.Add()
$Worksheet    = $NewWorksheet.Worksheets.item(1) 
$Worksheet.activate()
$Worksheet.Paste() 

然后使用功能区上 MSEcel 数据选项卡上的内置 MSExcel 文本到列功能。

在此处输入图片描述

您也可以添加其他代码来执行此操作

更新

根据我上次关于了解 MSExcel COM 及其用途的评论。你只需要这些行

$xlRange         = $Worksheet.usedrange
$xlColA          = $Worksheet.range("A1").EntireColumn
$xlColrange      = $Worksheet.range("A1")
$xlDelimited     = 1
$xlTextQualifier = -4142
$xlTextFormat    = 2

$xlColA.texttocolumns($xlRange,$xlDelimited,$xlTextQualifier,$true,$false,$true,$true,$false)

$Worksheet.columns.autofit()

在此处输入图片描述

***始终更新您自己的问题。请不要用您的进一步问题来更新提供的答案,因为这不利于人们正确理解。

更新答案意味着您正在尝试改进答案。

一旦超出了评论部分允许的范围,您需要更新您的问题或将对话移至您想要继续对话的人的“聊天部分”。***

根据您的列表评论进行更新

如果它来自列表,那么您可以执行此操作来清理该数据集,其余代码将是相同的。

('usuario   nombre    dni  instalacion  sede
dni  JOSE 45 grupo: SI  MURCIA
dni  ANGEL 45 grupo: SI ALMERIA
dni MARIA 56 grupo: SI  BARCELONA
dni M. PILAR 65 grupo: SI  ALBOX
dni M. PAZ 75  grupo: SI MADRID
dni FLOREN  57 grupo: SI MADRID' -replace '\s+(?=\d)|(?<=\d)+\s|(?<=[i])+\s|(?<=[SI])+\s', ','`
 -replace 'usuario   nombre    dni, instalacion  sede', 'usuario,nombre,dni,instalacion,sede').Trim() |
Set-Clipboard

相关内容