¿Cómo puedo configurar Excel para que siempre importe todas las columnas de archivos CSV como texto?


68

Aunque trato de evitarlo, ocasionalmente tengo que abrir un archivo CSV en Excel. Cuando lo hago, formatea columnas que contienen números, lo que las hace inútiles para mis propósitos. Por lo que puedo decir, la única forma de evitar que esto suceda en la importación es cambiar el nombre del archivo para que la extensión no sea .csv y usar el asistente de importación para especificar el formato de cada columna individualmente. Para archivos con 50-60 columnas, esto no es práctico.

Dado que cada respuesta a esta pregunta frecuente en Internet sugiere algunos medios para convertir los números formateados nuevamente una vez que el archivo está abierto (lo que no funcionará para mí, quiero resolver el problema general, no algunos casos específicos) o seleccionando manualmente el tipo de formato de cada columna (que no quiero hacer), estoy buscando una manera de establecer una preferencia o estilo global de modo que todas las columnas de todos los archivos CSV abiertos siempre tengan formato de texto. También sé "blindar" los números con comillas, pero los archivos que recibo no son así y esperaba evitar tener que procesar previamente los archivos para que Excel no los arruine.

¿Hay alguna manera de hacer esto específicamente : formatear siempre todas las columnas en archivos CSV abiertos como texto, sin seleccionar manualmente cada columna cada vez durante la importación?

Estoy usando Excel 2003, pero tomaré respuestas para 2007 si eso es lo que sabes.


1
Hola, Scripting Guy hizo un artículo de blog sobre Importar CSV a Excel que podría tener algunos datos útiles para usted. Jugar con el objeto de datos dentro de powershell puede permitirle hacer lo que quiera. No se publica como respuesta, ya que esencialmente es solo un enlace externo, pero podría tener algo de utilidad para usted.
Matrix Mole

Respuestas:


7

Esto funciona:

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

Uso:

OpenCsvAsText "C:\MyDir\MyFile.txt"

El archivo separado por comas ahora está abierto como hoja de Excel con todas las columnas formateadas como texto.

Tenga en cuenta que la solución del asistente de @ Wetmelon funciona bien, pero si está abriendo muchos archivos, puede, como yo, cansarse, cada vez, de desplazarse a la columna 60 para presionar Mayús y hacer clic.

EDITAR @GSerg dice en el comentario a continuación que esto "no funciona" y "come espacios y ceros a la izquierda". Solo citaré el comentario a la pregunta, que es más descriptiva:

Por razones desconocidas, incluso si proporciona explícitamente formatos para todas las columnas en VBA, Excel lo ignorará si la extensión del archivo es CSV. Tan pronto como cambie la extensión, ese mismo código producirá los resultados correctos.

Entonces, el código anterior "funciona", pero este ridículo comportamiento de Excel lo mata. De cualquier forma que lo corte, tendrá que cambiar la extensión a otra que no sea ".csv", ¡lo siento! Después de eso, estás en casa libre.


1
No funciona Come espacios, come ceros a la izquierda, etc.
GSerg


1
El método utilizado Workbooks.OpenTexttiene sus defectos por diseño (ver mi respuesta a continuación). Usar en su QueryTableslugar.
nixda

71

Cómo abrir CSV en Excel

Buen camino

  • Excel → Datos → Obtener datos externos → Seleccione todas las columnas con Shifty elija Texto

    Upside: trata todos los valores correctamente como texto sin ninguna excepción

    Desventaja: más pasos que un simple doble clic

Mal camino

  • Abra un CSV con doble clic o Abrir con cuadro de diálogo de Excel

    Desventaja: el controlador CSV interno de Excel malinterpreta los valores con un inicio -o un =signo como fórmula en lugar de texto

    Desventaja: perderá ceros a la izquierda de valores binarios como 0001debido al formato de columna autodetectado de Excel

Buena manera (para VBA)

  • Use QueryTables (la contraparte de VBA Get external data) → Código de ejemplo

    Upside: trata todos los valores correctamente como texto sin ninguna excepción

    Desventaja: un poco más de código que OpenTextmétodo

Mala manera (para VBA)

  • Workbooks.OpenTextMétodo de uso → Código de ejemplo

    Desventaja: este método todavía utiliza el controlador de importación CSV interno de Excel con todos sus defectos

    Desventaja: Además, el fieldinfoparámetro de OpenTextse ignora si la extensión es CSV. Normalmente, este parámetro le permite elegir cada formato de columna, pero no si la extensión es CSV. Puede leer más sobre este comportamiento en Stack Overflow

    Cambiar temporalmente el nombre de la extensión de origen de CSV a TXT y luego volver a CSV es una solución válida si tiene control total sobre el archivo de origen

Métodos adicionales

  • Si tiene acceso a la fuente que crea su CSV, puede modificar la sintaxis de CSV.
    Encierre cada valor con comillas dobles y coloque como prefijo un signo igual como ="00001"o anteponga una pestaña a cada valor. Ambas formas obligarán a Excel a tratar el valor como texto

    Contenido original de CSV
    ingrese la descripción de la imagen aquí

    CSV en Excel cuando se abre haciendo doble clic
    ingrese la descripción de la imagen aquí

    Tenga en cuenta que Excel no cambia la línea 2 (método de comillas dobles) y la línea 3 (método de tabulación)

  • Abra CSV en el Bloc de notas y copie y pegue todos los valores en Excel. Luego use Datos - Texto a columnas
    Desventaja: el texto en columnas para cambiar los formatos de columna de la parte general al texto produce resultados inconsistentes. Si un valor contiene un carácter -rodeado de caracteres (por ejemplo, "= E1-S1"), Excel intenta dividir ese valor en más de una columna. Los valores ubicados directamente en esa celda pueden sobrescribirse

    (el comportamiento de Texto a columnas se modificó en algún lugar entre Excel 2007 y 2013, por lo que ya no funciona)


Complemento de Excel para abrir CSV e importar todos los valores como texto

Este es un complemento de Excel para simplificar las acciones de importación CSV.
La principal ventaja: es una solución de un clic y utiliza QueryTables, el mismo método a prueba de balas detrás de Obtener datos externos

  • Agrega un nuevo comando de menú a Excel que le permite importar archivos CSV y TXT. Todos los valores se importan a la hoja activa a partir de la celda seleccionada actualmente
  • El complemento de Excel está disponible para todas las versiones de Office en Windows y Mac
  • Todo el complemento tiene solo 35 líneas de código. Verifique el código fuente comentado si tiene curiosidad
  • El separador de lista CSV utilizado (coma o punto y coma) se toma de la configuración local de Excel
  • La codificación se establece en UTF-8

Instalación

  1. Descargue el complemento y guárdelo en su carpeta de complementos:%appdata%\Microsoft\AddIns
  2. Abra Excel y active el complemento: File tab → Options → Add-Ins → Go Toy seleccioneImportCSV.xla
  3. Habilitar macros de VBA: File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Reiniciar Excel

Notará una nueva entrada en la barra de menú llamada Complementos y utilizará este botón para abrir rápidamente sus archivos CSV sin pasar por la molestia del cuadro de diálogo Importar.

ingrese la descripción de la imagen aquí


Script de PowerShell para abrir CSV directamente desde el Explorador de Windows

Puede usar un script de PowerShell para abrir archivos CSV y pasarlos automáticamente a Excel. El script utiliza silenciosamente el método de importación de texto de Excel que trata los valores siempre como texto y, como beneficio adicional, maneja la codificación UTF-8

  1. Cree un nuevo archivo de texto y pegue el siguiente script. Una versión comentada se puede encontrar aquí
$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()
    }
}
  1. Guárdelo en algún lugar como C:\my\folder\myScript.ps1. (Tenga en cuenta la extensión .ps1)
    • Abra su carpeta sendto a través de WinR» shell:sendto» Enter
  2. Cree un nuevo acceso directo haciendo clic derecho »Nuevo» Acceso directo y pegue esta línea. No olvides cambiar la ruta a la tuya donde has puesto tu guión. Asigne un nombre al acceso directo, por ejemplo, Excel

"% SystemRoot% \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe" -NoProfile -NonInteractive -WindowStyle Hidden -File "C: \ my \ folder \ myScript.ps1"

Ahora puede seleccionar (múltiples) CSV y abrirlos en Excel a través de Right-click » SendTo » Excel


1
El complemento se probó con Office 2003 y 2013
nixda

La "Mejor manera" superior es exactamente lo que necesitaba para una importación única. No es necesario meterse con VBA e incluso puede controlar qué columnas se toman como fecha / números (con el resto tomado como texto). Desearía que Excel ofreciera abrir este asistente de importación al hacer doble clic en CSV.
ADTC

