Excel CSV: formato de celda numérica

86

Produzco un informe como archivo CSV. Cuando trato de abrir el archivo en Excel, hace una suposición sobre el tipo de datos según el contenido de la celda y lo reformatea en consecuencia.

Por ejemplo, si el archivo CSV contiene

...,005,...

Entonces Excel lo muestra como 5. ¿Hay alguna manera de anular esto y mostrar 005?

Preferiría hacer algo con el archivo en sí, de modo que el usuario pueda simplemente hacer doble clic en el archivo CSV para abrirlo.

Yo uso Excel 2003.

Sergey Stadnik
fuente
Consulte esta pregunta para obtener una solución macro a este problema.
Adam Jensen
Hoy en día existen muchas bibliotecas de escritura de Excel. Debería ser bastante fácil crear archivos .xlsx en el idioma que elija. Si sus usuarios todavía usan Excel 2003 por alguna razón (común cuando se hizo esta pregunta originalmente, pero es de esperar que no sea muy probable hoy), también hay algunas opciones de producción de archivos .xls. Para las personas que hoy se encuentran con esta pregunta, es muy probable que no tengan que hacer la suya propia.
John Y

Respuestas:

129

No hay una manera fácil de controlar el formato que aplica Excel al abrir un archivo .csv. Sin embargo, a continuación se enumeran tres enfoques que podrían ayudar.

Mi preferencia es la primera opción.

Opción 1: cambiar los datos en el archivo

Puede cambiar los datos en el archivo .csv de la siguiente manera ..., = ”005” , ... Esto se mostrará en Excel como ..., 005 , ...

Excel habrá mantenido los datos como una fórmula, pero copiar la columna y pegar valores especiales eliminará la fórmula pero conservará el formato.

Opción 2 : formatear los datos

Si es simplemente un problema de formato y todos sus datos en esa columna tienen una longitud de tres dígitos. Luego abra los datos en Excel y luego formatee la columna que contiene los datos con este formato personalizado 000

Opción 3 : cambie la extensión del archivo a .dif (formato de intercambio de datos)

Cambie la extensión del archivo y utilice el asistente de importación de archivos para controlar los formatos. Excel abre automáticamente los archivos con extensión .dif cuando se hace doble clic en ellos.

Paso a paso:

  • Cambie la extensión del archivo de .csv a .dif
  • Haga doble clic en el archivo para abrirlo en Excel.
  • Se iniciará el 'Asistente para importación de archivos'.
  • Establezca el 'Tipo de archivo' en 'Delimitado' y haga clic en el botón 'Siguiente'.
  • En Delimitadores, marque 'Coma' y haga clic en el botón 'Siguiente'.
  • Haga clic en cada columna de sus datos que se muestra y seleccione un 'Formato de datos de columna'. La columna con el valor '005' debe tener el formato 'Texto'.
  • Haga clic en el botón finalizar, Excel abrirá el archivo con los formatos que haya especificado.
Robert Mearns
fuente
8
.dif no funcionó en mi máquina; la apertura manual con Excel 2007 no funcionó (me advirtió que el tipo de archivo era diferente a la extensión) y parece que .DIF está asociado con Quicktime en muchas computadoras. Solo para su información :) De lo contrario, ¡excelentes consejos!
Nicholas
15
Creo que la opción 1 es la mejor, si desea una forma sencilla de generar un archivo que "simplemente funcione", es decir, que se abra en la computadora del usuario en Excel sin necesidad de que realice ningún trabajo adicional.
Kip
Tengo el mismo problema y ninguno de los anteriores es apropiado, lo siento. Pensando que podría exportar como XML y usar XSLT para ir a CSV. Necesito que el archivo CSV sea correcto para que se pueda importar a otra aplicación
Matt
1
Tenga en cuenta que la opción 1 no siempre es buena, si tiene una celda de digamos "1E02, el texto que sea" y luego coloca un igual delante, Excel imaginará que ingresó una fórmula. Primero, la fórmula será incorrecta, pero segundo y lo más importante, dividirá el texto en 2 celdas.
ghiscoding
1
Gracias por la Opción 1. Se solucionó mi problema de notación científica sin ningún trabajo adicional.
NaN
28

No use CSV, use SYLK.
http://en.wikipedia.org/wiki/SYmbolic_LinK_(SYLK)

