поддерживает ли openXML (C #) создание форматированных числовых полей (например, 1 000 000) - PullRequest
1 голос
/ 09 июня 2011

У меня есть существующий код, который генерирует электронную таблицу из Excel с использованием OpenXML.Это работает нормально, но мне всегда нужно идти в таблицу и добавлять форматирование.

В любом случае, в моем коде C # я могу указать, что я хочу, чтобы столбец форматировался с определенным форматированием чисел) запятыми, десятичными числами и т. Д.?

любые ссылки на примеры были бы великолепны.

вот как я сейчас сохраняю данные:

 public void SetCell<T>(string column, uint rowIndex, T value)
    {
        SheetData sheetData = _positionSheet;
        Cell cell = GetCell(sheetData, column, rowIndex);
        string stringValue = value == null ? "" : value.ToString();
        cell.CellValue = new CellValue(stringValue);
        switch (typeof(T).Name)
        {
            case "Date":
            case "DateTime": 
                cell.DataType = CellValues.Date;
                break;
            case "Int32":
                cell.DataType = CellValues.Number;
                break;
            default:
                cell.DataType = CellValues.String;
                break;
        }
    }

ниже приведен метод GetCell () (хотя я предполагаю, что это не очень актуально для вопроса:

 static private Cell GetCell(SheetData sheet, string column, uint rowIndex)
    {
        Cell cell;
        Row row = GetRow(sheet, rowIndex);
        if (row.Elements<Cell>().Where(c => c.CellReference.Value == column + rowIndex).Any())
        {
            cell = row.Elements<Cell>().Where(c => c.CellReference.Value == column + rowIndex).First();
        }
        else
        {
            Cell refCell = null;
            var comparer = new CellComparer();
            foreach (Cell existingCell in row.Elements<Cell>())
            {
                if (comparer.Compare(existingCell.CellReference.Value, column + rowIndex) > 0)
                {
                    refCell = existingCell;
                    break;
                }
            }

            cell = new Cell { CellReference = column + rowIndex };
            row.InsertBefore(cell, refCell);
        }
        return cell;
    }

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Да, это возможно, однако все это глубоко погружено в стили. Попробуйте использовать ClosedXML , он имеет объектную модель, аналогичную старой доброй объектной модели Excel, и использует OpenXML под капотом. С ним все намного проще.

1 голос
/ 09 июня 2011

Вы можете использовать ExtremeML , он основан на OpenXML. Если вы используете его, вы можете определить шаблон и сгенерировать файл Excel по шаблону.

book1.xlsx - это шаблон, book2.xlsx - это, наконец, файл. tabb1 - это таблица в Excel 2007.

            FileStream fs = new FileStream ( @"d:\book1.xlsx" , FileMode.Open );
        FileStream msm = new FileStream ( @"d:\book2.xlsx" , FileMode.CreateNew );

        using ( var package = SpreadsheetDocumentWrapper.Open ( fs , msm ) ) {
            var table = package.WorkbookPart.GetTablePart ( "tabb1" ).Table;
            var data = new List<object[]> ( );

            for ( var i = 0 ; i < 10 ; i++ ) {
                data.Add ( new object[] { "1" , "2" , "3" , "4" } );
            }

            table.Fill ( data.ToArray ( ) );
        }

        fs.Close ( );
        msm.Close ( );
...