Projet

Général

Profil

Bug #1011

Export CSV non compatible avec Excel

Ajouté par Victor Claudet il y a plus de 12 ans. Mis à jour il y a environ 11 ans.

Statut:
Fermé
Priorité:
Haut
Assigné à:
-
Catégorie:
-
Version cible:
Début:
28 novembre 2011
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Planning:

Description

L'ouverture de l'export csv sous excel génère des erreur d'encodage de caractère et de formatage du fichier. L'export apparaît dans une cellule sans prise en compte des séparateurs.

est-ce qu'on a une solution pour contrer ça ?


Fichiers

wcs.xlwt.diff (1,94 ko) wcs.xlwt.diff Thomas Noël, 02 janvier 2012 17:08

Demandes liées

Lié à w.c.s. - Bug #2627: Export CSV compatible Excel 2010Rejeté27 mars 2013

Actions

Historique

#1

Mis à jour par Frédéric Péters il y a plus de 12 ans

Attache un fichier ?

#2

Mis à jour par Frédéric Péters il y a plus de 12 ans

Sinon il y a aussi la possibilité d'un export XLS direct, le code est déjà là (dépendance sur le module pyexcelerator (<http://pypi.python.org/pypi/pyExcelerator&gt;). Et je ne sais pas, Excel aujourd'hui, il lit l'ods ?

#3

Mis à jour par Benjamin Dauvergne il y a plus de 12 ans

Une possibilité pour être certain que l'UTF-8 s'ouvrira dans excel c'est aussi d'encoder en sortie avec utf-8-sig au lieu d'utf-8, il paraitrait que ça aide les logiciels microsofts à reconnaitre l'UTF-8 automatiquement en ajoutant un code BOM.

  out.decode(publisher.site_charset).encode('utf-8-sig')
#4

Mis à jour par Thomas Noël il y a plus de 12 ans

