web-dev-qa-db-fra.com

Comment configurer Excel pour qu'il importe toujours toutes les colonnes de fichiers CSV en tant que texte?

Bien que j'essaie de l'éviter, je dois parfois ouvrir un fichier CSV dans Excel. Lorsque je le fais, il formate les colonnes contenant des nombres, ce qui les rend inutiles pour mes besoins. Autant que je sache, le seul moyen d'empêcher cela de se produire lors de l'importation est de renommer le fichier afin que l'extension ne soit pas .csv et d'utiliser l'assistant d'importation pour spécifier le format de chaque colonne individuellement. Pour les fichiers de 50 à 60 colonnes, cela n’est pas pratique.

Puisque chaque réponse à cette question souvent posée sur Internet suggère soit un moyen de reconvertir les nombres formatés une fois le fichier ouvert (ce qui ne fonctionnera pas pour moi - je veux résoudre le problème général, pas quelques cas spécifiques) ou en sélectionnant manuellement le type de format de chaque colonne (ce que je ne veux pas faire), je cherche un moyen de définir une préférence globale ou un style tel que toutes les colonnes de tous les fichiers CSV ouverts soient toujours au format texte. Je connais aussi le fait de "protéger" les chiffres avec des guillemets, mais les fichiers que je reçois ne viennent pas comme cela et j'espérais éviter de les traiter à l'avance afin que Excel ne les gâche pas.

Existe-t-il un moyen de faire spécifiquement this: formatez toujours toutes les colonnes de fichiers CSV ouverts sous forme de texte, sans sélectionner manuellement chaque colonne à chaque fois lors de l'importation?

J'utilise Excel 2003, mais je vais prendre des réponses pour 2007 si c'est ce que vous savez.

66
William Gunn

Cela marche:

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

Usage:

OpenCsvAsText "C:\MyDir\MyFile.txt"

Le fichier séparé par des virgules est maintenant ouvert en tant que feuille Excel avec toutes les colonnes au format texte.

Notez que la solution de l'assistant @ Wetmelon fonctionne très bien, mais si vous ouvrez de nombreux fichiers, vous pouvez, comme moi, vous lasser, à chaque fois, de faire défiler l'écran jusqu'à la colonne 60 afin de cliquer dessus en maintenant la touche Maj enfoncée.

EDIT@GSerg indique dans le commentaire ci-dessous que cela "ne fonctionne pas" et "mange des espaces et des zéros non significatifs". Je citerai simplement le commentaire à la question, qui est plus descriptif:

Pour des raisons inconnues, même si vous fournissez explicitement des formats pour toutes les colonnes de VBA, Excel l'ignorera si l'extension de fichier est CSV. Dès que vous modifiez l'extension, ce même code donnera les résultats corrects.

Donc, le code ci-dessus "fonctionne", mais est tué par ce comportement ridicule d'Excel. Quelle que soit la façon dont vous le coupez, vous êtes obligé de changer l'extension en quelque chose d'autre que ".csv", désolé! Après cela, vous êtes libre à la maison.

7

Comment ouvrir des CSV dans Excel

Bonne façon

  • Excel → Données → Obtenir des données externes → Sélectionnez toutes les colonnes avec Shift et choisissez Texte

    Upside: traite toutes les valeurs correctement en tant que texte sans exception

    Inconvénient: plus d'étapes qu'un simple Double-cliquez sur

Mauvaise manière

  • Ouvrir un CSV avec Double-cliquez sur ou avec Excel Ouvrez avec

    Inconvénient: le gestionnaire CSV interne d'Excel interprète mal les valeurs avec le signe - ou = en tête sous la forme d'une formule plutôt que du texte

    Inconvénient: vous perdrez des zéros non significatifs à partir de valeurs binaires telles que 0001 en raison du format de colonne détecté automatiquement par Excel.

