【问题标题】:Stop Numeric converting to text in Excel when using powershell使用 powershell 时停止在 Excel 中将数字转换为文本
【发布时间】:2017-10-11 14:09:50
【问题描述】:

我正在使用 powershell 将数据从 CSV 复制到 Excel 工作表(在现有电子表格中)。我在另一个工作表中有一个数据透视表,它引用了我从 CSV 复制的数据。唯一的问题是,CSV 文件中的数值正在转换为 Excel 中的文本,这会导致数据透视表中的计算字段变得混乱。

电子表格中的字段被定义为数字(我已经确定了)

CSV 文件中的值是从 SQL 查询中导出的,并用引号括起来。我在将引号加载到 Excel 工作表之前删除了引号,这没有任何区别。一开始是一次性任务,结果却被多次使用,我想自动执行此操作。

这里的任何建议都会很有帮助

这里的流程是

  1. Powershell 脚本启动一个 SQL 脚本并将输出复制到一个 CSV 文件,该文件包含 4 列和数字数据
  2. CSV 文件中的数据被复制到现有电子表格中的一个工作表中,其中包含 2 个工作表
  3. 第二个工作表包含一个数据透视表,它引用了第一个工作表中的数据。

【问题讨论】:

  • 由于我对您的某些流程不熟悉,我不确定,但 Excel 中的引号括起来的数据被解释为文本
  • 一个建议:不要将数据透视表基于原始数据。而是基于解析输入的计算列。
  • 如何将数据导入excel?我曾经制作了一个利用 excel 创建 xlsx 文件的 powershell 脚本。我刚刚为单元格设置了numberformat

标签: excel windows powershell csv automation


【解决方案1】:

这不是 Powershell 的问题,而是 Excel 导入 CSV 的方式。

您是否考虑过使用宏将数据导入(和格式化)到 Excel 工作表中,而不是使用 CSV?也许让 Powershell 代码将数据写入特定格式(甚至是 CSV)文件,然后让 Excel 工作表中的宏读取该文件,并在将数据放入每个单元格时将单元格从文本转换为数字。

另一个更好的选择是让 Powershell 实际上直接将数据导出到 excel 电子表格中,绕过整个 CSV 步骤;让 Powershell 将实际单元格设置为正确的类型(数字),因为它使用 COM 对象导出数据。 Excel 必须安装在您运行脚本的计算机上才能正常工作。

一个代码片段让你开始可能看起来像:

$xl=New-Object -ComObject Excel.Application
$wb=$xl.WorkBooks.Open('C:\Temp\MyData.xls')
$ws=$wb.WorkSheets.item(1)
$xl.Visible=$false # Don't make excel pop up before the person running the script.

$ws.Cells.Item(1,1)=1

$wb.SaveAs('c:\temp\MyData.xls')
$xl.Quit()
Remove-Variable xl

浏览这段代码:

  1. 创建连接对象
  2. 打开实际工作簿
  3. 在工作簿中指定您需要的工作表
  4. 确保它可见(个人选择)
  5. 设置相关单元格的值,在本例中为第 1 行第 1 列
  6. 保存回来
  7. 关闭与工作簿的连接(关闭 ComObject)

如果你想要更花哨: [int32]$a = 255

$xl=New-Object -ComObject Excel.Application
$wb=$xl.WorkBooks.Open('C:\Temp\Servers.xls')
$ws=$wb.WorkSheets.item(1)
$xl.Visible=$false  # don't show excel poped up to the user.

# set the cell to be the value we desire
$ws.Cells.Item(2,3)=$a

# is it a string?
if ($a -is [string])  
{
  # it's a string
  $ws.Cells.Item(2,3).NumberFormat = "@"
} else {
  # yes, numeric..-- set to a number
  $ws.Cells.Item(2,3).numberformat = "0" # or could be "0.00", etc..
}

# save and close the sheet..
$wb.SaveAs('c:\temp\Servers1.xls')
$xl.Quit()

如果这回答了您的问题,请标记“已回答”。

【讨论】:

    【解决方案2】:

    您应该从 TextFileColumnDataTypes 属性设置列数据类型。 像这样使用整数数组。

    $formatsArray = @(1,2,1,2,2,2,2,2)
    $query.TextFileColumnDataTypes = $formatsArray 
    

    Information about values which use in array

    如果您想将所有数据类型范围设置为通用,这里是示例

    $excel = New-Object -ComObject excel.application 
    $workbook = $excel.Workbooks.Add(1)
    $worksheet = $workbook.worksheets.Item(1)
    $TxtConnector = ("TEXT;" + "./myCSV")
    $Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1"))
    $query = $worksheet.QueryTables.item($Connector.name)
    ### set all columns type general(1)
    $query.TextFileColumnDataTypes = ,1 * $worksheet.Cells.Columns.Count 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      相关资源
      最近更新 更多