J'ai travaillé avec Interop.Word pour générer les documents Word via une application Winforms.
J'ai récemment fait la migration de la version Office 2003 vers 2007.
Lorsque j'ai ouvert le document généré avec Word 2007, j'ai obtenu l'erreur:
Word ne peut pas démarrer le convertisseur mswrd632.wpc
Après des recherches, cette erreur est due à la mise à jour de sécurité Windows XP, Windows 2000, and Windows Server 2003 au 8 Décembre 2009.
Pour éviter l'affichage de ce message, j'ai supprimé le convertisseur mswrd632 en base de registre. Pour ce faire:
-Exécuter regedit
-Aller dans HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\Text Converters\Import\MSWord6.wpc
-Cliquer droit puis supprimer
Cela désinscrit le convertisseur indiqué dans le message d’erreur. Microsoft Office utilisera ses propres convertisseurs pour ouvrir les documents.
Pour plus d'explication:
-http://support.microsoft.com/kb/973904
-http://support.microsoft.com/kb/243088
Affichage des articles dont le libellé est etc. Afficher tous les articles
Affichage des articles dont le libellé est etc. Afficher tous les articles
mardi 15 juin 2010
jeudi 10 juin 2010
Cyrstal Report "ApplyLogOnInfo" très lent
J'ai migré une application qui utilise Crystal Report qui génère un fichier PDF avec les données de la base SQL Server.
La migration se fait à partir du .NET 1.1 vers .NET3.5.
Depuis la génération du pdf est très lente.
La partie qui est particulièrement lente se trouve dans la boucle:
TableLogOnInfo logOnInfo = new TableLogOnInfo();
for (int i = 0; i < dossierCyrstal.Database.Tables.Count; i++)
{
//logOnInfo
logOnInfo.ConnectionInfo.ServerName = [Nom du serveur];
logOnInfo.ConnectionInfo.DatabaseName = [Nom base de données];
logOnInfo.ConnectionInfo.UserID = [Nom d'utilisateur];
logOnInfo.ConnectionInfo.Password = [Mot de passe];
dossierCrystal.Database.Tables[i].ApplyLogOnInfo(logOnInfo);
}
Après les recherches sur le net, j'ai remplacé la boucle ci-dessous avec deux lignes de code:
dossierCrystal.DataSourceConnections[0].SetConnection
([Nom du serveur], [Nom base de données], [Nom d'utilisateur], [Mot de passe]);
dossierCrystal.Refresh();
Depuis, la génération s'accélère.
La migration se fait à partir du .NET 1.1 vers .NET3.5.
Depuis la génération du pdf est très lente.
La partie qui est particulièrement lente se trouve dans la boucle:
TableLogOnInfo logOnInfo = new TableLogOnInfo();
for (int i = 0; i < dossierCyrstal.Database.Tables.Count; i++)
{
//logOnInfo
logOnInfo.ConnectionInfo.ServerName = [Nom du serveur];
logOnInfo.ConnectionInfo.DatabaseName = [Nom base de données];
logOnInfo.ConnectionInfo.UserID = [Nom d'utilisateur];
logOnInfo.ConnectionInfo.Password = [Mot de passe];
dossierCrystal.Database.Tables[i].ApplyLogOnInfo(logOnInfo);
}
Après les recherches sur le net, j'ai remplacé la boucle ci-dessous avec deux lignes de code:
dossierCrystal.DataSourceConnections[0].SetConnection
([Nom du serveur], [Nom base de données], [Nom d'utilisateur], [Mot de passe]);
dossierCrystal.Refresh();
Depuis, la génération s'accélère.
mardi 8 juin 2010
Interopérabilité Word 2007 Un composant externe a levé une exception
J’ai travaillé sur une application Winforms développée en C# qui génère des documents Word.
La génération consiste à remplacer les mots clés dans le document par les données de la base de données.
Sur certains postes d'utilisateur, la génération renvoie une exception:
"Composant externe a levé une exception" ou "Le relais a reçu des données incorrectes"
Après plusieurs recherches, c'est lors d'appel de l'objet Find qui pose problème.
Ceci est dû à l'enregistrement des bibliothèques antérieures à 2007 qui sont enregistrées dans la base de registre Windows après celles de 2007.
Deux solutions possibles:
1. Exécuter la ligne de commande: C:\Program Files\Microsoft Office\Office12\Winword.exe /r qui force la réinscription des dll Word dans la base de registre Windows.
Ou s'il n'y a qu'une seule version Word sur le poste, aller dans Démarrer -> Exécuter -> winword.exe /r
2. Utilisez liaison tardive pour l'objet Find (late binding).
J'ai transformé le code suivant:
object missingValue = Type.Missing;
object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; Microsoft.Office.Interop.Word.Find find = ThisApplication.Selection.Range.Find;
object texteRecherche = TextRecherche;
object texteRemplace = TextNew;
find.Execute(ref texteRecherche ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref texteRemplace,
ref replaceAll, ref missingValue, ref missingValue, ref missingValue, ref missingValue);
à
object missingValue = Type.Missing;
object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; Microsoft.Office.Interop.Word.Find find = ThisApplication.Selection.Range.Find;
object texteRecherche = TextRecherche;
object texteRemplace = TextNew;
object[] Parameters;
Parameters = new object[15];
Parameters[0] = texteRecherche
Parameters[1] = missingValue;
Parameters[2] = missingValue;
Parameters[3] = missingValue;
Parameters[4] = missingValue;
Parameters[5] = missingValue;
Parameters[6] = missingValue;
Parameters[7] = missingValue;
Parameters[8] = missingValue;
Parameters[9] = texteRemplace
Parameters[10] = replaceAll;
Parameters[11] = missingValue;
Parameters[12] = missingValue;
Parameters[13] = missingValue;
Parameters[14] = missingValue;
find.GetType().InvokeMember("Execute", System.Reflection.BindingFlags.InvokeMethod, null, find,Parameters);
// Libérer les ressources
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFind);
oFind = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(oSelection);
oSelection = null;
Le problème a été résolu.
NB: Bien que la première méthode est plus facile, l'application peut échouer par la suite, si la bibliothèque de type Excel 95,… est réinscrite par une autre application ou un service pack.
Pour aller plus loin:
http://support.microsoft.com/kb/313104
http://support.microsoft.com/kb/210565
La génération consiste à remplacer les mots clés dans le document par les données de la base de données.
Sur certains postes d'utilisateur, la génération renvoie une exception:
"Composant externe a levé une exception" ou "Le relais a reçu des données incorrectes"
Après plusieurs recherches, c'est lors d'appel de l'objet Find qui pose problème.
Ceci est dû à l'enregistrement des bibliothèques antérieures à 2007 qui sont enregistrées dans la base de registre Windows après celles de 2007.
Deux solutions possibles:
1. Exécuter la ligne de commande: C:\Program Files\Microsoft Office\Office12\Winword.exe /r qui force la réinscription des dll Word dans la base de registre Windows.
Ou s'il n'y a qu'une seule version Word sur le poste, aller dans Démarrer -> Exécuter -> winword.exe /r
2. Utilisez liaison tardive pour l'objet Find (late binding).
J'ai transformé le code suivant:
object missingValue = Type.Missing;
object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; Microsoft.Office.Interop.Word.Find find = ThisApplication.Selection.Range.Find;
object texteRecherche = TextRecherche;
object texteRemplace = TextNew;
find.Execute(ref texteRecherche ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref texteRemplace,
ref replaceAll, ref missingValue, ref missingValue, ref missingValue, ref missingValue);
à
object missingValue = Type.Missing;
object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; Microsoft.Office.Interop.Word.Find find = ThisApplication.Selection.Range.Find;
object texteRecherche = TextRecherche;
object texteRemplace = TextNew;
object[] Parameters;
Parameters = new object[15];
Parameters[0] = texteRecherche
Parameters[1] = missingValue;
Parameters[2] = missingValue;
Parameters[3] = missingValue;
Parameters[4] = missingValue;
Parameters[5] = missingValue;
Parameters[6] = missingValue;
Parameters[7] = missingValue;
Parameters[8] = missingValue;
Parameters[9] = texteRemplace
Parameters[10] = replaceAll;
Parameters[11] = missingValue;
Parameters[12] = missingValue;
Parameters[13] = missingValue;
Parameters[14] = missingValue;
find.GetType().InvokeMember("Execute", System.Reflection.BindingFlags.InvokeMethod, null, find,Parameters);
// Libérer les ressources
System.Runtime.InteropServices.Marshal.ReleaseComObject(oFind);
oFind = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(oSelection);
oSelection = null;
Le problème a été résolu.
NB: Bien que la première méthode est plus facile, l'application peut échouer par la suite, si la bibliothèque de type Excel 95,… est réinscrite par une autre application ou un service pack.
Pour aller plus loin:
http://support.microsoft.com/kb/313104
http://support.microsoft.com/kb/210565
jeudi 16 avril 2009
Checkout from SVN and Rebuild Solution File from Command Line
I create a .bat file to checkout an application source from SVN and to rebuild solution file without opening Visual studio .NET.
rem ****Déclare path to Tortoise and Visual Studio .NET ***
set path=%path%;C:\Program Files\TortoiseSVN\bin;C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\
rem ****Checkout application source from SVN****
rem ****/closeonend:1 Close automatically Tortoise Dialog Box if no error TortoiseProc.exe /command:checkout /path:"D:\MyProject" /url:"https://svn.toto.com/svnrepos/MyProject/trunk" /closeonend:1
rem ****Déclare path to Tortoise and Visual Studio .NET ***
set path=%path%;C:\Program Files\TortoiseSVN\bin;C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\IDE\
rem ****Checkout application source from SVN****
rem ****/closeonend:1 Close automatically Tortoise Dialog Box if no error TortoiseProc.exe /command:checkout /path:"D:\MyProject" /url:"https://svn.toto.com/svnrepos/MyProject/trunk" /closeonend:1
rem ****Rebuild solution in debug mode - output to log file****
devenv.exe /rebuild Debug "D:\MyProject\MyProject.sln" /out "d:\logMyProject"
Inscription à :
Articles (Atom)