我有一个脚本,可以从xls转换为csv。它非常简单,只需用Excel对象打开xls并将其保存为csv:
cls Remove-Item *.csv $stringBuilder = New-Object System.Text.StringBuilder $objExcel = New-Object -ComObject Excel.Application $objExcel.Visible = $false $Tab = [char]9 $Pestana = 2
# Lee todos los excel de esta carpet $ListadoExcel = Get-ChildItem -filter "*.xlsx" foreach ($Linea in $ListadoExcel) {
$Archivo = $Linea.FullName
$ArchivoCorto = $Archivo.Replace('.xlsx','')
"Procesando: "+$Archivo
$WorkBook = $objExcel.Workbooks.Open($Archivo,$null,$True) #Solo lectura
#Leemos la tercera pestaña
$WorkSheet = $WorkBook.sheets.item($Pestana)
$WorkSheet.SaveAs($ArchivoCorto+".csv", 23)
#"Filas leidas: "+$Filas
#$range = $WorkSheet.UsedRange
#$WorkSheet.Range('B5').Text
#$stream.WriteLine($WorkSheet.UsedRange.Cells.Item.Text)
$WorkBook.Close($False) #Sin guardar }
$objExcel.Quit()
奇怪的是,当我希望用,
分隔时,结果csv与;
分隔。
如果我(Get-Culture).TextInfo.ListSeparator
,我会;
。
我在控制面板的区域和语言设置中也有相同的分隔符。
如果我使用相同的Excel并手动保存,则生成的csv将以“;”分隔。
答案 0 :(得分:4)
您需要为$True
Local
SaveAs
参数传递[Type]::Missing
才能尊重控制面板设置。
true根据Excel语言保存文件(包括控制面板设置)。 false(默认值)根据Visual Basic for Applications(VBA)的语言保存文件。
https://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.saveas.aspx
为了跳过此方法的可选参数,您可以使用此answer中所述的<xsl:for-each-group select="EVENTS/ROW" group-by="EVENT_ID">
<xsl:variable name="B" select="current-group()[EVENT_TYPE='B']/PRICE/ROW/@EVENT_PRICE"/>
<xsl:variable name="P" select="current-group()[EVENT_TYPE='P']/PRICE/ROW/@EVENT_PRICE"/>
<xsl:variable name="diff" select="translate($B, ',', '.') - translate($P, ',', '.')" />
<EVENT_ID>
<xsl:value-of select="current-grouping-key()" />
</EVENT_ID>
<DIFF>
<xsl:value-of select="format-number($diff, '0.00')" />
</DIFF>
</xsl:for-each-group>
。
答案 1 :(得分:0)
尝试:
$WorkSheet.SaveAs($ArchivoCorto+".csv", 6)
修改 - 解释
23 is the xlCSVWindows
enumeration。这听起来像是在xlCSV
之后。
答案 2 :(得分:0)
由于您无法在Excel中更改分隔符(您必须在“控制面板”的“区域和语言”设置中在系统范围内更改分隔符),系统列表分隔符无关紧要;您需要解决该限制 Excel的限制,以获取特定文件的不同分隔符。将文件保存为&#34; CSV&#34;使用上面的代码,您需要执行以下操作:
AVPlayer