Проблема с экспортом decimal чисел в excel

246
13 апреля 2017, 15:12

Доброго времени суток! Возник вопрос при экспорте чисел decimal в файл Excel. Задача следующая: из базы в datagridview на форме записываются данные, потом эти же данные отправляются в excel с соответствующими масками для числовых форматов. Числа Int32 почему-то экспортируются нормально, а у decimal чисел запятая уезжает в конец перед последним нулем (т.е., если в датагриде число 8143,90000, то в экселе оно выглядит как 814 390 000,0). Вот как устанавливается маска:

{ ...       
string Sep = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
worksheet.Range(Utilities.ConverterToChar(i + 1) + ":" + Utilities.ConverterToChar(i + 1)).NumberFormat = "### ##0" + Sep + "0";
...}

Причем маску выставляю одинаково для обоих типов. В чем может быть дело и как передать их в excel в нормальном виде (для примера выше, предполагается 8 143,90) ? (ConverterToChar это метод для перевода числа в букву, с ним все в порядке, проверено)

UPD: Заметил еще такую вещь, после нескольких заходов - все числа decimal экспортируются, как текст, кроме тех, у которых была нулевая дробная часть (они приводятся к нужной маске). Есть какие-то идеи, как это исправить? Уже голову сломал. Может, дело в разделителе?.. Но тогда не понимаю, в чем загвоздка, ибо устанавливается он в зависимости от CurrentCulture. Ниже код того, как данные из датагрида пишутся в Excel:

//Формирование DataTable Data
        for (int iCol = 0; iCol < dataGridView1.Columns.Count; iCol++)
        {
            Data.Columns.Add(dataGridView1.Columns[iCol].Name);     
        }
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            DataRow datarw = Data.NewRow();
            for (int iCol = 0; iCol < dataGridView1.Columns.Count; iCol++)
            {                   
                datarw[iCol] = row.Cells[iCol].Value;
            }
            Data.Rows.Add(datarw);
        }
        //Массив создается
        arr = new object[Data.Rows.Count + 2, Data.Columns.Count];
        //int headerRows = 2;
        int indexRow = 1;
        int headerNameRow = 0;
        int index = 1;
        //Установка заголовков стобцов в массиве
        for (int columnIndex = 0; columnIndex < dataGridView1.Columns.Count; columnIndex++)
        {
            DataGridViewColumn gridColumn = dataGridView1.Columns[columnIndex];
            arr[headerNameRow, columnIndex] = dataGridView1.Columns[columnIndex].HeaderText;
            arr[indexRow, columnIndex] = index;
            index++;
        }
        //Заполнение массива данными из Data
        for (int r = 0; r < Data.Rows.Count; r++)
        {
            DataRow dr = Data.Rows[r];
            for (int c = 0; c < Data.Columns.Count; c++)
            {
                arr[r + 2, c] = dr[c];
            }
        }
        //Приступаем к созданию файла Excel
        string Sep = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
        dynamic excel = Microsoft.VisualBasic.Interaction.CreateObject("Excel.Application", string.Empty);
        excel.ScreenUpdating = false;
        dynamic workbook = excel.workbooks;
        workbook.Add();
        dynamic worksheet = excel.ActiveSheet;
        const int left = 1;
        const int top = 1;
        int height = arr.GetLength(0);
        int width = arr.GetLength(1);
        int bottom = top + height - 1;
        int right = left + width - 1;
        if (height == 0 || width == 0)
            return;
        dynamic rg = worksheet.Range[worksheet.Cells[top, left], worksheet.Cells[bottom, right]];
        // Перенос текста в ячейках
        rg.Cells.WrapText = true;
        // Заполняем данными из массива Excel таблицу
        rg.Value = arr;
        // Задали сетку в таблице
        for (int i = 1; i <= 4; i++)
            rg.Borders[i].LineStyle = 1;
Answer 1

Попробуйте преобразовать в en-US перед отправкой в excel

i.ToString(new System.Globalization.CultureInfo("en-US").NumberFormat);
READ ALSO
System.Threading.Timers или System.Timers.Timer

System.Threading.Timers или System.Timers.Timer

Необходимо инициализировать порядка 1000 таймеровКаждый таймер должен обрабатывать свой метод, метод в аргументе принимает грубо говоря...

193
Что такое NullReferenceException, и как мне исправить код?

Что такое NullReferenceException, и как мне исправить код?

Когда я выполняю некоторый код, выбрасывается исключение NullReferenceException со следующим сообщением:

522
С# работа с реестром

С# работа с реестром

Требуется получить данные по умолчанию из реестраЦель в том что бы достать Current system local, но не получется так как в реестре по умолчанию "Default"...

324
Bind значения к ресурсу приложения

Bind значения к ресурсу приложения

Пытался создать привязку значения к PropertiesSettings

214