Я пытаюсь прочитать некоторые значения из нескольких файлов и сохранить их в новом .xlsx файле с другой группировкой. Я разработал очень простую установку для тестирования различного форматирования и поведения с нулевыми значениями. Я всегда открываю только что созданный файл в Excel, чтобы увидеть результат. Пока нет проблем.Excel: Потеря десятичного разделителя при преобразовании из строк в число
Однако в моем тестовом случае я могу достичь: A) сохранить тестовые значения, как они есть (строки) или B) заставить Excel рассматривать их как числа с заданным форматом (хорошие), но потерять десятичный разделитель (очень плохой & странный).
Я проследил проблему до последней строки в фрагменте кода ниже. Идея самоназначения - это другая должность где-то здесь, в SO, но сейчас я не могу ее найти.
Если строка закомментирована, результаты аналогичны string[,] contents
, но они форматируются как текст (и Excel жалуется на это сообщением «номер, отформатированный как текст»). Если я раскомментирую это, числа считаются числами, но теряют десятичные разделители. Также проблема может быть фактом, что я нахожусь в Чехии, а десятичный разделитель - ,
, что может вызвать проблемы с Excel. Более того, чтение значений от начала до double[,] contents
отсутствует, так как мне нужно указать, отсутствует ли значение (с пустой ячейкой). И double?[,] contents
сбой Excel ...
Пожалуйста, вы не встречали это поведение раньше? Я хотел бы 1) уметь указывать отсутствующее значение и 2) иметь содержимое ячеек, отформатированных как число, а не текст. Можете ли вы помочь мне, как достичь этого?
excelApp = new Excel.Application();
excelWorkBooks = excelApp.Workbooks;
excelWorkBook = excelWorkBooks.Add();
excelSheets = excelWorkBook.Sheets;
excelWorkSheet = excelSheets[1]; //Beware! Excel is one-based as opposed to a zero-based C#
string[,] contents = new string[,] { { "1,23", "2,123123123", "3,1415926535" }, { "2,15", null, "" } };
int contentsHeight = contents.GetLength(0);
int contentsWidth = contents.GetLength(1);
System.Globalization.CultureInfo currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
string numberFormat = string.Format("0" + currentCulture.NumberFormat.NumberDecimalSeparator + "00E+00");
for (int column = 0; column < contentsWidth; column++) {
excelWorkSheet.Columns[column + 1].NumberFormat = numberFormat;
}
Excel.Range range = excelWorkSheet.Range[excelWorkSheet.Cells[1, 1], excelWorkSheet.Cells[contentsHeight, contentsWidth]];
range.Value = contents;
// range.Value = range.Value; //Problematic place
EDIT: Я судимый изменить NumberFormat от 0,00E+00
к чему-то вроде 0,0
, 0.0
, #,#
ради теста, но без успеха. Любая авария (десятичная точка) или остается в виде текста.
Это не имеет никакого отношения к Excel. Вы пытаетесь передать строки, отформатированные для неправильной локали. Десятичная численность в странах Англосаксона - '.'. В вашем примере используется ',', обычно используемое в европейских странах. Держу пари, что ваш язык не французский, ни немецкий, ни греческий. –
* Вместо того, чтобы пытаться жестко закодировать разделитель, передайте числа как * numbers *. т.е. использовать десятичный или двойной массив и передать значения * неформатированные * в Excel. Он * может * принимать числа, а также текст –
Даже вместо того, чтобы использовать interop, используйте библиотеку типа Epplus для создания корректного файла 'xlsx', даже без установки Excel. Вы можете заполнить лист 'sheet.LoadFromCollection (myNumbersCollection)' или 'LoadFromDataTable'. –