Pour moi, le bogue est plutôt dans Excel (et on n'est pas à l'abri d'un changement de comportement un jour), donc :
http://wiki.epistema.com/index.php/Importer_les_fichiers_CSV_dans_Microsoft_Excel
ou utiliser Données/Convertir une fois le truc importé à la va-vite.

#5

Mis à jour par Victor Claudet il y a plus de 12 ans

  • Version cible mis à Au-quotidien 2012.1
#6

Mis à jour par Thomas Noël il y a plus de 12 ans

Isabelle :

« Concernant le fichier csv, il s'avère en l'état inexploitable, je connaissais la manip, avec excel 7, ca ne fonctionne pas (que ce soit en utilisant la fonction import des données ou co
nvertir les données). Le problème vient peut-être du fait que le séparateur du csv est normalement le point virgule...

En tous cas, je voulais justement éviter aux services d'avoir à faire la manip. Ne pouvez-vous pas mettre en place une moulinette qui permettrait d'obtenir directement le fichier avec les
séparateurs sous xls ?

De plus, il y a encore des bugs sur les caractères accentués. »

Ma conclusion : regarder l'export XLS direct pour moins se "fatiguer".

#7

Mis à jour par Thomas Noël il y a plus de 12 ans

Frédéric Péters a écrit :

Sinon il y a aussi la possibilité d'un export XLS direct, le code est déjà là (dépendance sur le module pyexcelerator (http://pypi.python.org/pypi/pyExcelerator).

testé avec le pyExcelerator de debian 6, ça crashe parce qu'on lui file pas un type qu'il attends, apparement... je vais enquêter.

Exception:
  type = '<type 'exceptions.AssertionError'>', value = 'arg ['Plaquettes tri s\xc3\xa9lectif et collecte des encombrants'] does not match (<type 'str'>, <type 'unicode'>, <type 'int'>, <type 'long'>, <type 'float'>, <type 'datetime.datetime'>, <type 'datetime.time'>, <type 'datetime.date'>, <class 'pyExcelerator.ExcelFormula.Formula'>)'

Stack trace (most recent call first):
  File "/usr/lib/python2.6/dist-packages/pyExcelerator/Deco.py", line 34, in new_f
    32             for (a, t) in zip(args, types):
    33                 assert isinstance(a, t), \
>   34                        "arg %r does not match %s" % (a,t)
    35             return f(*args, **kwds)
    36         new_f.func_name = f.func_name

  locals: 
     a = ['Plaquettes tri s\xc3\xa9lectif et collecte des encombrants']
     kwds = {}
     f = <function write at 0x345bed8>
     args = (<pyExcelerator.Row.Row object at 0x3d12a60>, 11, ['Plaquettes tri s\xc3\xa9lectif et collecte des encombrants'], <pyExcelerator.Style.XFStyle object at 0x3383650>)
     t = (<type 'str'>, <type 'unicode'>, <type 'int'>, <type 'long'>, <type 'float'>, <type 'datetime.datetime'>, <type 'datetime.time'>, <type 'datetime.date'>, <class 'pyExcelerator.ExcelFormula.Formula'>)
     types = (<type 'object'>, <type 'int'>, (<type 'str'>, <type 'unicode'>, <type 'int'>, <type 'long'>, <type 'float'>, <type 'datetime.datetime'>, <type 'datetime.time'>, <type 'datetime.date'>, <class 'pyExcelerator.ExcelFormula.Formula'>), (<class 'pyExcelerator.Style.XFStyle'>, <type 'NoneType'>))

  File "/usr/lib/python2.6/dist-packages/pyExcelerator/Worksheet.py", line 1119, in write
  1117 
  1118     def write(self, r, c, label="", style=Style.XFStyle()):
> 1119         self.row(r).write(c, label, style)
  1120 
  1121     def merge(self, r1, r2, c1, c2, style=Style.XFStyle()):

  locals: 
     self = <pyExcelerator.Worksheet.Worksheet object at 0x3a63350>
     style = <pyExcelerator.Style.XFStyle object at 0x3383650>
     r = 1
     c = 11
     label = ['Plaquettes tri s\xc3\xa9lectif et collecte des encombrants']

  File "/var/vhosts/vincennes.au-quotidien.com/src/wcs/wcs/backoffice/root.ptl", line 362, in xls
   360         for i, filled in enumerate(items):
   361             for j, elem in enumerate(self.csv_tuple(fields, filled)):
>  362                 ws.write(i+1, j, elem)
   363 
   364         response = get_response()

  locals: 
     f = 'Publications'
     i = 0
     items = [<wcs.formdef.Demande-De-Documentation object at 0x3a63310>]
     self = <wcs.backoffice.root.FormPage object at 0x3cbbfd0>
     j = 11
     elem = ['Plaquettes tri s\xc3\xa9lectif et collecte des encombrants']
     ws = <pyExcelerator.Worksheet.Worksheet object at 0x3a63350>
     w = <pyExcelerator.Workbook.Workbook object at 0x3992ed0>
     fields = [<wcs.fields.StringField instance at 0x3a603f8>, <wcs.fields.StringField instance at 0x3a60e60>, <wcs.fields.StringField instance at 0x3a607e8>, <wcs.fields.StringField instance at 0x3a60ef0>, <wcs.fields.StringField instance at 0x3a60b00>, <wcs.fields.StringField instance at 0x3a608c0>, <wcs.fields.EmailField instance at 0x3a60638>, <wcs.fields.ItemsField instance at 0x3a60200>]
     filled = <wcs.formdef.Demande-De-Documentation object at 0x3a63310>
#8

Mis à jour par Benjamin Dauvergne il y a plus de 12 ans

Et sinon on peut faire ça, on pourrait rajouter une option pour l'encoding aussi:

diff --git a/po/fr.po b/po/fr.po
index f21725e..e717b02 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -4978,3 +4978,7 @@ msgstr "Courriel de l'expéditeur du formulaire" 

 #~ msgid "Last comment" 
 #~ msgstr "Dernier commentaire" 
+
+#: ../wcs/backoffice/root.ptl:254
+msgid "Delimiter character" 
+msgstr "Symbole séparateur" 
diff --git a/wcs/backoffice/root.ptl b/wcs/backoffice/root.ptl
index aa1b1dc..aee9195 100644
--- a/wcs/backoffice/root.ptl
+++ b/wcs/backoffice/root.ptl
@@ -242,7 +242,16 @@ class FormPage(Directory):

         '<ul>'
         '<li><a href="listing">%s</a></li>' % _('Listing')
-        '<li><a href="csv">%s</a></li>' % _('Listing in CSV format')
+        '''<li><form action="csv" method="get">
+            <button class="no-button"><a>%(caption)s</a></button>
+            <p><label for="delimiter">%(delimiter_caption)s</label>: <select name="delimiter">
+                <option value=";">;</option>
+                <option value=",">,</option>
+                <option value="|">|</option>
+            </select></p>
+            </form>
+           </li>
+        ''' % { 'delimiter_caption': _('Delimiter character'), 'caption': _('Listing in CSV format') }
         if pyExcelerator:
             '<li><a href="xls">%s</a></li>' % _('Listing in Excel format')
         '<li><a href="pending">%s</a></li>' % _('Pending Forms')
@@ -327,9 +336,11 @@ class FormPage(Directory):
     def csv(self):
         get_logger().info('backoffice - form %s - listing csv' % self.formdef.name)
         fields = FormDefUI(self.formdef).get_listing_fields()
-
+        delimiters = ( ';', ',', '|' )
+        delimiters = dict(zip(delimiters, delimiters))
+        delimiter = delimiters.get(get_request().form.get('delimiter', ';'), ';')
         output = cStringIO.StringIO()
-        csv_output = csv.writer(output)
+        csv_output = csv.writer(output, delimiter=delimiter)

         csv_output.writerow(self.csv_tuple_heading(fields))

diff --git a/wcs/qommon/static/css/dc2/admin.css b/wcs/qommon/static/css/dc2/admin.css
index 4c31f78..6f65b69 100644
--- a/wcs/qommon/static/css/dc2/admin.css
+++ b/wcs/qommon/static/css/dc2/admin.css
@@ -647,3 +647,13 @@ table#substvars td {
     -webkit-column-count: 2;
     -webkit-column-gap: 1em;
 }
