Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
j'ai une application qui contient des documents word et excel lié à des dossiers
Ces documents sont enregistrés dans une base SQL server 2000 sous forme de blob
1) Le passage Excel/Word ==> Blob fonctionne
2) Si je charge un blob (SELECTBLOB) dans un OLE (word ou excel), le document s'ouvre sans souci, son réenregistrement en base également
Par contre si je veux enregistrer mes documents sous la forme de fichier j'ai un souci :
- Pour les documents Word, aucun problème, les fichiers générés sur le disque sont lisibles et correct
- Par contre pour les fichiers Excel, le "contenu" (si je l'ouvre via NotePad ++ par exemple) à l'air correct, mais en voulant l'ouvrir sur Excel, impossible, par de page chargé ni message d'erreur, rien
J'ai essayé avec 2 méthodes
1) Enregistrer le blob obtenu via SELECTBLOB directement dans un nouveau fichier (FileOpen, FileWriteEx, FileClose)
2) Charger le blob dans un OLE Excel, puis SaveAs de cet OLE dans un nouveau fichier
Dans les 2 cas, j'ai bien un fichier non vide (Entre 40 et 50 Ko) contenant apparement mes données (vu en forme Hexa, je retrouve le contenu des cellules), mais Excel n'ouvre pas le fichier
Merci de votre aide, car moi je sèche (surtout comme je l'ai dit plus haut, pour les blobs Word aucun souci)
Environnement : PowerBuilder 12, SQL Server 2000
Dernière modification par Worldinmyeyes (08-11-2013 16:51:53)
Hors ligne
Salut,
ce serait pas tout bêtement une question d'extension de nom de fichier pour le fichier excel ?
genre tu serais parti de fichier.xls présent sur le HDD, que t'aurais enregistré dans un blob puis le blob tu le resauve ailleurs sur le HDD mais en tant que fichier.xlsx cette fois ci et donc quand tu essayes de l'ouvrir avec Excel après ben il pense que le fichier doit être formaté comme un .xlsx et se plante car en fait il est formaté comme un .xls
Hors ligne
Non je suis resté tout le temps en fichier XLS
D'ailleurs si je change l'extension en XLS, là j'ai une erreur d'Excel me disant que le format ou l'extension n'est pas valide
Comment d'ailleurs puis je connaitre l'extension du fichier dans mon Blob ?
J'ai essayé la fonction String(BlobMid(<blob>, 1,3), EncodingAnsi!) , mais ca me ramène des caractères bizarre (les mêmes que sur un blob Word d'ailleurs)
Hors ligne
Mmm... tout ce que je peux te conseiller c'est de faire une comparaison entre un fichier excel de départ et un fichier excel sauvé depuis un blob dans l'espoir de trouver où ça coince.
Je te conseillerai de créer un nouveau fichier excel ( avec juste "test" dans la 1ère cellule pour dire d'avoir quelquechose) c'est en tout cas ma technique quand j'ai aucune idée d'où peut venir le problème j'essaye de simplifier la question ^^
Hors ligne
Worldinmyeyes a écrit:
Ces documents sont enregistrés dans une base SQL server 2000 sous forme de blob
Tu passes par un objet OLE pour sauvegarder ton document en DB ?
Hors ligne
@rincevent : OK j'essaierai de comparer un fichier généré d'un fichier test
@Geo : Oui via des OLE, car documents doivent pouvoir être enregistrés/visualisés/envoyés par mail/imprimés
Hors ligne
Je viens de faire l'observation suivante
Pour un même fichier XLS stocké en base :
Si je l'ouvre via l'OLE et que je fais "Enregistrer sous ..." via Excel, le fichier fait 56Ko et es parfaitement lisible par Excel
Si je l'enregistre via le SaveAs du controle OLE ou un FileWriteEx du blob, le fichier ne fait plus que 32 Ko et ne s'ouvre pas
Donc le pb n'est pas la source (blob) mais bien la méthode d'enregistrement
Quand j'ouvre ces 2 fichiers via NotePad ++, je vois que seules 2 premières lignes sont identiques
Hors ligne
Ok, on a constaté les mêmes problèmes (ça allait même jusqu'à fonctionner sur certains postes clients et pas sur d'autre pour le même document joint).
On a donc choisis de sauvegarder le document directement dans un blob (fileopen, FileReadEx, FileClose) pour le sauvegarder en DB, donc sans utiliser d'OLE.
Pour la récupération, idem à partir du blob (fileopen, FileWriteEx, FileClose).
Pour les visualisation, impression et autres, on est passé par des ShellExecute (comme ça l'OS se débrouille pour lancer l'outil associé).
En fait il semble que dans certains cas (mais on n'a pas identifié le pourquoi), des informations concernant l'OLE (visionneuse ?) soient ajoutées au document. Donc lorsqu'on essaie de réouvrir le document avec l'outil associé, la structure du document n'est plus correcte. On a également sauvegardé le nom du document (pour retrouver son extension et proposer un nom à la sauvegarde).
Voilà, pas de solution miracle mais j'espère que ça t'aidera .
Hors ligne
Justement quand le document est récupéré de la base de donnée via un blob et stocké sur la visionneuse, et en sauvegardant sur le disque via la visionneuse cela me donner un fichier totalement viable.
Le fait de l'enregistrer via FileWriteEx me donne un fichier "incomplet'
Ce que je vais tenter c'est une fois le blob chargé dans l'OLE c'est de faire un SaveAs via un ActiveDocument, cela devrait donc fonctionner
Ce que je ne comprend pas c'est pourquoi je n'ai pas ce problème avec les documents Word
Hors ligne
Tu pourrais nous donner ton code pour voir si il y a quelque chose qui nous saute aux yeux ?
Et peut être nous mettre les fichiers (bons et pas bons) à disposition si ils ne sont pas confidentiels.
Logiquement il ne devrait pas y avoir de problèmes avec les FileWriteEx... Mais dans notre métier nous devons parfois faire un peu de magie noire
Hors ligne
Bon alors je sais ce qui manque dans le fichier généré via le SaveAS : la feuille en elle-même
Les données sont bien là, mais je n'ai ni feuille ni onglet dans mon document !
En passant par un OLEObject et non un OleControl j'arrive à générer un fichier qui peut s'ouvrir (donc avec onglet et feuille)
lole_xls = CREATE OLEObject lole_xls.ConnectToNewObject("excel.application") lole_xls.Workbooks.Add lole_xls.Application.ActiveWorkBook.WorkSheets.Add lole_xls.Application.ActiveWorkBook.SaveAs(ls_str_dir)
Il ne reste plus qu'à remplir l'OLEObject avec mon blob. Quelqu'un sais commetn on fait ca ? Je sais le faire avec un OLeControl (ole_1.objectData = <MonBlob>), mais comment fait on pour remplir directement l'OLEObject ?
Hors ligne
Bon j'ai trouvé une solution qui fonctionne : un copy/paste de mon OLE Control sur le workbook de l'OLEObject
ole_temp_xls.objectdata = lb_document ole_temp_xls.Copy() lole_xls = CREATE OleObject lole_xls.Connecttonewobject("excel.application") lole_xls.WorkBooks.Add lole_xls.Application.workbooks(1).worksheets(1).Paste lole_xls.Application.workbooks(1).worksheets(1).SaveAs(ls_str_dir) lole_xls.Application.WorkBooks(1).Close() lole_xls.Application.quit() DESTROY(lole_xls)
Hors ligne