Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Open xml sdk 2.0. Получение значения ячейки. / 12 сообщений из 12, страница 1 из 1
25.07.2013, 09:00
    #38343151
Userus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Open xml sdk 2.0. Получение значения ячейки.
Всем привет. Кто-нибудь работал с этим 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
25.07.2013, 09:25
    #38343182
Barkan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Open xml sdk 2.0. Получение значения ячейки.
Userus,

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

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

В екселе Дата.
...
Рейтинг: 0 / 0
25.07.2013, 09:44
    #38343212
Userus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Open xml sdk 2.0. Получение значения ячейки.
МСУЧто такое 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
25.07.2013, 09:50
    #38343218
Userus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Open xml sdk 2.0. Получение значения ячейки.
Вобщем-то, сейчас попробовал NPOI. Без каких либо проблем получил значение даты. Всё просто и удобно. У классов из Open xml sdk 2.0 нужных свойстив и методов пара штук, а Интелисенс вываливает кучу ненужной параши в виде extension-говнолинка, от которых уже в глазах ребит.

Я правильно понимаю, что для NPOI не нужен установленный офис?
...
Рейтинг: 0 / 0
25.07.2013, 10:14
    #38343240
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Open xml sdk 2.0. Получение значения ячейки.
Код: 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
25.07.2013, 10:23
    #38343254
Userus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Open xml sdk 2.0. Получение значения ячейки.
МСУ
Код: 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
25.07.2013, 11:13
    #38343355
Barkan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Open xml sdk 2.0. Получение значения ячейки.
UserusВобщем-то, сейчас попробовал NPOI. Без каких либо проблем получил значение даты. Всё просто и удобно. У классов из Open xml sdk 2.0 нужных свойстив и методов пара штук, а Интелисенс вываливает кучу ненужной параши в виде extension-говнолинка, от которых уже в глазах ребит.

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

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

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

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

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


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