Как получить формат типа ячейки с помощью C# в приложении

Я использую библиотеку spreadsheetlight для чтения значений Excelsheet (.xslx), используя C#.

Я могу прочитать значение ячейки, используя следующий код

 for (int col = stats.StartColumnIndex; col <= stats.EndColumnIndex; col++)
     {              
         var value= sheet.GetCellValueAsString(stats.StartRowIndex, col);  //where sheet is current sheet in excel file    
     }

Я получаю значение ячейки. Но как я могу получить тип данных ячейки. Я проверил в документации, но я не нашел решение.

Примечание. Для файлов Excel типа.xls я использую библиотеку ExcelLibrary.dll, в которой легко получить тип данных ячеек, используя приведенный ниже код.

for (int i = 0; i <= cells.LastColIndex; i++)
     {
         var type = cells[0, i].Format.FormatType;
     }

но подобного метода нет в свете электронных таблиц.

Заранее спасибо.

4 ответа

Решение

Ну, после многих методов следа и ошибок я нашел решение для этого.

На основе formatCode ячейки мы можем определить formatType ячейки.

Используя метод GetCellStyle, мы можем получить код формата ячейки. Используя этот formatCode, мы можем определить formatType.

var FieldType = GetDataType(sheet.GetCellStyle(rowIndex, columnIndex).FormatCode);


private string GetDataType(string formatCode)
    {
        if (formatCode.Contains("h:mm") || formatCode.Contains("mm:ss"))
        {
            return "Time";
        }
        else if (formatCode.Contains("[$-409]") || formatCode.Contains("[$-F800]") || formatCode.Contains("m/d"))
        {
            return "Date";
        }
        else if (formatCode.Contains("#,##0.0"))
        {
            return "Currency";
        }
        else if (formatCode.Last() == '%')
        {
            return "Percentage";
        }
        else if (formatCode.IndexOf("0") == 0)
        {
            return "Numeric";
        }
        else
        {
            return "String";
        }
    } 

Этот метод работал в 99% случаев.

Надеюсь, это поможет вам.

Вот ответ разработчика Vincent Tang после того, как я спросил его, так как не знал, как использовать DataType:


Да, используйте SLCell.DataType. Это перечисление, но для большинства данных вы будете работать с Number, SharedString и String.

Текстовые данные будут SharedString и, возможно, String, если текст непосредственно внедрен в рабочую таблицу. Есть GetSharedStrings() или что-то в этом роде.

Для числовых данных это будет номер.

Для свиданий это немного сложно. Тип данных также Number (игнорируйте перечисление Date, потому что Microsoft Excel его не использует). Для дат вы также должны проверить FormatCode, который находится в SLStyle для SLCell. Используйте GetStyles(), чтобы получить список. SLCell.StyleIndex дает вам индекс для этого списка.

Например, если ваш SLCell имеет значение ячейки "15" и тип данных SharedString, найдите индекс 15 в списке общих строк. Если это "бла" с типом данных String, то это все.

Если это 56789 с типом Number, то это все.

Если FormatCode не является "мм-гггг" (или каким-либо другим кодом формата даты), то 56789 фактически является количеством дней с 1 января 1900 года.


Он также рекомендовал использовать GetCellList() для получения списка объектов SLCell на листе. Однако по какой-то причине эта функция не была доступна в моей версии SL, поэтому я использовал вместо нее GetCells(). Это возвращает словарь объектов SLCell с ключами типа SLCellPoint.

Так, например, чтобы получить DataType (который является объектом CellValues) ячейки A1, сделайте следующее:

using (SLDocument slDoc = new SLDocument("Worksheet1.xlsx", "Sheet1")) {

    slCP = SLCellPoint;
    slCP.ColumnIndex = SLConvert.ToColumnIndex("A"); ///Obviously 1 but useful function to know
    slCP.RowIndex = 1;

    CellValues slCV = slDoc.GetCells(slCP).DataType;

}

Кстати, у меня также была проблема с открытием файла справки chm. Попробуй это:

  • Щелкните правой кнопкой мыши на файле chm и выберите свойства
  • Нажмите кнопку "Разблокировать" в нижней части вкладки "Общие".

Проверьте свойство SLCell.DataType. В документации Spreadsheetlight упоминается, что при этом возвращается тип данных Cell в классе Spreadsheetlight.SLCell.

public CellValues DataType { get; set; }

PS: на заметку, я понял, как открыть документацию chm. Попробуйте открыть файл chm в Winzip, он открывается без проблем.

Надеюсь, поможет. Спасибо

Чтобы получить значение ячейки, попробуйте следующий код

 var cellValue = (string)(excelWorksheet.Cells[10, 2] as Excel.Range).Value;

Используйте эту ссылку для более подробной информации

Другие вопросы по тегам