Bug #1011
Export CSV non compatible avec Excel
0%
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
Related issues
History
Updated by Frédéric Péters almost 13 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>). Et je ne sais pas, Excel aujourd'hui, il lit l'ods ?
Updated by Benjamin Dauvergne almost 13 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')
Updated by Thomas Noël almost 13 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.
Updated by Thomas Noël almost 13 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".
Updated by Thomas Noël almost 13 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>
Updated by Benjamin Dauvergne almost 13 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; +}
Updated by Thomas Noël almost 13 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>). 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....
Updated by Thomas Noël almost 13 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 ...
Updated by Thomas Noël almost 13 years ago
- File wcs.xlwt.diff wcs.xlwt.diff added
Le patch sur backoffice/root.ptl
Updated by Thomas Noël almost 13 years ago
Anonyme a écrit :
Ok pour moi.
On fait du vote à bulletin secret ? ;)
Updated by Thomas Noël almost 13 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)
Updated by Thomas Noël almost 13 years ago
- Status changed from Solution déployée to Résolu (à déployer)