Comment puis-je empêcher Excel de manger mes délicieux fichiers CSV et d'excréter des données inutiles?

128

J'ai une base de données qui suit les ventes de widgets par numéro de série. Les utilisateurs saisissent les données et la quantité d'acheteurs, puis analysent chaque widget dans un programme client personnalisé. Ils finalisent ensuite la commande. Tout cela fonctionne parfaitement.

Certains clients veulent une feuille de calcul compatible avec Excel pour les widgets qu'ils ont achetés. Nous générons cela avec un script PHP qui interroge la base de données et affiche le résultat sous forme de fichier CSV avec le nom du magasin et les données associées. Cela fonctionne parfaitement bien aussi.

Lorsqu'il est ouvert dans un éditeur de texte tel que Notepad ou vi, le fichier se présente comme suit:

"Account Number","Store Name","S1","S2","S3","Widget Type","Date"
"4173","SpeedyCorp","268435459705526269","","268435459705526269","848 Model Widget","2011-01-17"

Comme vous pouvez le constater, les numéros de série sont présents (dans ce cas deux fois, toutes les séries secondaires ne sont pas identiques) et sont de longues chaînes de chiffres. Lorsque ce fichier est ouvert dans Excel, le résultat devient:

Account Number  Store Name  S1  S2  S3  Widget Type Date 
4173    SpeedyCorp  2.68435E+17     2.68435E+17 848 Model Widget    2011-01-17

Comme vous l'avez peut-être observé, les numéros de série sont entourés de guillemets doubles. Excel ne semble pas respecter les qualificateurs de texte dans les fichiers .csv. Lors de l'importation de ces fichiers dans Access, nous n'avons aucune difficulté. Lorsque vous les ouvrez sous forme de texte, aucun problème. Mais Excel, à coup sûr, convertit ces fichiers en déchets inutiles. Essayer d'apprendre aux utilisateurs finaux comment ouvrir un fichier CSV avec une application autre que celle par défaut est en train de devenir fastidieux. Y a-t-il de l'espoir? Y a-t-il un paramètre que je n'ai pas pu trouver? Cela semble être le cas avec Excel 2003, 2007 et 2010.

atroon
la source
46
puis-je donner un +1 juste pour le nom?
tombull89
11
Excel does not seem to respect text qualifiers in .csv files- les guillemets doubles ne sont pas des qualificateurs de texte, ils permettent simplement des virgules dans vos données. Si vous n'utilisez pas de virgules dans vos données, ils n'ont alors aucun sens . Toutes les données d'un fichier CSV ne sont pas typées. Excel ne peut donc que deviner que votre grand numéro de série est un nombre . C'est à ce moment-là que vous entrez dans la précision maximale de 15 chiffres d'Excel , ce qui tronque vos chiffres.
DMA57361
1
Excel ne semble pas respecter toutes les virgules entre guillemets. Considérez le "12 août 2012" Excel transforme cela aussi en ordures.
Zundarz
5
Je veux mentionner cette question SU . Il explique les options dont vous disposez lorsque vous utilisez CSV dans Excel.
Nixda
1
@nixda Merci! Ce sont des suggestions utiles, en particulier pour les utilisateurs les plus expérimentés. Mon problème est presque davantage un problème humain, dans la mesure où Excel s’associe aux fichiers .csv. Les utilisateurs voient l’icône, double-cliquer (car c’est ainsi que vous ouvrez les choses), puis cliquez sur Enregistrer (car nous disons toujours les sauver!), et tout est perdu. Mais je vais certainement utiliser vos méthodes lorsque cela est possible.
atroon

Réponses:

58

Mais Excel, à coup sûr, convertit ces fichiers en déchets inutiles.

Excel est une poubelle inutile.

Solution

Je serais un peu surpris qu'un client souhaitant vos données au format Excel ne puisse pas modifier la mise en forme visible de ces trois colonnes en "Nombre" avec zéro décimale ou en "texte". Mais supposons qu'un bref document explicatif est hors de question.