@Vadzim Hola, agradezco su esfuerzo para arreglar enlaces muertos. De hecho, ge.tt tiene algunos problemas en los últimos meses. Pero creo que solucioné todos los problemas y los viejos enlaces originales deberían funcionar nuevamente. No sé por qué Google Chrome advierte antes de descargar cualquier cosa desde ge.tt. Pero todos los demás navegadores funcionan normalmente y puedo asegurarle que no son malware
Nixda

@nixda, gracias por revivir los enlaces y por una gran respuesta
Vadzim

@nixda Los enlaces a ge.tt están nuevamente rotos. La mayoría dice que no están disponibles porque el propietario violó los TOS. Sin embargo, el de OpenCSV.exe dice "Estos archivos ya no están disponibles porque violaron los términos del servicio". Lo que me lleva a preguntar, ¿eres el autor de la función ImportMyCSV Excel? (el código fuente todavía está disponible en pastebin) Esta es una herramienta increíble: la uso en el trabajo y se la he recomendado a otros. Pero estoy interesado en el origen del código, por lo menos, para acreditar adecuadamente al autor.
GlennFromIowa

5

Puede intentar abrir primero un .xlsx, luego crear una conexión de datos e importar el .csv. Seleccione "coma" delimitada, luego seleccione la opción para tratar todas las columnas como texto en lugar de "General".

Editar: Oh, no leí completamente la pregunta. En el asistente de importación, seleccione el primer encabezado de columna que desea importar como texto, desplácese al encabezado de columna final y presione Mayús + clic en el encabezado. Luego seleccione la opción radial "Texto".


2
Sí, esto funciona bien, siempre y cuando la extensión del archivo no sea ".csv". +1
Jean-François Corbett

4

La sugerencia de Wetmelon funciona (incluso con .CSV) si hace lo siguiente:

  1. Abra Excel en un libro u hoja de trabajo en blanco
  2. Haga clic en Datos> [Obtener datos externos] del texto
  3. Use el "Asistente de importación de texto" como describe Wetmelon (delimitado por comas, seleccione la primera columna, MAYÚS + CLIC en la última columna, configure todo en Texto).

Sé que son más pasos, pero al menos me permite abrir CSV de esta manera sin tener que cambiar la extensión


2

¡Cuidado!

Cuando utilice el método manual "Excel → Datos → Obtener datos externos → Seleccione todas las columnas y elija Texto" ......

Esto solo establecerá las columnas en el texto "que tienen datos en la primera fila" (generalmente una fila de encabezado). Este asistente no le muestra las columnas más a la derecha que podrían tener datos más abajo pero no en la primera fila. Por ejemplo:

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

¡Nunca verá Col 4 en el asistente de importación, por lo que no tendrá la opción de cambiarlo de formato general a texto antes de importar !!!!


1
Una buena advertencia, ya que el 99.9999% de las veces, las personas no se desplazan hacia abajo en el asistente de importación, e incluso entonces es difícil atrapar todas las columnas. Sin embargo, técnicamente, puede desplazarse hacia abajo mientras está en el asistente de importación y capturar columnas adicionales que no tienen datos en la primera fila.
GlennFromIowa

1

Aquí está el procedimiento alternativo al código publicado anteriormente por Jean-François Corbett

Este procedimiento importará el archivo csv a Excel con todas las columnas formateadas como texto

Public Sub ImportCSVAsText()
    Dim TempWorkbook As Workbook
    Dim TempWorksheet As Worksheet
    Dim ColumnCount As Integer
    Dim FileName As Variant
    Dim ColumnArray() As Integer

    'Get the file name
    FileName = Application.GetOpenFilename(FileFilter:="All Files (*.*),*.*", FilterIndex:=1, Title:="Select the CSV file", MultiSelect:=False)

    If FileName = False Then Exit Sub

    Application.ScreenUpdating = False

    'Open the file temporarily to get the count of columns
    Set TempWorkbook = Workbooks.Open(FileName)
    ColumnCount = TempWorkbook.Sheets(1).Range("A1").SpecialCells(xlCellTypeLastCell).Column
    TempWorkbook.Close SaveChanges:=False

    'Resize the array to number of columns
    ReDim ColumnArray(1 To ColumnCount)

    For i = 1 To ColumnCount
        ColumnArray(i) = xlTextFormat
    Next i

    Set TempWorkbook = Workbooks.Add
    Set TempWorksheet = TempWorkbook.Sheets(1)

    Application.DisplayAlerts = False
    TempWorkbook.Sheets(2).Delete
    TempWorkbook.Sheets(2).Delete
    Application.DisplayAlerts = True

    With TempWorksheet.QueryTables.Add("TEXT;" & FileName, TempWorksheet.Cells(1, 1))
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1251
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = ColumnArray
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With

