Project

General

Profile

Bug #1011

Export CSV non compatible avec Excel

Added by Victor Claudet almost 11 years ago. Updated over 9 years ago.

Status:
Fermé
Priority:
Haut
Assignee:
-
Category:
-
Target version:
Start date:
28 November 2011
Due date:
% Done:

0%

Estimated time:
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 ?


Files

wcs.xlwt.diff (1.94 KB) wcs.xlwt.diff Thomas Noël, 02 January 2012 05:08 PM

Related issues

Related to w.c.s. - Bug #2627: Export CSV compatible Excel 2010Rejeté27 March 2013

Actions

History

#1

Updated by Frédéric Péters (de retour le 10/10) almost 11 years ago

Attache un fichier ?

#2

Updated by Frédéric Péters (de retour le 10/10) almost 11 years ago

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

Updated by Benjamin Dauvergne almost 11 years ago

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

Updated by Thomas Noël almost 11 years ago

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

Updated by Victor Claudet almost 11 years ago

  • Target version set to Au-quotidien 2012.1
#6

Updated by Thomas Noël almost 11 years ago

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

Updated by Thomas Noël almost 11 years ago

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

Updated by Benjamin Dauvergne almost 11 years ago

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

Updated by Thomas Noël almost 11 years ago

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

Updated by Thomas Noël almost 11 years ago

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

Updated by Thomas Noël almost 11 years ago

Le patch sur backoffice/root.ptl

#12

Updated by Thomas Noël almost 11 years ago

  • Status changed from Nouveau to Solution déployée
#13

Updated by Anonymous almost 11 years ago

Ok pour moi.

#14

Updated by Thomas Noël almost 11 years ago

Anonyme a écrit :

Ok pour moi.

On fait du vote à bulletin secret ? ;)

#15

Updated by Frédéric Péters (de retour le 10/10) almost 11 years ago

Damned, j'étais plus loggué.

#16

Updated by Thomas Noël almost 11 years ago

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

Updated by Thomas Noël over 10 years ago

  • Status changed from Solution déployée to Résolu (à déployer)
#18

Updated by Thomas Noël over 9 years ago

  • Status changed from Résolu (à déployer) to Fermé

Also available in: Atom PDF