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

68

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'éviter cela 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 pour éviter que Excel ne les gâche.

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

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

William Gunn
la source
1
Hey Scripting Guy a publié un article sur l’ 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. Ce n'est pas une réponse, car il s'agit essentiellement d'un lien hors site, mais il pourrait vous être utile.
Matrix Mole

Réponses:

7

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 de @ 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.

Jean-François Corbett
la source
1
Ça ne marche pas Mange des espaces, mange des zéros, etc.
GSerg
1
La méthode utilisée Workbooks.OpenTexta ses défauts par conception (voir ma réponse ci-dessous). Utilisez à la QueryTablesplace.
nixda
71

Comment ouvrir des CSV dans Excel

Bonne façon

  • Excel → Données → Obtenir des données externes → Sélectionnez toutes les colonnes avec, Shiftpuis choisissez Texte.

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

    Inconvénient: plus d’étapes qu’un simple double-clic

Mauvaise manière

  • Ouvrir un fichier CSV avec un double clic ou la boîte de dialogue Ouvrir avec d' Excel

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

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

Bon chemin (pour VBA)

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

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

    Inconvénient: un peu plus de code que de OpenTextméthode

Mauvaise façon (pour VBA)

  • Utiliser la Workbooks.OpenTextméthode → Exemple de code

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

    Inconvénient: De plus, le fieldinfoparamètre de OpenTextest 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 ="00001"ou ajoutez un onglet à chaque valeur. Les deux méthodes obligeront Excel à traiter la valeur en tant que texte

    Contenu CSV original
    entrez la description de l'image ici

    CSV dans Excel lorsqu'il est ouvert via un double clic
    entrez la description de l'image ici

    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 CSV dans le Bloc - notes et copiez-collez toutes les valeurs dans Excel. Ensuite, utilisez Données - Texte sur colonnes -
    Inconvénient: Le texte dans les colonnes pour modifier les formats de colonne de général en texte génère des résultats incohérents. Si une valeur contient -des caractères entourés (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 Text to column 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.
Le principal avantage: c'est une solution en un clic qui utilise QueryTablesla même méthode pare-balles que celle utilisée pour 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 code source commenté 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 complément 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 Toet sélectionnezImportCSV.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.

entrez la description de l'image ici


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 toujours les valeurs 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 ici
$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:sendto» Enter
  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

Nixda
la source
1
Le complément a été testé avec Office 2003 et 2013
nixda
Le top "Best Way" correspond exactement à ce dont j'avais besoin pour une importation unique. Pas besoin de jouer avec VBA et peut même contrôler quelles colonnes sont prises comme date / nombres (avec le reste pris comme texte). J'aurais souhaité qu'Excel propose d'ouvrir cet assistant d'importation en double-cliquant sur CSV.
ADTC
@Vadzim Bonjour, j'apprécie vos efforts pour réparer les liens morts. En effet, ge.tt fait quelques problèmes au cours des derniers mois. Mais je pense avoir résolu tous les problèmes et les anciens liens d'origine devraient fonctionner à nouveau. Je ne sais pas pourquoi Google Chrome nous avertit avant de télécharger quoi que ce soit à partir de ge.tt. Mais tous les autres navigateurs fonctionnent normalement et je peux vous assurer qu'ils ne sont pas un malware
nixda
@nixda, merci de faire revivre les liens et pour la bonne réponse
Vadzim
@nixda Les liens vers ge.tt sont à nouveau rompus. La plupart disent qu'ils ne sont pas disponibles parce que le propriétaire a violé le TOS. Cependant, celui de OpenCSV.exe indique "Ces fichiers ne sont plus disponibles car ils enfreignaient les conditions de service". Ce qui m'amène à demander, êtes-vous l'auteur de la fonction Excel ImportMyCSV? (le code source est toujours disponible sur pastebin) C'est un outil génial - je l'utilise au travail et je le recommande à d'autres. Mais je m'intéresse à l'origine du code, si rien d'autre, pour créditer correctement l'auteur.
GlennFromIowa
5

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 et maintenez les touches Maj + Clic enfoncées. Sélectionnez ensuite l'option radiale "Texte".


la source
2
Oui, cela fonctionne bien - tant que l'extension du fichier n'est pas ".csv". +1
Jean-François Corbett le
4

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 plus d'étapes, mais au moins, cela me permet d'ouvrir les CSV de cette façon sans avoir à changer l'extension.

Colorado Techie
la source
2

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 !!!!

PeterV
la source
1
Un bon avertissement: depuis 99,9999% du temps, les gens ne font pas défiler l'écran vers le bas dans l'assistant d'importation, et même dans ce cas, il est difficile d'attraper toutes les colonnes. Toutefois, techniquement, vous pouvez faire défiler l'écran lorsque vous êtes dans l'assistant d'importation et capturer des colonnes supplémentaires pour lesquelles aucune donnée ne figure dans la première ligne.
GlennFromIowa
1

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
Shivraj
la source
Bienvenue dans SuperUser. Au lieu d’ajouter une nouvelle réponse, vous devriez avoir modifié la réponse de Corbett et l’améliorer. Je me rends compte que vous n'avez pas encore assez de réputation pour le faire, mais vous pouvez associer vos modifications à des commentaires dans lesquels vous lui demandez de le lire.
Vlastimil Ovčáčík
0

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 essayez d’analyser.

utilisateur88859
la source
1
Voici la chose - je n'essaye pas de faire d'analyse syntaxique sauf pour mettre la chaîne de texte qui était entre les virgules dans les colonnes lorsque je l'importe. Si j’ai besoin de le formater d’une certaine manière, je peux le faire (comme faire des dates avec des dates, etc.), mais j’ai simplement besoin de laisser les données seules au départ. Pourquoi cela devrait-il être si difficile?
William Gunn
0

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 l’ 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 propriétés et méthodes d'Excel ComObject pour forcer les données à entrer les cellules sous forme de texte brut (ou forcer). la mise en forme des cellules en texte avant ou après l'importation).

Matrix Mole
la source
0

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 le suggère Wetmelon .
    Inconvénient: il se peut que des pilotes de base de données CSV soient manquants sur une machine 64 bits.

  • Utilisez le 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 fichier CSV dans le Bloc - notes Ctrl+A, Ctrl+C, coller à Excel, données - Texte à colonnes, il est l'assistant habituel où vous pouvez 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, moche.

GSerg
la source
"Aucun lien vers le fichier [CSV] d'origine" n'est-il pas un inconvénient de toutes ces méthodes? J'aime l'idée de copier dans un dossier temporaire et de modifier l'extension ici ... Peut même écraser l'original (au format CSV) dès que la copie est ouverte.
Jean-François Corbett
@ Jean-FrançoisCorbett, j'utilise fréquemment l'Assistant d'importation pour importer des fichiers .csv avec une extension de csv dans Excel 2010. Je spécifie explicitement le format des colonnes en tant que Texte et il conserve le format de cellule en tant que texte. Peut-être était-ce un problème avec les anciennes versions d'Excel?
GlennFromIowa
-2

Si je comprends bien la question, cela est facilement résolu en utilisant l'option Transposer de Coller-Spécial, comme décrit ici .

Rodger
la source