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

时间:2016-07-02 10:40:57

标签: excel vba excel-vba powershell formatted

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

出于此目的,我们将使用此: Dummy Data

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

E.g。

***********
**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

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

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

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

我认为VBA可能是最受欢迎的选项,尽管我也对潜在的PowerShell解决方案持开放态度。

  • XViper

好的,所以我已经查看了一些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输出,但我怎样才能收集&#39;所有这些数据,然后输出&#39; ForEach&#39;到最后的.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一样。 这可能吗?

&#34;价值1&#34;需要与&#34; Text1&#34;

在同一行

我可能还需要做

&#34; Text1:$ Value1,$ Value2,$ Value3&#34;在某些方面。

再次感谢!

2 个答案:

答案 0 :(得分:0)

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

通过一系列的试错和一些花哨的使用$()&lt; - 有人能解释一下吗?

我想出了这个。

$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

如果有更优雅或更好的方法来实现这一点,请告诉我。我想我已经设法完成了我对这个特殊情况的需求。

我希望以后可以帮助别人! :)

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

感谢。

答案 1 :(得分: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 methodComposite Formatting

示例:

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

示例输出:

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

编辑以回答延伸问题:那么,我将如何编写代码以排除编写Null值的输出?您可以使用{{3来自.NET框架的Split(Char(), StringSplitOptions) form并将结果连接回一个字符串,如下所示(尽管可能有 smarter 直接方法):

$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