End Sub

Bienvenido a SuperUser, en lugar de agregar una nueva respuesta, debería haber editado la respuesta de Corbett y mejorarla. Me doy cuenta de que aún no tienes suficiente reputación para hacerlo, pero puedes vincular tus cambios en los comentarios donde le pidas que lo lea.
Vlastimil Ovčáčík

0

Si siempre está importando los mismos datos (formato de registro constante, diseño, etc.), podría escribir una macro de Access utilizando una especificación de importación y luego volcar los datos nuevamente a Excel. Hecho esto puede veces. La otra forma en que lo he hecho es usar VBA y leer los datos en la hoja de trabajo un registro a la vez y analizarlos a medida que se lee. Hasta donde yo sé, no hay forma de establecer un formato predeterminado durante la importación en Excel e incluso si pudiera causaría problemas con el siguiente tipo de archivo que intenta analizar.


1
Aquí está la cosa: no estoy tratando de hacer ningún análisis, excepto poner la cadena de texto que estaba entre las comas en columnas cuando la importo. Si necesito que se formatee de cierta manera, entonces puedo hacerlo (como hacer fechas de cadenas de fecha, etc.), pero solo necesito que los datos se dejen solos inicialmente. ¿Por qué debería ser tan difícil?
William Gunn

0

Como solicitud, enviando mi comentario como respuesta (con un poco más de información agregada):

Hola, Scripting Guy hizo un artículo de blog sobre Importar CSV a Excel que podría tener algunos datos útiles para usted. Jugar con el objeto de datos dentro de powershell puede permitirle hacer lo que quiera.

Aunque el artículo solo menciona específicamente la importación de datos en las celdas que pueden dejar el formato de número, es posible jugar con algunas de las propiedades y métodos de Excel ComObject para forzar que los datos ingresen a las celdas como texto sin formato (o forzar el formato de las celdas en texto antes o después de la importación).


0

Por razones desconocidas, incluso si proporciona explícitamente formatos para todas las columnas, Excel lo ignorará si la extensión del archivo es CSV.

Algunas opciones:

  • Cree una consulta para importar los datos, como sugiere Wetmelon .
    Desventaja: es posible que le falten controladores de base de datos CSV en una máquina de 64 bits.

  • Use el código de Jean , pero incorpore la copia del archivo a una carpeta temporal y cambie la extensión de la copia.
    Desventaja: Sin enlace al archivo original (al guardar se sobrescribirá la copia); Tendrá que eliminar manualmente la copia después. Aún así, puede guardar manualmente como sobre el CSV original.

  • Abrir el CSV en el Bloc de notas, Ctrl+A, Ctrl+C, pegue a Excel, a continuación, los datos - texto en columnas, entonces es el asistente habitual donde se puede establecer todas las columnas de texto en una sola vez. Es una versión diferente de la opción anterior, porque también oculta la preciosa extensión de Excel.
    Desventaja: manual.

  • Tenga un bucle VBA muy simple que lea todo el archivo en la memoria y lo coloque en la hoja, celda por celda.
    Desventaja: más lento, feo.


¿No es "No hay enlace al archivo original [CSV]" una desventaja de todos estos métodos? Me gusta la idea de copiar en una carpeta temporal y cambiar la extensión allí ... Incluso podría sobrescribir el original (como CSV) tan pronto como se abra la copia.
Jean-François Corbett

@ Jean-FrançoisCorbett, uso el Asistente de importación todo el tiempo para importar archivos .csv con una extensión de csv en Excel 2010. Especifico explícitamente el formato de las columnas como Texto y conserva el formato de la celda como texto. ¿Quizás esto fue un problema con versiones anteriores de Excel?
GlennFromIowa

-2

Si entiendo la pregunta correctamente, esto se resuelve fácilmente usando la opción Transponer en Pegado especial como se describe aquí .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.