Экспорт в Excel с использованием OpenXML и C #, целых чисел и даты
Я пишу приложение, которое должно экспортировать данные из приложения карты. Это приложение использует Silverlight, и для облегчения экспорта в Excel я использую эту библиотеку. Все данные по умолчанию представлены в строках. Когда я пишу в электронную таблицу, я пытаюсь разобрать каждую строку, чтобы увидеть, какой тип она есть:
string str = kvp.Value; int i = 0; long l = 0; decimal dec = 0; DateTime dt; if (int.TryParse(str, out i)) doc.Workbook.Sheets[0].Sheet.Rows[r].Cells[c].SetValue(i); else if (decimal.TryParse(str, out dec)) doc.Workbook.Sheets[0].Sheet.Rows[r].Cells[c].SetValue(dec); else if (long.TryParse(str, out l)) doc.Workbook.Sheets[0].Sheet.Rows[r].Cells[c].SetValue(l); else if (DateTime.TryParse(str, out dt)) doc.Workbook.Sheets[0].Sheet.Rows[r].Cells[c].SetValue(dt); else doc.Workbook.Sheets[0].Sheet.Rows[r].Cells[c].SetValue(str);
Это отлично работает, за исключением DateTime и когда я пытаюсь разобрать номер социального страхования, который в моем случае составляет 12 символов.
Номер социального страхования анализируется как десятичное число и отображается в научной форме в Excel. Из того, что я собрал в процессе чтения, это похоже на ограничение в Excel. Однако, если я отмечаю ячейку, я вижу правильное число в верхней строке, где вы можете писать формулы. Я решил эту проблему до сих пор, просто поставив это число в виде строки и разрешив конечному пользователю обработать его на данный момент, но мне бы очень хотелось, чтобы это было число в готовом документе. Это возможно?
- Откройте xml sdk и interops для Excel для автоматизации на стороне клиента
- Получение пользовательских свойств и версии с помощью openXML
- Частичный вычерчивание содержимого ячейки C # Excel
- Создание файла Excel с использованием Raw XML
- Документ Excel закрытXML, как поврежденный
Что действительно пугает мой разум, это DateTime. Формат даты поступает из приложения: 10/15/2013 1:10:00 AM. Это похоже на файл Excel: 2455075.
Я проверил исходный код для форматирования даты, но, похоже, я недостаточно разбираюсь в том, что в нем что-то не так. Для любого, кто был в курсе, вы можете проверить это здесь .
Функция SetValue должна автоматически идентифицировать следующие типы:
- BOOL
- DateTime
- десятичная дробь
- исключение
- SharedStringDefinition
- строка
Прошу прощения за длинный пост. Это сводится к следующим вопросам:
- Могу ли я заставить Excel обрабатывать длинные номера без научной нотации программно?
- Почему DateTime выводится в такой странный формат?
- Пользовательская ширина столбца в OpenXML и MS Excel
- Формат столбца OpenXML Excel?
- Open XML SDK: форматирование части ячейки Excel
- Формат кода для формата европейской валюты в Open XML без символа
- Как добавить комментарии к заметке Excel с помощью POI?
- Проблема в создании ячейки Date в Excel с использованием OpenXml в C #
- C # SpreadSheetsLight axis
- Экспорт DataTable в Excel с открытым Xml SDK в c #
Для установки значения Cell Value in Date вам необходимо преобразовать DateTime в дату автоматизации OLE. Также вы можете создать более понятный метод для записи значений ячеек. Что-то вроде этого:
public bool UpdateValue(WorkbookPart wbPart, string sheetName, string addressName, string value, UInt32Value styleIndex, CellValues dataType) { // Assume failure. bool updated = false; Sheet sheet = wbPart.Workbook.Descendants<Sheet>().Where( (s) => s.Name == sheetName).FirstOrDefault(); if (sheet != null) { Worksheet ws = ((WorksheetPart)(wbPart.GetPartById(sheet.Id))).Worksheet; Cell cell = InsertCellInWorksheet(ws, addressName); if (dataType == CellValues.SharedString) { // Either retrieve the index of an existing string, // or insert the string into the shared string table // and get the index of the new item. int stringIndex = InsertSharedStringItem(wbPart, value); cell.CellValue = new CellValue(stringIndex.ToString()); } else { cell.CellValue = new CellValue(value); } cell.DataType = new EnumValue<CellValues>(dataType); if (styleIndex > 0) cell.StyleIndex = styleIndex; // Save the worksheet. ws.Save(); updated = true; } return updated; }
Затем вызовите этот метод следующим образом (первый вызов для String second для DateTime):
UpdateValue(workbookPart, wsName, "D14", "Some text", 0, CellValues.String); UpdateValue(workbookPart, wsName, "H13", DateTime.Parse("2013-11-01").ToOADate().ToString(CultureInfo.InvariantCulture), 0, CellValues.Date);