【问题标题】:Take Excel cell content and place it into a formatted .txt file获取 Excel 单元格内容并将其放入格式化的 .txt 文件中
【发布时间】:2016-07-02 10:40:56
【问题描述】:

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

为此,我们将使用这个: Dummy Data

我想要做的是从这些单元格中获取值并将它们放入 .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 解决方案持开放态度。

  • 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 来输出,但我怎样才能“收集”所有这些数据,然后让它在最后将“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 一样格式化/布局文本。 这可能吗?

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

我可能还需要做

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

再次感谢!

【问题讨论】:

  • 那么,您已经尝试了什么?您在哪里遇到问题,我们可以帮助您吗?
  • 嘿马丁,我承认我没有做太多,因为我不太确定从哪里开始。我希望有人能给我一些通用的东西,我可以尝试从那里开始。诚然,我的编码知识有限。我刚刚从 .txt 文件中取出所有数据,我或多或少是手动完成的。
  • 请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作的总结,以及您在解决问题时遇到的困难的描述。
  • 好的,您可以在 VBA 中执行此操作。尝试找到一些示例,说明如何通过一侧的单元格以及如何在 VBA 中输出到文本文件。
  • 还有 .xlx 还是 .xlxs 格式?因为它们在内部是非常不同的格式。

标签: vba excel powershell formatted


【解决方案1】:

根据需要使用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 值编写输出?您可以使用 Split(Char(), StringSplitOptions) form来自 .NET 框架的 String.Split Method 并将结果连接回单个字符串,如下所示(尽管可能有 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

【讨论】:

  • 谢谢!你能解释一下它是如何工作的吗?那么 {0} 和 {1} 正在确定列?您将如何在逗号后应用“空格”?
  • 如何在逗号后加一个“空格”? $("{0}, {1}" -f "Text1", $_."Name")@XViper 请阅读答案中的链接以获取详细说明和扩展示例。相关但离题:Write-Host Considered Harmful
  • 谢谢约瑟夫。我真的记得在我旅行的某个地方看到过那篇文章! (虽然我没有读完整篇)。
  • 如果单元格值为空,我将如何修改脚本以不输出行或逗号?因此,如果第 2 行的“name”为空,则不应写入“Text1: $name”。谢谢!
  • @XViper 抱歉,我无法测试您的 Import-XLS 函数;但是,如果 $Content.Gettype() 返回类似 System.Array 的内容,那么您可以通过键入例如查看所有列标题(甚至是空/空的)。 $Content[0]。 (假设$Content[0].GetType() 返回类似PSCustomObjectSystem.Object)。
【解决方案2】:

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

通过大量的试验和错误以及对 $() 的一些花哨的使用

我想出了这个。

$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

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

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

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

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-03
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2014-01-10
    • 2022-12-07
    相关资源
    最近更新 更多