Vos options sont:

  1. Ajoutez un caractère non numérique, pas d’espace, à vos numéros de série.
  2. Ecrivez un fichier xls ou xlsx avec un formatage par défaut.
  3. Trichez et sortez ces nombres sous forme de formules ="268435459705526269","",="268435459705526269"(vous pouvez également vous ="268435459705526269",,="268435459705526269"enregistrer en économisant 2 caractères). Cela présente l’avantage d’être affiché correctement et probablement utile, mais subtilement cassé (car ce sont des formules).

Soyez prudent avec l'option 3, car certains programmes (y compris Excel et Open Office Calc) ne traiteront plus les virgules dans les =""champs comme des caractères d'échappement. Cela signifie que ="abc,xyz"s'étendra sur deux colonnes et interrompra l’importation.

L'utilisation du format de "=""abc,xy"""résout ce problème, mais cette méthode vous limite toujours à 255 caractères en raison de la limite de longueur de formule d'Excel.

Tyler
la source
1
En fait, ce n'est pas dur. Copiez et collez l'un des nombres ci-dessus dans Excel, puis modifiez le format de nombre comme suggéré. Excel modifie la valeur, ce qui entraîne des déchets.
Joe Internet
1
@ Joe, j'étais trop sommaire sur mon aperçu initial. Excel produit effectivement des déchets, et est lui-même des déchets. J'ai mis à jour ma réponse pour refléter cela. Une option pourrait être d'avoir un "csv Excel" et aussi un "csv utilisable et utile"
Tyler
2
@Tyler - Je ne pense pas qu'Excel soit une foutaise, mais simplement que OP a eu raison de dire qu'elle produisait des ordures dans ce cas. C'est en fait une très bonne question, sans solution apparemment élégante.
Joe Internet
1
L'option Format Cells ... a été suggérée et j'ai essayé de l'utiliser. Dans ce cas, au moment où vous ouvrez le fichier, Excel semble convertir les publications en série en notation scientifique (convenu, pas inattendu) et lance la précision. Lorsque vous les changez en nombre ou en texte, la chaîne ne revient pas. C'est vraiment l'essence du problème. Sortir sous forme de formules peut le faire cependant ... Je n'y ai pas pensé.
atroon
9
@ DMA57361 Le comportement n'est pas attendu, il est déterminable. La précision numérique est bien documentée, mais comment Excel ne lit pas les fichiers CSV. L'absence d'avertissement et l'élimination silencieuse de données est absurde. Le fait que vous ne puissiez même pas dire à Excel comment importer les données est également absurde. La négativité est-elle nécessaire ? Non, mais l'honnêteté est la meilleure politique et c'est ce que je ressens.
Tyler
42

Nous avions un problème similaire: nous avions des fichiers CSV avec des colonnes contenant des plages telles que 3-5 et Excel les convertissait toujours en dates. Par exemple, 3-5 était le 3 mars, après quoi le retour au format numérique nous donnait un entier de date inutile. Nous avons contourné par

  1. Renommer le CSV en extension TXT
  2. Ensuite, lorsque nous l'avons ouvert dans Excel, l'assistant d'importation de texte était activé.
  3. À l’étape 3 sur 3 de l’Assistant, nous lui avons indiqué que les colonnes en question étaient du texte et qu’elles étaient importées correctement.

Vous pourriez faire la même chose ici, je pense.

assistant d'importation de texte

À votre santé

utilisateur65525
la source
2
+1 pour être la bonne façon de le faire. (edit: désolé il a fallu éditer un peu pour clarifier la solution)
jay
2
Vous n'êtes pas obligé de renommer votre fichier. Utilisez simplement l'assistant d'importation Maj-sélectionnez toutes les colonnes et choisissez le texte.
Nixda
1
L'assistant d'importation de texte est LA réponse. Toutes les autres solutions sont du piratage inutile résultant de l'incompréhension de l'utilisation d'Excel pour afficher et éditer des fichiers CSV.
Excellll
1
@Excellll, faire un fichier à la fois, bien sûr. Lors de l'automatisation de ce processus, le 'piratage inutile' sauve souvent la tâche.
Parrish Husband
1
Cela est complètement inutile lorsque Excel est utilisé par des utilisateurs standard pour afficher des fichiers CSV. Avant d’essayer d’expliquer comment utiliser l’assistant d’import-texte pour ~ 15 utilisateurs débutants, je préfère taper moi-même le code source du document Excel.
northkildonan
8

