Wil*_*unn 75 formatting microsoft-excel
虽然我尽量避免它,但我偶尔不得不在 Excel 中打开一个 CSV 文件。当我这样做时,它会格式化包含数字的列,这使它们对我的目的毫无用处。据我所知,防止在导入时发生这种情况的唯一方法是重命名文件,使扩展名不是 .csv 并使用导入向导分别指定每列的格式。对于 50-60 列的文件,这是不切实际的。
由于互联网上这个经常被问到的问题的每个答案都暗示了在文件打开后将格式化数字转换回的某种方法(这对我不起作用 - 我想解决一般问题,而不是一些特定情况)或手动选择每列的格式类型(我不想这样做),我正在寻找一种设置全局首选项或样式的方法,以便打开的所有 CSV 文件的所有列始终格式化为文本。我也知道用引号“保护”数字,但我得到的文件不是那样的,我希望避免对文件进行预处理,这样 Excel 就不会把它们搞砸。
有没有办法专门做到这一点:始终将打开的 CSV 文件中的所有列格式化为文本,而无需在导入过程中每次手动选择每一列?
我使用的是 Excel 2003,但如果您知道的话,我会回答 2007 年的问题。
nix*_*xda 77
Excel ? 数据 ?获取外部数据 ? 选择所有列Shift并选择文本
好处:将所有值正确地视为文本,无一例外
缺点:比简单的双击更多的步骤
双击打开 CSV或 Excel 的打开方式对话框
缺点:Excel 的内部 CSV 处理程序将带有前导-
或=
符号的值误解为公式而不是文本
缺点:0001
由于 Excel 的自动检测列格式,您将丢失二进制值的前导零
好方法(对于 VBA)
使用 QueryTables(VBA 对应物Get external data
)?示例代码
好处:将所有值正确地视为文本,无一例外
缺点:代码比OpenText
方法多一点
糟糕的方式(对于 VBA)
使用Workbooks.OpenText
方法 ? 示例代码
缺点:此方法仍然使用 Excel 的内部 CSV 导入处理程序,但存在所有缺陷
缺点:此外,如果扩展名是 CSV fieldinfo
,OpenText
则忽略参数。通常,此参数可让您选择每种列格式,但如果扩展名是 CSV,则不能。您可以在Stack Overflow上阅读有关此行为的更多信息
如果您可以完全控制源文件,则将源扩展名暂时从 CSV 重命名为 TXT,然后再重命名为 CSV 是一种有效的解决方法
如果您有权访问创建 CSV 的源,则可以更改 CSV 语法。
用双引号将每个值括起来,并="00001"
在每个值前面加上一个等号,例如或在每个值前面加上一个制表符。两种方式都将强制 Excel 将值视为文本
请注意第 2 行(双引号方法)和第 3 行(制表符方法)如何不被 Excel 更改
在记事本中打开 CSV并将所有值复制并粘贴到 Excel。然后使用Data - Text to Columns
Downside:用于将列格式从常规更改为文本的列中的文本会产生不一致的结果。如果值包含-
由字符包围的a (例如“=E1-S1”),Excel 会尝试将该值拆分为多个列。位于该单元格右侧的值可能会被覆盖
(文本到列的行为在 Excel 2007 和 2013 之间的某处发生了更改,因此不再起作用)
这是一个 Excel 插件,用于简化 CSV 导入操作。
主要优点:它是一键式解决方案,使用QueryTables
与获取外部数据相同的防弹方法
%appdata%\Microsoft\AddIns
File tab ? Options ? Add-Ins ? Go To
并选择ImportCSV.xla
File tab ? Options ? Trust Center ? Trust Center Settings ? Macro Settings ? Enable all macros
您会注意到一个名为 Add-Ins 的新菜单栏条目,您可以使用此按钮快速打开 CSV 文件,而无需经历“导入”对话框的麻烦
您可以使用 PowerShell 脚本打开 CSV 文件并自动将它们传递到 Excel。该脚本默默地使用 Excel 的文本导入方法,该方法始终将值视为文本,并且作为奖励,处理 UTF-8 编码
$CSVs = @()
$args.ForEach({
If ((Test-Path $_) -and ($_ -Match "\.csv$|\.txt$")) {
$CSVs += ,$_
}
})
if (-Not $null -eq $CSVs) {
$excel = New-Object -ComObject excel.application
$excel.visible = $true
$excel.SheetsInNewWorkbook = $CSVs.Count
$workbook = $excel.Workbooks.Add()
for ($i=0; $i -lt $CSVs.Count; $i++){
$csv = Get-Item $CSVs[$i]
$worksheet = $workbook.worksheets.Item($i + 1)
$worksheet.Name = $csv.basename
$TxtConnector = ("TEXT;" + $csv.fullname)
$Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1"))
$query = $worksheet.QueryTables.item($Connector.name)
$query.TextFilePlatform = 65001
$query.TextFileTextQualifier = 1
$query.TextFileOtherDelimiter = $Excel.Application.International(5)
$query.TextFileParseType = 1
$arrFormats = ,2 * $worksheet.Cells.Columns.Count
$query.TextFileColumnDataTypes = $arrFormats
$query.AdjustColumnWidth = 1
$query.Refresh()
$query.Delete()
}
}
Run Code Online (Sandbox Code Playgroud)
C:\my\folder\myScript.ps1
. (注意扩展名.ps1
)
shell:sendto
» 打开您的 sendto 文件夹Enter"%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -NonInteractive -WindowStyle Hidden -File "C:\my\folder\myScript.ps1"
现在您可以选择(多个)CSV 并通过以下方式在 Excel 中打开它们 Right-click » SendTo » Excel
这有效:
Sub OpenCsvAsText(ByVal strFilepath As String)
Dim intFileNo As Integer
Dim iCol As Long
Dim nCol As Long
Dim strLine As String
Dim varColumnFormat As Variant
Dim varTemp As Variant
'// Read first line of file to figure out how many columns there are
intFileNo = FreeFile()
Open strFilepath For Input As #intFileNo
Line Input #intFileNo, strLine
Close #intFileNo
varTemp = Split(strLine, ",")
nCol = UBound(varTemp) + 1
'// Prepare description of column format
ReDim varColumnFormat(0 To nCol - 1)
For iCol = 1 To nCol
varColumnFormat(iCol - 1) = Array(iCol, xlTextFormat)
' What's this? See VBA help for OpenText method (FieldInfo argument).
Next iCol
'// Open the file using the specified column formats
Workbooks.OpenText _
Filename:=strFilepath, _
DataType:=xlDelimited, _
ConsecutiveDelimiter:=False, Comma:=True, _
FieldInfo:=varColumnFormat
End Sub
Run Code Online (Sandbox Code Playgroud)
用法:
OpenCsvAsText "C:\MyDir\MyFile.txt"
Run Code Online (Sandbox Code Playgroud)
逗号分隔的文件现在作为 Excel 工作表打开,所有列都设置为文本格式。
请注意,@Wetmelon 的向导解决方案工作得很好,但是如果您要打开许多文件,那么您可能会像我一样厌倦每次滚动到第 60 列以按住 Shift 键单击它。
编辑@GSerg 在下面的评论中指出这“不起作用”和“吃空格和前导零”。我将引用对该问题的评论,它更具描述性:
由于未知的原因,即使您明确为 VBA 中的所有列提供格式,如果文件扩展名是 CSV,Excel 也会忽略它。只要您更改扩展名,相同的代码就会产生正确的结果。
所以上面的代码“有效”,但被这种荒谬的 Excel 行为杀死了。无论您以哪种方式剪切它,您都不得不将扩展名更改为“.csv”以外的其他内容,抱歉!在那之后,你就可以自由回家了。
小智 5
您可以尝试先打开 .xlsx,然后创建数据连接并导入 .csv。选择“逗号”分隔,然后选择将所有列视为文本而不是“常规”的选项。
编辑:哦,我没有完全阅读这个问题。在导入向导中,选择要作为文本导入的第一个列标题,滚动到最后一个列标题,然后按 Shift+单击标题。然后选择“文本”径向选项。
归档时间: |
|
查看次数: |
187098 次 |
最近记录: |