Brinda mucho más control sobre el formato y Excel no intentará adivinar el tipo de campo examinando el contenido. Parece un poco complicado, pero puede salirse con la suya usando un subconjunto muy pequeño.

Mark Ransom
fuente
2
+1 Escribir en SYLK es fácil de implementar, lo hice como novato.
Matt H
1
No conocía este formato. Parece algo que podría usar. +1 por esto!
Buggabill
+1 Me tomó cinco minutos cambiar de CSV a SYLK. ¡Mi formato de salida goto de ahora en adelante!
TheFish
@xamde, tienes razón. Es extraño que nunca extendieran el formato para admitirlo, como lo hicieron con RTF.
Mark Ransom
WTF, o lo que cualquiera recomendaría, cito de Wikipedia: "Microsoft no publica una especificación SYLK".
sorin
14

Esto funciona para Microsoft Office 2010, Excel versión 14

Leí mal la preferencia del OP de "hacer algo con el archivo en sí". Sigo guardando esto para aquellos que quieren una solución para formatear la importación directamente

  1. Abra un archivo en blanco (nuevo) (Archivo -> Nuevo desde el libro de trabajo)
  2. Abra el Asistente de importación (Datos -> Desde texto)
  3. Seleccione su archivo .csv e importe
  4. En el cuadro de diálogo, elija 'Delimitado' y haga clic en Siguiente.
  5. Elija sus delimitadores (desmarque todo menos "coma"), elija sus calificadores de texto (probablemente {Ninguno}), haga clic en Siguiente
  6. En el campo Vista previa de datos , seleccione la columna que desea que sea texto. Debe resaltar.
  7. En el campo Formato de datos de columna , seleccione 'Texto'.
  8. Haga clic en terminado.

fuente
explicado con imágenes: support.insight.ly/hc/en-us/articles/…
Yo Ludke
2

Simplemente puede formatear su rango como Texto.

También aquí hay un buen artículo sobre los formatos numéricos y cómo puede programarlos.

Ólafur Waage
fuente
Eso solo afectará cómo se muestra el valor. Debe convertirlo a texto, ya sea con una fórmula o durante la importación, con uno de los muchos métodos que se incluyen en este hilo
leo
2

De hecho, descubrí que, al menos a partir de Office 2003, puede guardar una hoja de cálculo de Excel como un archivo XML. Por lo tanto, puedo producir un archivo XML y cuando haga doble clic en él, se abrirá en Excel. Proporciona el mismo nivel de control que SYLK, pero la sintaxis XML es más intuitiva.

Sergey Stadnik
fuente
2

Agregar un espacio que no se rompa en la celda podría ayudar. Por ejemplo: "firstvalue";"secondvalue";"005 ";"othervalue"

Obliga a Excel a tratarlo como un texto y el espacio no es visible. En Windows, puede agregar un espacio que no se rompa inclinando alt + 0160. Consulte aquí para obtener más información: http://en.wikipedia.org/wiki/Non-breaking_space

Probé en Excel 2010. Espero que esto pueda ayudar a las personas que aún buscan una solución bastante adecuada para este problema.

Kloe2378231
fuente
2

Tuve este problema al exportar datos CSV desde el código C #, y lo resolví anteponiendo los datos del cero a la izquierda con el carácter de tabulación \ t, por lo que los datos se interpretaron como texto en lugar de numéricos en Excel (sin embargo, a diferencia de anteponer otros caracteres, no lo haría ' ser visto).

Me gustó el enfoque = "001", pero esto no permitiría que los datos CSV exportados se volvieran a importar nuevamente a mi aplicación C # sin eliminar todo este formato del archivo CSV de importación (en su lugar, solo recortaré los datos de importación) .

Richard Pursehouse
fuente
1

Creo que cuando importa el archivo, puede seleccionar el Tipo de columna. Conviértalo en Texto en lugar de Número. Sin embargo, no tengo una copia frente a mí para verificar.

Harley Holcombe
fuente
1

Cargue csv en oleDB y fuerce todos los tipos de datos inferidos a la cadena

Hice la misma pregunta y luego la respondí con código.

Básicamente, cuando se carga el archivo csv, el controlador oledb hace suposiciones, usted puede decirle qué suposiciones debe realizar.