Une meilleure solution consiste à générer un classeur XML. Comme ça:

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  </OfficeDocumentSettings>

  <ss:Worksheet ss:Name="Sheet 1">
    <Table>
    <Column ss:Width="100"/>
    <Column ss:Width="100"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="80"/>
    <Column/>

    <Row>
      <Cell><Data ss:Type="String">Account Number</Data></Cell>
      <Cell><Data ss:Type="String">Store Name</Data></Cell>
      <Cell><Data ss:Type="String">S1</Data></Cell>
      <Cell><Data ss:Type="String">S2</Data></Cell>
      <Cell><Data ss:Type="String">S3</Data></Cell>
      <Cell><Data ss:Type="String">Widget Type</Data></Cell>
      <Cell><Data ss:Type="String">Date</Data></Cell>
    </Row>

    <Row>
      <Cell><Data ss:Type="String">4173</Data></Cell>
      <Cell><Data ss:Type="String">SpeedyCorp</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">x</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">848 Model Widget</Data></Cell>
      <Cell><Data ss:Type="String">2011-01-17</Data></Cell>
    </Row>


    </Table>
    <x:WorksheetOptions/>
  </ss:Worksheet>
</Workbook>

Le fichier doit avoir une extension .xml. Excel et OpenOffice l'ouvrent correctement.

vingt bières conservées
la source
Voulez-vous dire que l'OP doit utiliser un script PHP pour convertir la base de données au format XML?
Prasanna
2
Bien plus propre que de laisser les utilisateurs ouvrir le fichier .csv dans Excel ou de gâcher votre CSV afin que seul Excel puisse comprendre votre CSV. Ce n'est même pas ce complexe d'un schéma.
binki
Où cette norme est-elle documentée? J'aimerais en savoir plus sur les types de données disponibles.
John Doherty
1

Ma solution: j'ai le même problème avec l'importation de numéros de série. Ils ne doivent pas être traités comme des nombres, c’est-à-dire qu’aucune fonction mathématique n’est exécutée, mais nous avons besoin du nombre entier. Le plus simple est d’insérer un espace dans le numéro de série. par exemple "12345678 90123456 1234". Lorsque Excel l'importe, il sera traité comme du texte au lieu d'un chiffre.

Peterlip
la source
0

J'ai eu de longs numéros de compte tronqués.

Voici comment je l'ai corrigé:

Ouvrez votre fichier.csv dans Libre Office / Open Office (vous devrez peut-être spécifier des délimiteurs, etc.), puis enregistrez le fichier en tant que fichier XML Excel.

Ensuite, ouvrez ce fichier dans Excel et vous verrez alors que les colonnes ne sont plus changées en format scientifique ou autre. Pour plus de sécurité, cliquez avec le bouton droit de la souris sur la colonne et définissez explicitement le format sur Texte, puis enregistrez le fichier au format Excel.

Ouvrez le fichier au format Excel et la colonne devrait toujours être ok!

utilisateur127379
la source
1
Bien que cela puisse fonctionner, essayer d'expliquer à quelqu'un qui ne parle que l'anglais cassé pourquoi il aurait besoin d'utiliser une suite bureautique différente crée autant de problèmes qu'il en résout. Les logiciels alternatifs à M $ Office sont à mon sens bien, mais je me rends compte que je ne peux pas convertir tout le monde.
atroon
0

L'assistant d'importation est la meilleure solution pour les utilisateurs occasionnels et les situations ponctuelles. Si vous avez besoin d'une solution de programmation, vous pouvez utiliser la méthode QueryTables.Add (c'est ce que l'Assistant d'importation utilise en arrière-plan).

Workbooks.Add
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & "C:\myfile.csv", Destination:=Range("$A$1"))
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 2, 2) 'Edit this line. Add a number for each column, 1 is general, 2 is text. Search the internet for other formats.
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With
PBeezy
la source