powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Open xml sdk 2.0. Получение значения ячейки.
12 сообщений из 12, страница 1 из 1
Open xml sdk 2.0. Получение значения ячейки.
    #38343151
Userus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет. Кто-нибудь работал с этим sdk?

Использую, как я понял, легкую обвязку вокруг набора классов из Open xml sdk 2.0, которая называется OOXML. Но есть проблема, что с OOXML, что без нее, так как OOXML особо сути получения значений не меняет.

Вот такой код, который получает значение из ячейки:

Код: c#
1.
2.
3.
4.
5.
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(ms, false))
{
   WorksheetPart wSheet = SpreadsheetReader.GetWorksheetPartByName(spreadSheet, "NameSheet");
   Cell cell =  WorksheetReader.GetCell("D", 2, wSheet);
}



В принципе, работает, но все значения получаются числовыми. То есть, если в ячейки дата, то свойство cell.CellValue.Text возвращает число (так, как если ячейки с типом "дата" установить тип "число"), а не строку, представляющую дату. Как правильно получать значения из ячеек, в зависимости от их типа? Посмотрел, нигде не задать тип ячейки (игры с cell.DataType никакого эффекта не дают).
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343182
Barkan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Userus,

А у самой ячейки какой тип задан?
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343193
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое WorksheetReader
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343209
Userus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarkanUserus,

А у самой ячейки какой тип задан?

В екселе Дата.
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343212
Userus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЧто такое WorksheetReader

Класс из OOOXML.

Вот исходник метода GetCell этого класса:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public static Cell GetCell(string columnName, uint rowIndex, WorksheetPart worksheetPart)
        {
            Worksheet worksheet = worksheetPart.Worksheet;
            SheetData sheetData = worksheet.GetFirstChild<SheetData>();
            string cellReference = (columnName + rowIndex.ToString());

            // If the worksheet does not contain a row with the specified row index, insert one.
            Row row;
            if (sheetData.Elements<Row>().Where(r => r.RowIndex.Value == rowIndex).Count() != 0)
            {
                row = sheetData.Elements<Row>().Where(r => r.RowIndex.Value == rowIndex).First();
            }
            else
            {
                return null;
            }

            //If there is not a cell with the specified column name, return null 
            IEnumerable<Cell> cells = row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference);
            if (cells.Count() > 0)
            {
                return cells.First();
            }
            else
            {
                return null;
            }
        }



Он использует классы из Open xml sdk 2.0, предлагая легкую обвязоньку над этим sdk.
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343218
Userus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем-то, сейчас попробовал NPOI. Без каких либо проблем получил значение даты. Всё просто и удобно. У классов из Open xml sdk 2.0 нужных свойстив и методов пара штук, а Интелисенс вываливает кучу ненужной параши в виде extension-говнолинка, от которых уже в глазах ребит.

Я правильно понимаю, что для NPOI не нужен установленный офис?
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343240
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
private static bool IsDateFormat(string dateStr)
{
    //Remove the trailing timestamp
    dateStr = dateStr.Split(' ')[0];

    DateTime date;
    if (DateTime.TryParse(dateStr, out date))
        return true;

    if (DateTime.TryParse(dateStr, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out date))
    {
        return true;
    }

    if (DateTime.TryParse(dateStr, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.AllowWhiteSpaces, out date))
    {
        return true;
    }

    var dateArr = dateStr.Split('-');
    if (dateArr.Length == 3)
    {
        int no;
        return int.TryParse(dateArr[0], out no) && int.TryParse(dateArr[1], out no) && int.TryParse(dateArr[2], out no);
    }

    return false;
}