Sin embargo, mi código obliga a todos los tipos de datos a encadenarse ... es muy fácil cambiar el esquema. para mis propósitos, usé un xslt para obtener ti de la manera que quería, pero estoy analizando una amplia variedad de archivos.

John Nicholas
fuente
1

Sé que esta es una pregunta antigua, pero tengo una solución que no figura aquí.

Cuando genere el csv, agregue un espacio después de la coma pero antes de su valor, por ejemplo , 005,.

Esto funcionó para evitar el formateo automático de fecha en Excel 2007 de todos modos.

plntxt
fuente
2
Recién probado, no parece funcionar con Excel 2007 y una columna numérica. : - /
Norman H
1

El método del Asistente para importación de texto NO funciona cuando el archivo CSV que se está importando tiene saltos de línea dentro de una celda. Este método maneja este escenario (al menos con datos delimitados por tabulaciones):

  1. Crear nuevo archivo de Excel
  2. Ctrl + A para seleccionar todas las celdas
  3. En el cuadro combinado Formato de número, seleccione Texto
  4. Abrir archivo delimitado por tabulaciones en el editor de texto
  5. Seleccionar todo, copiar y pegar en Excel
Pepinillos
fuente
1

Simplemente agregue 'antes del número en el documento CSV.

MNassar
fuente
Esto no funcionó en Excel 2010 ('se convierte en parte del contenido de la celda).
sancho.s ReinstateMonicaCellio
1

Esto me ha estado volviendo loco todo el día (ya que de hecho no puede controlar los tipos de columna de Excel antes de abrir el archivo CSV), y esto funcionó para mí, usando VB.NET y Excel Interop:

        'Convert .csv file to .txt file.
        FileName = ConvertToText(FileName)

        Dim ColumnTypes(,) As Integer = New Integer(,) {{1, xlTextFormat}, _
                                                        {2, xlTextFormat}, _
                                                        {3, xlGeneralFormat}, _
                                                        {4, xlGeneralFormat}, _
                                                        {5, xlGeneralFormat}, _
                                                        {6, xlGeneralFormat}}

        'We are using OpenText() in order to specify the column types.
        mxlApp.Workbooks.OpenText(FileName, , , Excel.XlTextParsingType.xlDelimited, , , True, , True, , , , ColumnTypes)
        mxlWorkBook = mxlApp.ActiveWorkbook
        mxlWorkSheet = CType(mxlApp.ActiveSheet, Excel.Worksheet)


Private Function ConvertToText(ByVal FileName As String) As String
    'Convert the .csv file to a .txt file.
    'If the file is a text file, we can specify the column types.
    'Otherwise, the Codes are first converted to numbers, which loses trailing zeros.

    Try
        Dim MyReader As New StreamReader(FileName)
        Dim NewFileName As String = FileName.Replace(".CSV", ".TXT")
        Dim MyWriter As New StreamWriter(NewFileName, False)
        Dim strLine As String

        Do While Not MyReader.EndOfStream
            strLine = MyReader.ReadLine
            MyWriter.WriteLine(strLine)
        Loop

        MyReader.Close()
        MyReader.Dispose()
        MyWriter.Close()
        MyWriter.Dispose()

        Return NewFileName
    Catch ex As Exception
        MsgBox(ex.Message)
        Return ""
    End Try

End Function
Ellen
fuente
0

Al abrir un CSV, aparece el asistente de importación de texto. En el último paso del asistente, debería poder importar la columna específica como texto, conservando así el prefijo '00'. Después de eso, puede formatear la celda de la forma que desee.

Intenté con Excel 2007 y pareció funcionar.

marca
fuente
1
Excel 2003 no muestra el asistente.
Sergey Stadnik
0

Bueno, Excel nunca muestra el asistente para archivos CSV. Si le cambia el nombre a .txt, verá el asistente cuando haga un Archivo> Abrir en Excel la próxima vez.

Narayanan
fuente
0

Ponga una cita simple antes del campo. Excel lo tratará como texto, incluso si parece un número.

...,`005,...

EDITAR: Esto está mal. El truco del apóstrofe solo funciona cuando se ingresan datos directamente en Excel. Cuando lo usa en un archivo CSV, aparece el apóstrofo en el campo, lo que no desea.

http://support.microsoft.com/kb/214233

JW.
fuente
4
Esto es algo que la gente probablemente probará. Así que saber que no funcionará es útil y ahorra tiempo.
AndyM