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éthode SetCellValue parce que vous ne l'utilisez pas...
InformationsquelleAutor | 2009-09-01