PowerShell-将数据粘贴到Excel中
今天我刚刚编写了这个PowerShell脚本PowerShell-将数据粘贴到Excel中,excel,powershell,Excel,Powershell,今天我刚刚编写了这个PowerShell脚本 获取以制表符分隔的文本文件 读入记忆 根据特定列的不同值进行可变数量的筛选查询 创建新的空Excel工作簿 将筛选数据的每个子集添加到 新的Excel工作表 最后一步是我被卡住的地方。目前,我的代码以展开/转置的“key:value”条目的形式将几行数据放入工作表中的一个范围,从而形成水平数据布局。始终覆盖相同范围的数据 我希望数据以垂直布局的形式显示,即数据以列的形式显示,就像CSV文件是通过MS Excel的导入文件向导导入的一样
- 获取以制表符分隔的文本文件
- 读入记忆
- 根据特定列的不同值进行可变数量的筛选查询
- 创建新的空Excel工作簿
- 将筛选数据的每个子集添加到 新的Excel工作表
PARAM(
[参数(ValueFromPipeline=$true)]
$infle=“.\04-2011\110404-13.txt”
)
过程{
回声“$infle”
写入主机“Num Args:$Args.Length;
$xl=新对象-comobject Excel.Application;
$xl.Visible=$true;
$Workbook=$xl.Workbooks.Add();
$content=Import Csv-分隔符“`t”$infle;
$ports=$content |选择对象端口#|排序对象端口#-唯一-降序;
$ports | ForEach对象{
$p=$\;
写入主机$p.{Port#};
$Worksheet=$Workbook.Worksheets.Add();
$workSheet.Name=[string]::格式(“{0}{1}”、“端口号”、$p.{Port#});
$filtered=$content | Where Object{$.{Port#}-eq$p.{Port#};
$filtered | ForEach对象{
写入主机${ObsDateTime},${Port}
}
$filtered | clip.exe;
$range=$Workbook.ActiveSheet.range(“a2”,“a$($filtered.count)”);
$Workbook.ActiveSheet.Paste($range,$false);
}
$xl.Quit()
}
数据输出示例
错
端口#:1
Obs#:1
实验通量:0,99
IV Cdry:406.96
IV Tcham:16.19
IV压力:100.7
IV H2O:9.748
IV V3:11.395
IV V4:0.759
IV相对湿度:53.12
赖特
Port#Obs#Exp#u流量IV Cdry IV Tcham IV压力IV H2O IV V3 IV V4 IV RH
1 1 0,99 406.96 16.19 100.7 9.748 11.395 0.759 53.12
试试看,它看起来很漂亮。从来没有机会使用它,但(实际上)知道它的工作人员,我相信你会非常乐意使用它。如果您愿意,请在此提供反馈,我们将不胜感激
导出Xls中无序属性的可能解决方法 可以更改函数
Add-Array2Clipboard
,使其接受一个新的输入参数:一个数组,提供按需排序的属性名称
然后,您可以更改使用get member
的部分。愚蠢的例子:
"z", "a", "c" | %{ get-member -name $_ -inputobject $thecurrentobject }
“z”、“a”、“c”|%{get member-name$|-inputobject$thecurrentobject}
这只是一个关于如何从
get member
实现有序属性的示例。我使用了$Workbook.ActiveSheet.Cells.Item($row,$col).Value2函数,以便在导出到Excel时更精确地确定数据的放置位置
差不多
$row = 1
Get-Content $file | Foreach-Object {
$cols = $_.split("`t")
for ($i = 0; $i < $cols.count; $i++)
{
$Workbook.ActiveSheet.Cells.Item($row, $i+1).Value2 = $cols[$i]
}
$row++
}
$row=1
获取内容$file | Foreach对象{
$cols=$\分割('t”)
对于($i=0;$i<$cols.count;$i++)
{
$Workbook.ActiveSheet.Cells.Item($row,$i+1)。Value2=$cols[$i]
}
美元行++
}
警告:干编码!您可能还需要一些try..catch
。我使用了一个修改过的函数,与用户empo建议的有点不同。
这是我的决定
Export-Xls $filtered -Path $outfile -WorksheetName "$wn" -SheetPosition "end" | Out-Null # -SheetPosition "end";
但是,当前版本的Export Xls对csv文本文件的内存中表示的列进行了重新排序。我希望文本文件的数据列按其原始顺序排列,因此我必须对原始代码进行如下修改和简化:
function Add-Array2Clipboard {
param (
[PSObject[]]$ConvertObject,
[switch]$Header
)
process{
$array = @();
$line =""
if ($Header) {
$line = @()
$row = $ConvertObject | Select -First 1
$row.psobject.properties | Foreach {$line += "$($_.Name)" }
$array += [String]::Join("`t", $line)
}
else {
foreach($row in $ConvertObject){
$line =""
$vals = @()
$row.psobject.properties | Foreach {$vals += $_.Value}
$array += [String]::Join("`t", $vals)
}
}
$array | clip.exe;
}
}
谢谢,我将首先从Export Xls中取出选定的内容以改进我的代码。关键部分似乎在第138行及以下。您真的需要为端口创建一个表吗?否则,您可以直接在选择对象
数据上使用导出Xls
。我的意思是,您将能够直接在excel上通过端口执行数据筛选。起初不想这样做,因为预期powershell会混淆代码签名和安全功能。不过,我还是按照你的建议直接使用了它。成功!缩短了我的代码。速度稍微慢一点。Export XLS在每次迭代后错误地关闭新创建的文件,在“文档恢复”对话框中创建n个条目。不过,这没什么大不了的。还有一个小麻烦是Export XLS会对列进行重新排序,将日期时间值放在excel文件最右边的列上。时间序列数据不可行。你确定吗?它应该遵循您的选择对象的顺序。谢谢,我将按照提示进行操作。显然,from:如何更改活动单元格的值$a、 ActiveCell.Value2=“x”;如何更改指定单元格的值$a、 ActiveSheet.Range(“B1”).Value2=“y”$ws.Cells.Item($row,1)=$;