Редактирование объекта Excel, встроенного в документ Word в Excel - PullRequest
3 голосов
/ 27 февраля 2012

Мне нужно встроить документ Excel в документ Word. Я использовал ответ на этот вопрос SO -> Как я могу встроить любой тип файла в Microsoft Word, используя OpenXml 2.0 ;

Все отлично работает, кроме этого:

DrawAspect = OVML.OleDrawAspectValues.Icon позволяет редактировать объект Excel, открывая новый экземпляр Excel. Однако когда я редактирую данные, они не обновляются в документе Word.

DrawAspect = OVML.OleDrawAspectValues.Content позволяет редактировать объект Excel непосредственно в документе Word.

У меня вопрос: что я должен изменить в коде, чтобы я мог редактировать объект Excel в новом экземпляре и правильно ли он отражался в документе Word? Я попробовал все безрезультатно.

Что-то подсказывает мне, что DrawAspect = OVML.OleDrawAspectValues.Icon предполагает, что объект действует как значок, и изменения не могут быть должным образом отражены в этом значке.

1 Ответ

4 голосов
/ 28 февраля 2012

Вы можете попробовать способ, который я здесь проставил:

Как вставить изображение в WORD после закладки с помощью OpenXML .

Короче говоря, используйте инструмент повышения производительности Open XML SDK 2.0 (который является частью Open XML SDK 2.0). Делайте все, что вам нужно сделать с документом вручную в MS Word Затем откройте этот файл в инструменте повышения производительности Open XML SDK 2.0. Затем найдите интересующие вас правки, чтобы увидеть, как они представлены в формате OpenXML , а также как это сделать программно .

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


ОБНОВЛЕНО:


Хорошо, теперь мне стало лучше, в чем проблема ... Поэтому в дополнение к моему совету, приведенному выше, я бы порекомендовал вам ознакомиться с этой темой на форуме MSDN:

Я позволил себе перепостить пример кода (опубликованный на MSDN Forum Ji Zhou ) только для того, чтобы избежать удаления там оригинальной темы.

Надеюсь, это достаточно полезно для извлечения объекта Excel из Word, изменения некоторых ячеек и встраивания его обратно в Word.

public static void Main()
{
    using (WordprocessingDocument wDoc = WordprocessingDocument.Open(@"D:\test.docx", true))
    {
        Stream stream = wDoc.MainDocumentPart.ChartParts.First().EmbeddedPackagePart.GetStream();
        using (SpreadsheetDocument ssDoc = SpreadsheetDocument.Open(stream, true))
        {
            WorkbookPart wbPart = ssDoc.WorkbookPart;
            Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().
              Where(s => s.Name == "Sheet1").FirstOrDefault();
            if (theSheet != null)
            {
                Worksheet ws = ((WorksheetPart)(wbPart.GetPartById(theSheet.Id))).Worksheet;
                Cell theCell = InsertCellInWorksheet("C", 2, ws);
                theCell.CellValue = new CellValue("5");
                theCell.DataType = new EnumValue<CellValues>(CellValues.Number);
                ws.Save();
            }
        }
    }
}

private static Cell InsertCellInWorksheet(string columnName, uint rowIndex, Worksheet worksheet)
{
    SheetData sheetData = worksheet.GetFirstChild<SheetData>();
    string cellReference = columnName + rowIndex;
    Row row;
    if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0)
    {
        row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
    }
    else
    {
        row = new Row() { RowIndex = rowIndex };
        sheetData.Append(row);
    }
    if (row.Elements<Cell>().Where(c => c.CellReference.Value == columnName + rowIndex).Count() > 0)
    {
        return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First();
    }
    else
    {
        Cell refCell = null;
        foreach (Cell cell in row.Elements<Cell>())
        {
            if (string.Compare(cell.CellReference.Value, cellReference, true) > 0)
            {
                refCell = cell;
                break;
            }
        }

        Cell newCell = new Cell() { CellReference = cellReference };
        row.InsertBefore(newCell, refCell);
        worksheet.Save();
        return newCell;
    }
}
...