获取 Excel 个单元格内容并将其放入格式化的 .txt 文件中

Take Excel cell content and place it into a formatted .txt file

所以我有一个 Excel 文档,它本质上是一个 table.

为此,我们将使用: Dummy Data

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

例如

***********
**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。 就像前三行,而不是最后 4 行。

我希望能够 运行 一个脚本,然后输出一个包含一些预定义数据的 .txt 文件,然后是 [=76= 中每个条目的单元格的相关值].我假设我需要某种 '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 来输出,但是我怎样才能 'collect' 所有这些数据,然后让它在最后输出 '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 一样 format/layout 文本。 这可能吗?

"Value 1" 需要与 "Text1"

在同一行

我可能还需要做

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

再次感谢!

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

通过一系列的试验和错误以及对 $() 的一些花哨的使用 <-- 有人可以给我解释一下吗?

我想到了这个。

$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

如果有更优雅或更好的方法来完成此操作,请告诉我。我想我已经设法完成了这个特定案例所需的内容。

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

我仍然非常感谢专家的反馈。

谢谢。

使用 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

For more information, see the String.Format method and Composite Formatting.

示例:

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

示例输出:

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

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

$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