Bon moyen (pour VBA)

  • Utilisez QueryTables (l'équivalent VBA de Get external data) → Example code

    Upside: traite toutes les valeurs correctement en tant que texte sans exception

    Inconvénient: un peu plus de code que la méthode OpenText

Mauvaise manière (pour VBA)

  • Utiliser la méthode Workbooks.OpenTextExemple de code

    Inconvénient: cette méthode utilise toujours le gestionnaire d'importation CSV interne d'Excel avec tous ses défauts.

    Inconvénient: en outre, le paramètre fieldinfo de OpenText est ignoré si l'extension est CSV. Normalement, ce paramètre vous permet de choisir chaque format de colonne, mais pas si l'extension est CSV. Vous pouvez en savoir plus sur ce comportement sur Stack Overflow

    Renommer temporairement l'extension source de CSV en TXT, puis en CSV est une solution de contournement valide si vous avez le contrôle total sur le fichier source.

Méthodes supplémentaires

  • Si vous avez accès à la source qui crée votre fichier CSV, vous pouvez modifier la syntaxe de ce dernier.
    Placez toutes les valeurs entre guillemets et préfixez un signe égal tel que ="00001" ou ajoutez une tabulation à chaque valeur. Les deux méthodes obligeront Excel à traiter la valeur en tant que texte

    Contenu CSV original
    enter image description here

    CSV dans Excel lorsqu'il est ouvert via un double clic
    enter image description here

    Notez comment la ligne 2 (méthode des guillemets doubles) et la ligne 3 (méthode des tabulations) ne sont pas modifiées par Excel

  • Ouvrez le fichier CSV dans Notepad et copiez-collez toutes les valeurs dans Excel. Ensuite, utilisez Données - Texte en colonnes
    Inconvénient: Le texte dans les colonnes permettant de modifier les formats de colonne du texte général au texte génère des résultats incohérents. Si une valeur contient un - entouré de caractères (par exemple, "= E1-S1"), Excel tente de scinder cette valeur en plusieurs colonnes. Les valeurs situées directement dans cette cellule peuvent être écrasées

    (Le comportement de Texte en colonnes a été modifié quelque part entre Excel 2007 et 2013 afin que cela ne fonctionne plus)


Complément Excel pour ouvrir des fichiers CSV et importer toutes les valeurs sous forme de texte

Ceci est un plug-in Excel destiné à simplifier les actions d'importation CSV.
L’avantage principal: c’est une solution en un clic qui utilise QueryTables, la même méthode pare-balles derrière Obtenir des données externes

  • Il ajoute une nouvelle commande de menu à Excel qui vous permet d'importer des fichiers CSV et TXT. Toutes les valeurs sont importées dans la feuille active à partir de la cellule sélectionnée
  • Le complément Excel est disponible pour toutes les versions d'Office sous Windows et Mac
  • L'ensemble du complément ne contient que 35 lignes de code. Vérifiez le commentaire code source si vous êtes curieux
  • Le séparateur de liste CSV utilisé (virgule ou point-virgule) provient de vos paramètres Excel locaux.
  • Le codage est défini sur UTF-8.

Installation

  1. Téléchargez le Add-In et enregistrez-le dans votre dossier Compléments: %appdata%\Microsoft\AddIns
  2. Ouvrez Excel et activez le complément: File tab → Options → Add-Ins → Go To et sélectionnez ImportCSV.xla.
  3. Activer les macros VBA: File tab → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros
  4. Redémarrer Excel

Vous remarquerez une nouvelle entrée de la barre de menus appelée Compléments et vous utiliserez ce bouton pour ouvrir rapidement vos fichiers CSV sans passer par les tracas de la boîte de dialogue Importer.

enter image description here


Script PowerShell pour ouvrir des fichiers CSV directement à partir de l'Explorateur Windows

Vous pouvez utiliser un script PowerShell pour ouvrir des fichiers CSV et les transmettre automatiquement à Excel. Le script utilise en mode silencieux la méthode d'importation de texte d'Excel qui traite les valeurs toujours en tant que texte et, en prime, gère le codage UTF-8.

  1. Créez un nouveau fichier texte et collez le script ci-dessous. Une version commentée peut être trouvée here
$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. Enregistrez-le quelque part comme C:\my\folder\myScript.ps1. (Notez l'extension .ps1)
    • Ouvrez votre dossier sendto via WinR "Shell:sendtoEnter
  2. Créez un nouveau raccourci via Clic droit "Nouveau" Raccourci et collez cette ligne. N'oubliez pas de changer le chemin vers votre propre chemin où vous avez mis votre script. Nommez le raccourci, par exemple, Excel

"% SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -NonInteractive -WindowStyle Caché -Fichier "C:\mon\dossier\monScript.ps1"

Maintenant, vous pouvez sélectionner (plusieurs) CSV et les ouvrir dans Excel via Right-click » SendTo » Excel

69
nixda

Vous pouvez essayer d’ouvrir un fichier .xlsx, puis de créer une connexion de données et d’importer le fichier .csv. Sélectionnez "délimité par des virgules", puis sélectionnez l'option permettant de traiter toutes les colonnes en tant que texte plutôt que "Général".

Edit: Oh, je n'ai pas bien lu la question. Dans l'assistant d'importation, sélectionnez le premier en-tête de colonne à importer en tant que texte, faites défiler jusqu'au dernier en-tête de colonne, puis appuyez sur Maj + clic sur l'en-tête. Sélectionnez ensuite l'option radiale "Texte".

5
Wetmelon

La suggestion de Wetmelon fonctionne (même avec le format .CSV) si vous procédez comme suit:

  1. Ouvrir Excel dans un classeur ou une feuille de calcul vierge
  2. Cliquez sur Données> [Obtenir des données externes] à partir du texte.
  3. Utilisez l’Assistant "Importation de texte" décrit par Wetmelon (délimité par des virgules, sélectionnez la première colonne, MAJ + CLIC sur la dernière colonne, définissez le tout sur Texte).

Je sais que ce sont davantage d’étapes, mais au moins, cela me permet d’ouvrir les fichiers CSV de cette façon sans avoir à changer l’extension.

4
Colorado Techie

Fais attention!

Lorsque vous utilisez la méthode manuelle "Excel → Données → Obtenir des données externes → Sélectionnez toutes les colonnes et choisissez Texte" ......

Cela définira uniquement les colonnes sur le texte "avec des données dans la première ligne" (généralement une ligne d'en-tête). Cet assistant ne vous montre pas les colonnes plus à droite qui pourraient contenir des données plus loin mais pas dans la première ligne. Par exemple:

Row1Col1, Row1Col2, Row1Col3

Row2Col1, Row2Col2, Row2Col3, Row2Col4

Vous ne verrez jamais la Col 4 dans l'assistant d'importation, vous n'aurez donc pas la possibilité de le changer du format général au format texte avant l'importation !!!

2
PeterV

Voici la procédure alternative au code posté ci-dessus par Jean-François Corbett

Cette procédure importera un fichier csv dans Excel avec toutes les colonnes au format texte.

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
1
shivraj

Pour des raisons inconnues, même si vous fournissez explicitement des formats pour toutes les colonnes, Excel l'ignorera si l'extension de fichier est CSV.

Quelques options:

  • Créez une requête pour importer les données, comme Wetmelon suggère .
    Inconvénient: il se peut que des pilotes de base de données CSV soient manquants sur un ordinateur 64 bits.

  • Utilisez code de Jean , mais intégrez la copie du fichier dans un dossier temporaire et la modification de l'extension de la copie.
    Inconvénient: pas de lien vers le fichier d'origine (l'enregistrement écrasera la copie); vous devrez ensuite supprimer manuellement la copie. Néanmoins, vous pouvez enregistrer manuellement sous sur le fichier CSV d'origine.

  • Ouvrez le CSV dans le Bloc-notes, Ctrl+ACtrl+C, collez dans Excel, puis Données - Texte en colonnes, puis utilisez l’assistant habituel pour définir toutes les colonnes en texte en une seule fois. C'est une version différente de l'option précédente, car elle masque également l'extension précieuse d'Excel.
    Inconvénient: manuel.

  • Ayez une boucle VBA très simple qui lit le fichier entier en mémoire et le met sur la feuille, cellule par cellule.
    Inconvénient: plus lent, laid.

0
GSerg

Si vous importez toujours les mêmes données (format d'enregistrement constant, mise en page, etc.), vous pouvez écrire une macro Access à l'aide d'une spécification d'importation, puis exporter les données dans Excel. Fait cela peut fois. L’autre méthode que j’ai utilisée consiste à utiliser VBA, à lire les données dans l’enregistrement de la feuille de calcul, un enregistrement à la fois, puis à les analyser au fur et à mesure de la lecture. Autant que je sache, il n’existe aucun moyen de définir un format par défaut lors de l’importation dans Excel et même si vous le pouviez, des problèmes se produiraient lors du prochain type de fichier que vous souhaitez analyser.

0
user88859

En tant que demande, soumettre mon commentaire comme réponse (avec un peu plus d’informations ajoutées):

Hey Scripting Guy a publié un article sur Importation de CSV dans Excel qui pourrait vous donner des informations utiles. Jouer avec l’objet de données dans PowerShell peut vous permettre de faire ce que vous voulez.

Bien que l'article mentionne spécifiquement l'importation de données dans les cellules pouvant laisser le format numérique, il est possible de jouer avec certaines des propriétés et méthodes d'Excel ComObject pour forcer les données à entrer les cellules en tant que texte brut (ou forcer). la mise en forme des cellules en texte avant ou après l'importation).

0
Matrix Mole