Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PowerShell-将数据粘贴到Excel中_Excel_Powershell - Fatal编程技术网

PowerShell-将数据粘贴到Excel中

PowerShell-将数据粘贴到Excel中,excel,powershell,Excel,Powershell,今天我刚刚编写了这个PowerShell脚本 获取以制表符分隔的文本文件 读入记忆 根据特定列的不同值进行可变数量的筛选查询 创建新的空Excel工作簿 将筛选数据的每个子集添加到 新的Excel工作表 最后一步是我被卡住的地方。目前,我的代码以展开/转置的“key:value”条目的形式将几行数据放入工作表中的一个范围,从而形成水平数据布局。始终覆盖相同范围的数据 我希望数据以垂直布局的形式显示,即数据以列的形式显示,就像CSV文件是通过MS Excel的导入文件向导导入的一样

今天我刚刚编写了这个PowerShell脚本

  • 获取以制表符分隔的文本文件

  • 读入记忆

  • 根据特定列的不同值进行可变数量的筛选查询

  • 创建新的空Excel工作簿

  • 将筛选数据的每个子集添加到 新的Excel工作表

最后一步是我被卡住的地方。目前,我的代码以展开/转置的“key:value”条目的形式将几行数据放入工作表中的一个范围,从而形成水平数据布局。始终覆盖相同范围的数据

我希望数据以垂直布局的形式显示,即数据以列的形式显示,就像CSV文件是通过MS Excel的导入文件向导导入的一样

有没有比下面更简单的方法

我承认,一些PowerShell功能是以cargo cult编程模式粘贴在这里的。请注意,我没有任何PowerShell经验。几年前我做了一些批处理文件和编码。因此,其他批评也是受欢迎的

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)=$;