133 votes

Comment 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 gadgets par numéro de série. Les utilisateurs saisissent les données de l'acheteur et la quantité, et scannent 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 des widgets qu'ils ont achetés. Nous générons cela avec un script PHP qui interroge la base de données et sort le résultat sous forme de CSV avec le nom du magasin et les données associées. Cela fonctionne aussi parfaitement bien.

Lorsqu'il est ouvert dans un éditeur de texte tel que Notepad ou vi, le fichier ressemble à ceci :

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

Comme vous pouvez le voir, les numéros de série sont présents (dans ce cas deux fois, tous les numéros de série secondaires ne sont pas les mêmes) 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 avez pu le constater, les numéros de série sont placés entre guillemets. Excel ne semble pas respecter les qualificatifs de texte dans les fichiers .csv. Lorsque nous importons ces fichiers dans Access, nous n'avons aucune difficulté. Lorsqu'on les ouvre en tant que texte, aucun problème. Mais Excel, sans faute, convertit ces fichiers en un déchet inutile. Essayer d'enseigner aux utilisateurs finaux l'art d'ouvrir un fichier CSV avec une application autre que celle par défaut devient, disons, fastidieux. Y a-t-il un espoir ? Y a-t-il un paramètre que je n'ai pas réussi à trouver ? Cela semble être le cas avec Excel 2003, 2007 et 2010.

58voto

Charly Points 311

Mais Excel, sans faute, convertit ces fichiers en déchets inutiles.

Excel est un déchet inutile.

Solution

Je serais un peu surpris qu'un client souhaitant obtenir vos données au format Excel soit incapable de modifier le formatage visible de ces trois colonnes en "Nombre" avec zéro décimale ou en "texte". Mais supposons qu'un bref document d'instructions ne soit pas envisageable.

Vous avez le choix :

  1. Ajoutez un caractère non numérique et non espace dans vos numéros de série.
  2. Écrivez un fichier xls ou xlsx avec un formatage par défaut.
  3. Tricher et sortir ces chiffres sous forme de formules ="268435459705526269","",="268435459705526269" (vous pouvez aussi faire ="268435459705526269",,="268435459705526269" en vous épargnant 2 caractères). Cela a l'avantage de s'afficher correctement, et d'être probablement utile en général, 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 à l'intérieur de l'adresse. ="" comme échappés. Cela signifie que ="abc,xyz" s'étendra sur deux colonnes et brisera l'importation.

En utilisant le 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 des formules d'Excel.

44voto

Lance J Points 1

Nous avions un problème similaire avec des fichiers CSV dont les colonnes contenaient des plages telles que 3-5 et Excel les convertissait toujours en dates, par exemple 3-5 devenait 3 mars, après quoi le retour en numérique nous donnait une date entière inutile. Nous avons contourné ce problème en

  1. Renommer l'extension CSV en TXT
  2. Ensuite, lorsque nous l'avons ouvert dans Excel, cela a déclenché l'assistant d'importation de texte.
  3. À l'étape 3 sur 3 de l'assistant nous lui avons dit que les colonnes en question étaient du texte et ils ont importé correctement.

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

text import wizard

Cheers

9voto

La meilleure solution consiste à générer un classeur XML. Comme ceci :

<?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.

1voto

Peterlip Points 19

Ma solution : J'ai le même problème avec l'importation des numéros de série. Ils n'ont pas besoin d'être traités comme des nombres, c'est-à-dire qu'aucune fonction mathématique n'est exécutée dessus, mais nous avons besoin du numéro complet. La solution la plus simple que j'ai trouvée est d'insérer un espace dans le numéro de série. Par exemple "12345678 90123456 1234". Quand Excel l'importera, il sera traité comme du texte au lieu d'un numérique.

1voto

PBeezy Points 338

L'assistant d'importation est la meilleure solution pour les utilisateurs occasionnels et les situations ponctuelles. Si vous avez besoin d'une solution programmatique, vous pouvez utiliser la méthode QueryTables.Add (qui est celle que l'assistant d'importation utilise en coulisse).

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X