private static string ExcelSerialDateToDMY(int nSerialDate)
{
    // Excel/Lotus 123 have a problem with 29-02-1900. 1900 is not a leap year, but Excel/Lotus 123 think it is...

    int nDay;
    int nMonth;
    int nYear;

    if (nSerialDate == 60)
    {
        nDay = 29;
        nMonth = 2;
        nYear = 1900;

        return nDay + "-" + nMonth + "-" + nYear;
    }

    if (nSerialDate < 60)
    {
        // Because of the 29-02-1900 problem, any serial date under 60 is one off... Compensate.
        nSerialDate++;
    }

    // Modified Julian to DMY calculation with an addition of 2415019
    var l = nSerialDate + 68569 + 2415019;
    var n = (4 * l) / 146097;
    l = l - (146097 * n + 3) / 4;
    var i = (4000 * (l + 1)) / 1461001;
    l = l - (1461 * i) / 4 + 31;
    var j = (80 * l) / 2447;
    nDay = l - (2447 * j) / 80;
    l = j / 11;
    nMonth = j + 2 - (12 * l);
    nYear = 100 * (n - 49) + i + l;

    return nDay + "-" + nMonth + "-" + nYear;
}
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343254
Userus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
private static string ExcelSerialDateToDMY(int nSerialDate)
{
    // Excel/Lotus 123 have a problem with 29-02-1900. 1900 is not a leap year, but Excel/Lotus 123 think it is...

    int nDay;
    int nMonth;
    int nYear;

    if (nSerialDate == 60)
    {
        nDay = 29;
        nMonth = 2;
        nYear = 1900;

        return nDay + "-" + nMonth + "-" + nYear;
    }

    if (nSerialDate < 60)
    {
        // Because of the 29-02-1900 problem, any serial date under 60 is one off... Compensate.
        nSerialDate++;
    }

    // Modified Julian to DMY calculation with an addition of 2415019
    var l = nSerialDate + 68569 + 2415019;
    var n = (4 * l) / 146097;
    l = l - (146097 * n + 3) / 4;
    var i = (4000 * (l + 1)) / 1461001;
    l = l - (1461 * i) / 4 + 31;
    var j = (80 * l) / 2447;
    nDay = l - (2447 * j) / 80;
    l = j / 11;
    nMonth = j + 2 - (12 * l);
    nYear = 100 * (n - 49) + i + l;

    return nDay + "-" + nMonth + "-" + nYear;
}



Да, спасибо! Типо этого и нужно было.. Только вот непонятно, почему сами классы из Open xml sdk 2.0 подобного не делают? Но, что-то мне подсказывает, то NPOI малость поудобней будет. Вопрос в функциональных возможностях, но мне пока особо ничего заковыристого не нужно.
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343355
Barkan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UserusВобщем-то, сейчас попробовал NPOI. Без каких либо проблем получил значение даты. Всё просто и удобно. У классов из Open xml sdk 2.0 нужных свойстив и методов пара штук, а Интелисенс вываливает кучу ненужной параши в виде extension-говнолинка, от которых уже в глазах ребит.

Я правильно понимаю, что для NPOI не нужен установленный офис?

Правильно понимаете.
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343380
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Userusпочему сами классы из Open xml sdk 2.0 подобного не делают?
Они делают ровно то, что предполагает спецификация. Лучше использовать врапперы над OpenXML, ибо вчистую писать на нём весьма муторное занятие.
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343417
Userus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУUserusпочему сами классы из Open xml sdk 2.0 подобного не делают?
Они делают ровно то, что предполагает спецификация. Лучше использовать врапперы над OpenXML, ибо вчистую писать на нём весьма муторное занятие.

Ага.. я так и начал это представлять.

Решил использовать NPOI. К примеру, у его cell есть набор свойств StringCellValue, NumericCellValue, DateCellValue, которые всё сами преобразовывают как надо (по крайней мере, пока что как надо).

МСУ, Barkan спасибо за ответы.
...
Рейтинг: 0 / 0
Open xml sdk 2.0. Получение значения ячейки.
    #38343525
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот самый популярный враппер над openxml. Но что-то давненько обновлений не было, может крячит код под новомодный 2.5 формат...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Open xml sdk 2.0. Получение значения ячейки.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]