+
+.no-button {
+    margin: 0px;
+    font: inherit;
+    padding: 0px;
+    padding-bottom: 1px;
+    background-color: inherit;
+    color: inherit;
+    border: none;
+}
#9

Mis à jour par Thomas Noël il y a environ 12 ans

Frédéric Péters a écrit :

Sinon il y a aussi la possibilité d'un export XLS direct, le code est déjà là (dépendance sur le module pyexcelerator (<http://pypi.python.org/pypi/pyExcelerator&gt;). Et je ne sais pas, Excel aujourd'hui, il lit l'ods ?

Yep. J'ai bien l'impression qu'on n'arrivera à rien de joli avec CSV (sauf à faire un clicodrome), alors qu'avec pyexcelerator (ou xlwt ?) on pourrait faire quelque chose de simple.

Apparemment le code pyexcelerator dans wcs ne marche plus, je revois ça....

#10

Mis à jour par Thomas Noël il y a environ 12 ans

J'y arrive pas avec pyExcel, mais ça semble bien marcher avec xlwt (mon test = l'import dans google docs, qui semble bien tatillon comme il faut).

Est-ce qu'on désactive pyExcel et qu'on remplace pas une dépendance sur xlwt ? Je ne pense pas que ça gène la "base installée" des w.c.s ...

#11

Mis à jour par Thomas Noël il y a environ 12 ans

Le patch sur backoffice/root.ptl

#12

Mis à jour par Thomas Noël il y a environ 12 ans

  • Statut changé de Nouveau à Solution déployée
#13

Mis à jour par Anonyme il y a environ 12 ans

Ok pour moi.

#14

Mis à jour par Thomas Noël il y a environ 12 ans

Anonyme a écrit :

Ok pour moi.

On fait du vote à bulletin secret ? ;)

#15

Mis à jour par Frédéric Péters il y a environ 12 ans

Damned, j'étais plus loggué.

#16

Mis à jour par Thomas Noël il y a environ 12 ans

xlwt (ou pyExcelerator) crashe quand une colonne est de type "fichier", il reçoit un element dont il ne sait pas quoi faire...

Je propose ce patch pour faire en sorte qu'un fichier s'affiche sous la forme de son nom dans un csv ou xls :

--- wcs/fields.py    (révision 2212)
+++ wcs/fields.py    (copie de travail)
@@ -537,6 +537,9 @@
     def get_view_value(self, value):
         return htmltext('<a href="[download]?f=%s">%s</a>') % (self.id, value)

+    def get_csv_value(self, value):
+        return ['%s' % value]
+
 register_field_class(FileField)

#17

Mis à jour par Thomas Noël il y a environ 12 ans

  • Statut changé de Solution déployée à Résolu (à déployer)
#18

Mis à jour par Thomas Noël il y a environ 11 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF