C# - Excel mise en forme des nombres Problème avec les paramètres Internationaux
Je suis en train d'écrire sur une feuille de calcul Excel 2003 à l'aide de c# 3.5. Cependant, je n'arrive pas à obtenir que cela fonctionne correctement sur les différents paramètres de pays. Les paramètres de pays sont soit en anglais ou en allemand. Ces deux paramètres différents de décimales et de milliers de paramètres. Tout fonctionne bien, sauf si un utilisateur a modifié les séparateurs de décimales et de milliers dans les paramètres de l'écran des Options. Quelqu'un peut-il aider comme je me sens je ne peux plus voir la forêt pour les arbres et me manque quelque chose d'évident.
Résumé:
Données récupérées à partir d'une base de données access.
Lu par application en c# et de l'écrit à une feuille de calcul Excel.
Excel Version 2003
Les Machines sont en anglais ou en allemand.
Il est possible que les séparateurs de décimales et de milliers ont été modifiés dans les Paramètres options Excel-C'est là que le problème se produit.
Le comportement observé:
L'anglais de l'installation avec les Options par défaut --> International - comme prévu
Allemand programme d'installation avec les Options par défaut --> International - comme prévu
Anglais le programme d'installation avec séparateur décimal changé ",", séparateur de milliers ensemble de "." et le Système de Séparateurs décoché dans les Options --> International - Excel des données incorrectes. Voir les lignes marquées d'un astérisque.
De Données Excel
3706888.0300 3706888.03
2587033.8000 2587033.8
2081071.1800 2081071.18
9030160.3333 90.301.603.333**
42470.9842 424.709.842**
4465546.2800 4465546.28
1436037.3200 1436037.32
111650.0000 111650
2567007.0833 25.670.070.833**
J'ai attcahed exemple de code pour illustrer ce comportement. Si quelqu'un peut me montrer ce que je fais de mal, il serait très apprécié.
Pour exécuter cet exemple de code, il suffit de créer une nouvelle application Windows forms et après le code ci-dessous dans Form1.cs. Vous devrez également ajouter une référence à Microsoft.Bureau de.Interop.Excel.
Merci Beaucoup
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using System.Threading;
using System.Globalization;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void ExportDTToExcel()
{
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
app.Visible = true;
Workbook wb = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = (Worksheet)wb.ActiveSheet;
string culture = System.Threading.Thread.CurrentThread.CurrentCulture.ToString();//"en-GB";
CultureInfo ci = new CultureInfo(culture);
string excelGroupSeparator = app.ThousandsSeparator.ToString();
string excelDecimalSeparator = app.DecimalSeparator.ToString();
bool systemseparators = app.UseSystemSeparators ;
if (app.UseSystemSeparators == false)
{
app.DecimalSeparator = ci.NumberFormat.NumberDecimalSeparator;
app.ThousandsSeparator = ci.NumberFormat.NumberGroupSeparator;
//ci.NumberFormat.NumberDecimalSeparator = app.DecimalSeparator;
//ci.NumberFormat.NumberGroupSeparator = app.ThousandsSeparator;
}
//app.DecimalSeparator = ci.NumberFormat.NumberDecimalSeparator;
//app.ThousandsSeparator = ci.NumberFormat.NumberGroupSeparator;
app.UseSystemSeparators = true;
//Content.
try
{
SetCellValue("3706888.0300", ws, 0, 0, ci);
SetCellValue("2587033.8000", ws, 1, 0, ci);
SetCellValue("2081071.1800", ws, 2, 0, ci);
SetCellValue("9030160.3333", ws, 3, 0, ci);
SetCellValue("42470.9842", ws, 4, 0, ci);
SetCellValue("4465546.2800", ws, 5, 0, ci);
SetCellValue("1436037.3200", ws, 6, 0, ci);
SetCellValue("111650.0000", ws, 7, 0, ci);
SetCellValue("2567007.0833", ws, 8, 0, ci);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
//wb.SaveAs(Filepath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
//wb.Close(false, Type.Missing, false);
app.DecimalSeparator = excelDecimalSeparator;
app.ThousandsSeparator = excelGroupSeparator;
app.UseSystemSeparators = systemseparators;
//app.Quit();
Marshal.ReleaseComObject(app);
Marshal.ReleaseComObject(wb);
Marshal.ReleaseComObject(ws);
app = null;
wb = null;
ws = null;
}
private static void SetCellValue(string data, Worksheet ws,int row, int col, CultureInfo ci)
{
double val;
try
{
val = Convert.ToDouble(data);
Console.WriteLine(val);
}
catch (Exception e)
{
//Util.Log("Null Value ignored.", LogType.ERROR);
return;
}
try
{
string s = val.ToString();
ws.Cells[row + 2 , col + 1] = s;
//Util.Log("S:" + s, LogType.ERROR);
}
catch
{
//Util.Log("Null Value ignored.", LogType.ERROR);
}
}
private void button1_Click(object sender, EventArgs e)
{
this.Cursor = Cursors.WaitCursor;
ExportDTToExcel();
this.Cursor = Cursors.Default;
}
}
}
- J'ai juste scanné votre code et je me demandais pourquoi vous avez
CultureInfo ci
comme entrée pour la méthodeSetCellValue
parce que vous ne l'utilisez pas...
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas exécuter votre code, il suffit de l'analyser...
Premier Problème potentiel: Vous êtes à la vérification de UseSystemSeparators puis en définissant la DecimalSeparaor et ThousandsSeparator.
Puis juste après, vous tournez sur SystemSeparators, de sorte que le code ci-dessus n'est pas de faire quoi que ce soit depuis que vous tournez le système de séparateurs sur.
Deuxième potentiel problème/suggestion:
Lors du réglage de la valeur de la cellule, de le définir comme un double de la valeur au lieu de la chaîne, laissez format Excel le numéro pour vous.
Excel utilisé sur COM a plusieurs restrictions plus importantes à respecter sont:
Puis vous vous débarrasser de la plupart des plantages sporadiques concernant Excel automation & localisation.
Cet article KB, et un couple d'autres articles de base de connaissances des liens vers elle, de décrire certains des problèmes de localisation, vous pouvez frapper lors de l'automatisation d'Excel à partir de .NET.
Il peut aider à expliquer votre problème
Merci à Chris et à Joe, j'ai finalement obtenu le code fonctionne comme souhaité.