-1

所以我有一个 Excel 文档,它本质上是一个表格。

为此,我们将使用: 虚拟数据

我想要做的是从这些单元格中获取值并将它们放入 .txt 文件中。但是,文本文件具有一些必需的格式,并且遵循电子表格的每个“条目”(行)的模式。

例如

***********
**THIS IS A FANCY TEXT FILE**
***********
<Start of entry text>
Predefined text here (Entry 1): $A1
Predefined text here:           $B1,$C1
Predefined text here:           $D1,$E1,$F1
Predefined text here: $G1,$H1
Predefined text here: $I1
Predefined text here: $J1,$K1,$L1
Predefined text here: $M1,$N1
<End of entry text>

<Start of entry text>
"As Above"
<End of entry text>
etc, etc

此外,如果可能,将所有值排列在一起将是有益的。IE。就像前三行一样,而不是最后四行。

我希望能够运行一个脚本,然后输出一个带有一些预定义数据的 .txt 文件,然后是表中每个条目的单元格的相关值。我假设我需要某种“For Each”循环,并且我必须定义许多变量,我只是天生不是真正的编码员,只有在绝对必要时才涉足。

非常感谢您提供的任何帮助。

我假设 VBA 可能是最受欢迎的选择,尽管我也对潜在的 powershell 解决方案持开放态度。

  • 蝰蛇

好的,所以我研究了一些 powershell 选项,并认为我想采用这种方法。

我已经设法使用 Import-XLS 函数让它工作。但是我不确定如何将输出输出到 .txt 文件。

Import-XLS '.\DummyData.xlsx' | Foreach-Object{
Write-host "Predefined data:" `t $_."Value 1"
Write-host "Predata:" `t`t`t $_."Value 2"

这给了我这个。

Predefined data:     AA
Predata:             11
Predefined data:     BB
Predata:             BB11
Predefined data:     CC
Predata:             CC11
Predefined data:     DD
Predata:             DD11
Predefined data:     EE
Predata:             EE11
Predefined data:     FF
Predata:             FF11
Predefined data:     GG
Predata:             GG11
Predefined data:     HH
Predata:             HH11

我知道我不能使用 Write-Host 来输出,但我怎样才能“收集”所有这些数据,然后让它在最后将“ForEach”输出到 .txt?

我可以全部输出吗?还是我需要一次输出每一行?

谢谢!


好的...所以我尝试了更多的东西。

$OutFile = ".\OutTest$(get-date -Format dd-MM).txt"

$Content = Import-XLS '.\DummyData.xlsx'

$Content | foreach-object{
Write-Output "Text1" $_."Value 1"
Write-Output "Text2" $_."Value 2"

} | Out-File $OutFile

所以这似乎可行,但问题是,现在一切都在新线上。

所以我明白了:

Text1
AA
Text2
11
Text1
BB
Text2
BB11

我需要能够像使用 Write-Host 一样格式化/布局文本。这可能吗?

“值 1”需要与“Text1”在同一行

我可能还需要做

“Text1: $Value1, $Value2, $Value3”在某些行上。

再次感谢!

4

2 回答 2

0

好的,所以我想我已经解决了。(虽然我不完全确定它是如何工作的)。

通过一堆试验和错误以及对 $() <-- 有人可以向我解释一下吗?

我想出了这个。

$OutFile = ".\OutTest$(get-date -Format dd-MM).txt"

$Content = Import-XLS '.\DummyData.xlsx'

$Content | foreach-object{
Write-Output "Text1: `t $(($_).Value1)"
Write-Output "Text2: `t $(($_).Value2), $(($_)."Value 3")"  #I tried putting this all inside one $(), but that made the comma not appear. Why??

} | Out-File $OutFile

产生这个:

Text1:   AA
Text2:   11, 22
Text1:   BB
Text2:   BB11, BB22
Text1:   CC
Text2:   CC11, CC22
Text1:   DD
Text2:   DD11, DD22

如果有更优雅或更好的方法来实现这一点,请告诉我。我想我已经成功地完成了我在这个特殊案例中需要的东西。

我希望这对以后的人有所帮助!:)

我仍然很感激任何专家的反馈。

谢谢。

于 2016-07-03T08:19:02.330 回答
0

使用Windows PowerShell -f Format operator根据需要格式化您的行,请参阅about_Operators帮助主题,例如Get-Help 'about_Operators' -ShowWindow

-f Format operator
      Formats strings by using the format method of string 
      objects. Enter the format string on the left side of the operator 
      and the objects to be formatted on the right side of the operator.


         C:\PS> "{0} {1,-10} {2:N}" -f 1,"hello",[math]::pi
         1 hello      3.14

有关详细信息,请参阅String.Format方法复合格式

例子:

Get-ChildItem | ForEach-Object { Write-Output $("{0},{1}" -f "Text1", $_."Name") }
###                                                       ↑

样本输出:

Text1,Downloaded
Text1,SF
Text1,SO
Text1,SU
Text1,addF7.ps1

编辑以回答扩展问题:那么,我将如何编写代码以排除为 Null 值编写输出?您可以使用.NET 框架中的MethodSplit(Char(), StringSplitOptions)形式并将结果连接回单个字符串,如下所示(尽管可能有更智能的直接方法):String.Split

$strng = "{0}:{1},{2},{3},{4},{5}" -f "Item x", 1, $null, 3, $null, $null
$strng
$strng.Split(",",[System.StringSplitOptions]::RemoveEmptyEntries) -join ","

输出

Item x:1,,3,,
Item x:1,3
于 2016-07-03T08:38:10.423 回答