Доброго времени суток! Возник вопрос при экспорте чисел 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;
Попробуйте преобразовать в en-US перед отправкой в excel
i.ToString(new System.Globalization.CultureInfo("en-US").NumberFormat);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Необходимо инициализировать порядка 1000 таймеровКаждый таймер должен обрабатывать свой метод, метод в аргументе принимает грубо говоря...
Когда я выполняю некоторый код, выбрасывается исключение NullReferenceException со следующим сообщением:
Требуется получить данные по умолчанию из реестраЦель в том что бы достать Current system local, но не получется так как в реестре по умолчанию "Default"...