web-dev-qa-db-fra.com

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

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, pas de problème. Mais Excel, sans faute, convertit ces fichiers en déchets inutiles. Vouloir enseigner aux utilisateurs finaux l’art d’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 at-il un paramètre que je n'ai pas pu trouver? Cela semble être le cas avec Excel 2003, 2007 et 2010.

128
atroon

Mais Excel, sans faute, 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 le formatage 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 aussi faire ="268435459705526269",,="268435459705526269" en vous épargnant 2 caractères). Cela a 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 "=""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.

58
Tyler

Nous avons eu un problème similaire où 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 serait le 3 mars, après quoi le retour au numérique nous a donné un entier de date inutile. Nous avons contourné par

  1. Renommer le fichier 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 dit 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.

text import wizard

À votre santé

42
user65525

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.

9
twentybeersreserved

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.

1
Peterlip

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 au format de fichier Excel.

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

0
user127379

L'importation Wizard 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'Import Wizard 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
0
PBeezy