Документ open xml microsoft excel

Начиная с Microsoft Office 2007, в Microsoft Office используются форматы файлов на основе XML, например DOCX, XLSX и PPTX. Эти форматы и расширения имен файлов применяются к Microsoft Word, Microsoft Excel и Microsoft PowerPoint. В этой статье описаны основные преимущества формата, описаны расширения имен файлов и описано, как можно делиться файлами Office с людьми, которые используют более ранние версии Office.

Названия расширений файлов

В этой статье

Каковы преимущества форматов Open XML?

Что такое расширения имен XML-файлов?

Можно ли использовать одни и те же файлы в разных версиях Office?

Каковы преимущества форматов Open XML?

Форматы Open XML имеют множество преимуществ не только для разработчиков и их решений, но и для отдельных людей и организаций любого размера.

  • Сжатие файлов     Файлы сжимаются автоматически и в некоторых случаях могут быть на 75 процентов меньше. Формат Open XML использует технологию zip-сжатия для хранения документов, что позволяет сэкономить место на диске, необходимое для хранения файлов, и уменьшает пропускную способность, необходимую для отправки файлов по электронной почте, по сетям и через Интернет. Когда вы открываете файл, он автоматически обновляется. При сохранение файла он автоматически застекается снова. Для открытия и закрытия файлов в Office не нужно устанавливать специальные почтовые Office.

  • Улучшенные возможности восстановления поврежденных файлов.     Файлы имеют модульную структуру, поэтому различные компоненты данных файла хранятся отдельно друг от друга. Это позволяет открывать файлы даже в том случае, если компонент в файле (например, диаграмма или таблица) поврежден.

  • Поддержка расширенных функций    Многие из расширенных Microsoft 365 требуют, чтобы документ хранился в формате Open XML. Например, автоскрытиеи проверка доступности (вдвух примерах) можно работать только с файлами, которые хранятся в современном формате Open XML.

  • Улучшенная конфиденциальность и дополнительный контроль над персональными данными.     К документам можно делиться конфиденциально, так как личные сведения и конфиденциальные бизнес-данные, такие как имена авторов, комментарии, отслеживаемые изменения и пути к файлам, можно легко найти и удалить с помощью инспектора документов.

  • Улучшенная интеграция и совместимость бизнес-данных.     Использование форматов Open XML в качестве основы для обеспечения взаимосвязи данных в наборе продуктов Office означает, что документы, книги, презентации и формы могут быть сохранены в формате XML, который доступен для использования и лицензирования бесплатно. Office также поддерживает определяемую клиентом схему XML, улучшающую существующие Office типов документов. Это означает, что клиенты могут легко разблокировать информацию в существующих системах и действовать с ней в Office программах. Сведения, которые создаются в Office могут быть легко использованы другими бизнес-приложениями. Все, что нужно для открытия и редактирования файла Office, — это с помощью ZIP-редактора и редактора XML.

  • Упрощенное обнаружение документов, содержащих макросы.     Файлы, сохраненные с использованием стандартного суффикса x (например, .docx, .xlsx и .pptx), не могут содержать макрос Visual Basic для приложений (VBA) и макрос XLM. Макросами могут быть только файлы, расширение имени которых заканчивается на «m» (например, DOCM, XLSM и PPTM).

Список «Тип файла»

Прежде чем сохранять файл в двоичном формате, ознакомьтесь со статьей Могут ли разные версии Office одинаковыми файлами?

Как преобразовать файл из старого двоичного формата в современный формат Open XML?

Откройте файл в Приложение Office выберите файл > Сохранить как (или Сохранить копию,если файл хранится в OneDrive или SharePoint) и убедитесь, что для типа Сохранить как за установлен современный формат.

Щелкните стрелку раскрывающегося списка "Тип файла", чтобы выбрать другой формат файла для документа.

При этом будет создаваться новая копия файла в формате Open XML.

Что такое расширения имен XML-файлов?

По умолчанию документы, книги и презентации, которые вы создаете в Office, сохраняются в формате XML с расширениями имен файлов, которые добавляют «x» или «м» к уже знакомым расширениям имен файлов. Знак «x» означает XML-файл, в котором нет макроса, а «м» — XML-файл, содержащий макрос. Например, при сохранение документа в Word по умолчанию используется расширение .docx имени файла, а не .doc файла.

Сохранение файла с расширением DOCX

При сохранение файла в виде шаблона вы видите такое же изменение. Расширение шаблона, используемее в более ранних версиях, уже существует, но теперь в его конце есть «x» или «м». Если файл содержит код или макрос, его необходимо сохранить с помощью нового формата XML-файла с поддержкой макроса, который добавляет в расширение файла «м» для макроса.

В следующих таблицах перечислить все расширения имен файлов по умолчанию в Word, Excel и PowerPoint.

Word

Тип XML-файла

Расширение

Документ

DOCX

Документ с поддержкой макросов

DOCM

Шаблон

DOTX

Шаблон с поддержкой макросов

DOTM

Excel

Тип XML-файла

Расширение

Книга

XLSX

Книга с поддержкой макросов

XLSM

Шаблон

XLTX

Шаблон с поддержкой макросов

XLTM

Двоичная книга (не XML)

XLSB

Надстройка с поддержкой макросов

XLAM

PowerPoint

Тип XML-файла

Расширение

Презентация

PPTX

Презентация с поддержкой макросов

PPTM

Шаблон

POTX

Шаблон с поддержкой макросов

POTM

Надстройка с поддержкой макросов

PPAM

Демонстрация

PPSX

Демонстрация с поддержкой макросов

PPSM

Слайд

SLDX

Слайд с поддержкой макросов

SLDM

Тема Office

THMX

Можно ли использовать одни и те же файлы в разных версиях Office?

Office позволяет сохранять файлы в форматах Open XML и в двоичном формате файлов более ранних версий Office и включает в себя проверку совместимости и конвертеры файлов, позволяющие совместно использовать файлы в разных Office.

Открытие существующих файлов в Office     Вы можете открыть файл, созданный в более ранней версии Office, а затем сохранить его в существующем формате. Так как, возможно, вы работаете над документом совместно с человеком, использующим более ранную версию Office, Office использует проверку совместимости, которая проверяет, что функция, которая не поддерживается в предыдущих версиях Office, не поддерживается. Когда вы сохраняете файл, проверка совместимости сообщает вам об этих функций, а затем позволяет удалить их, прежде чем продолжить сохранение.

Время на прочтение
13 мин

Количество просмотров 50K

Решил написать статью, о том, как сделать выгрузку данных в Excel файл по шаблону и считывать данные из Excel.
Началось всё с того, что на работе, дали указание, уйти от MS Office, на бесплатные аналоги.
У нас уже была система выгрузки, основанная на библиотеке “Microsoft.Office. Interop.Excel” и много готовых шаблонов, для выгрузки тех или иных отчётов.
Поэтому надо было найти бесплатную библиотеку, работающую с офисом. И сделать так, чтоб выгрузка работала по той же системе, что и раньше. Ибо переделывать все шаблоны и структуру, не хотелось.
Вот я и наткнулся на OpenXML. И думал, сейчас по быстрому найду решение в интернете и всё готово (т.к. на это было выделено мало времени). Но подходящего решения так и не нашёл, поэтому и решил написать эту статью, для тех у кого будет, такая же проблема.
Саму библиотеку, можно скачать бесплатно с сайта Micrisoft (я использовал в проекте OpenXML sdk 2.5 “ OpenXMLSDKV25.msi ”)
здесь.
После скачивания “OpenXMLSDKV25.msi ”, устанавливаем и заходим в папку
“C:Program FilesOpen XML SDKV2.5lib” там лежит библиотека, которая нам понадобится, мы её подключим к проекту (ниже будет описано, как).
Проект был написан на Visual Studio 2010 (Framework 4.0).
Ниже пример шаблона (сделан для теста) “C:Templatestemplate.xlsx”.

image

И пример выгруженных данных (как это будет выглядеть в итоге, после выгрузки).

image

Ключевые слова:
DataField: — Означает, что на этом месте будут выведены наши банные из DataTable.
DataField:[название выводимого поля]
Label: — Означает, что на этом месте будут выводиться данные, которые надо вставить однократно из словаря
Label:[название ключа в словаре]
А это файл из которого мы будем считывать данные “C:LoadingReadMePlease.xlsx”.

image

Теперь создадим в VS2010, Решение в котором будет 4 проекта:
1) OpenXmlPrj – это консольный проект, для запуска теста.
2) Interfaces – это проект типа “Библиотека классов”, будет хранить наши интерфейсы данных для выгрузки.
3) Framework — это проект типа “Библиотека классов”, тут и будет происходить вся работа с Excel-ем.
4) Converter — это проект типа “Библиотека классов”, для конвертирования наших данных в DataTable (т.к. работа происходит с DataTable).
image
Теперь в проекте “Framework” создаём две папки и подключим ссылку на библиотеку OpenXML и WindowsBase:
“Create” – для работы с выгрузкой данных.
“Load” – для работы с загрузкой данных.
“lib” – в папку, добавим библиотеку OpenXML.
В папке “Create” создаём 4 класса.
1) Worker – это будет наш главный обработчик.

класс Create.Worker

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

namespace Framework.Create
{
    /// <summary>
    /// Создание Excel файла
    /// </summary>
    public class Worker
    {
        /// <summary>
        /// путь к папке с шаблонами 
        /// </summary>
        private const String TemplateFolder = "C:\Templates\";

        /// <summary>
        /// имя листа шаблона (с которым мы будем работать) 
        /// </summary>
        private const String SheetName = "Лист1";

        /// <summary>
        /// тип документа
        /// </summary>
        private const String FileType = ".xlsx";

        /// <summary>
        /// Папка, для хранения выгруженных файлов
        /// </summary>
        public static String Directory
        {
            get
            {
                const string excelFilesPath = @"C:xlsx_repository";
                if (System.IO.Directory.Exists(excelFilesPath) == false)
                {
                    System.IO.Directory.CreateDirectory(excelFilesPath);
                }

                return excelFilesPath;
            }
        }

        public void Export(System.Data.DataTable dataTable, System.Collections.Hashtable hashtable, String templateName)
        {
            var filePath = CreateFile(templateName);

            OpenForRewriteFile(filePath, dataTable, hashtable);

            OpenFile(filePath);
        }

        private String CreateFile(String templateName)
        {
            var templateFelePath = String.Format("{0}{1}{2}", TemplateFolder, templateName, FileType);
            var templateFolderPath = String.Format("{0}{1}", Directory, templateName);
            if (!File.Exists(String.Format("{0}{1}{2}", TemplateFolder, templateName, FileType)))
            {
                throw new Exception(String.Format("Не удалось найти шаблон документа n"{0}{1}{2}"!", TemplateFolder, templateName, FileType));
            }

            //Если в пути шаблона (в templateName) присутствуют папки, то при выгрузке, тоже создаём папки
            var index = (templateFolderPath).LastIndexOf("\", System.StringComparison.Ordinal);
            if (index > 0)
            {
                var directoryTest = (templateFolderPath).Remove(index, (templateFolderPath).Length - index);
                if (System.IO.Directory.Exists(directoryTest) == false)
                {
                    System.IO.Directory.CreateDirectory(directoryTest);
                }
            }

            var newFilePath = String.Format("{0}_{1}{2}", templateFolderPath, Regex.Replace((DateTime.Now.ToString(CultureInfo.InvariantCulture)), @"[^a-z0-9]+", ""), FileType);
            File.Copy(templateFelePath, newFilePath, true);
            return newFilePath;
        }

        private void OpenForRewriteFile(String filePath, System.Data.DataTable dataTable, System.Collections.Hashtable hashtable)
        {
            Row rowTemplate = null;
            var footer = new List<Footer>();
            var firsIndexFlag = false;
            using (var document = SpreadsheetDocument.Open(filePath, true))
            {
                Sheet sheet;
                try
                {
                    sheet = document.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>().SingleOrDefault(s => s.Name == SheetName);
                }
                catch (Exception ex)
                {
                    throw new Exception(String.Format("Возможно в документе существует два листа с названием "{0}"!n",SheetName), ex);
                }

                if (sheet == null)
                {
                    throw new Exception(String.Format("В шаблоне не найден "{0}"!n",SheetName));
                }

                var worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheet.Id.Value);
                var sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();

                var rowsForRemove = new List<Row>();
                var fields = new List<Field>();
                foreach (var row in worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements<Row>())
                {
                    var celsForRemove = new List<Cell>();
                    foreach (var cell in row.Descendants<Cell>())
                    {
                        if (cell == null)
                        {
                            continue;
                        }

                        var value = GetCellValue(cell, document.WorkbookPart);
                        if (value.IndexOf("DataField:", StringComparison.Ordinal) != -1)
                        {
                            if (!firsIndexFlag)
                            {
                                firsIndexFlag = true;
                                rowTemplate = row;
                            }
                            fields.Add(new Field(Convert.ToUInt32(Regex.Replace(cell.CellReference.Value, @"[^d]+", ""))
                                , new string(cell.CellReference.Value.ToCharArray().Where(p => !char.IsDigit(p)).ToArray())
                                , value.Replace("DataField:", "")));

                        }

                        if (value.IndexOf("Label:", StringComparison.Ordinal) != -1 && rowTemplate == null)
                        {
                            var labelName = value.Replace("Label:", "").Trim();
                            if (!hashtable.ContainsKey(labelName))
                            {
                                throw new Exception(String.Format("Нет такого лэйбла "{0}"", labelName));
                            }
                            cell.CellValue = new CellValue(hashtable[labelName].ToString());
                            cell.DataType = new EnumValue<CellValues>(CellValues.String);

                        }

                        if (rowTemplate == null || row.RowIndex <= rowTemplate.RowIndex || String.IsNullOrWhiteSpace(value))
                        {
                            continue;
                        }
                        var item = footer.SingleOrDefault(p => p._Row.RowIndex == row.RowIndex);
                        if (item == null)
                        {
                            footer.Add(new Footer(row, cell, value.IndexOf("Label:", StringComparison.Ordinal) != -1 ? hashtable[value.Replace("Label:", "").Trim()].ToString() : value));
                        }
                        else
                        {
                            item.AddMoreCell(cell, value.IndexOf("Label:", StringComparison.Ordinal) != -1 ? hashtable[value.Replace("Label:", "").Trim()].ToString() : value);
                        }
                        celsForRemove.Add(cell);
                    }

                    foreach (var cell in celsForRemove)
                    {
                        cell.Remove();
                    }

                    if (rowTemplate != null && row.RowIndex != rowTemplate.RowIndex)
                    {
                        rowsForRemove.Add(row);
                    }
                }

                if (rowTemplate == null || rowTemplate.RowIndex == null || rowTemplate.RowIndex < 0)
                {
                    throw new Exception("Не удалось найти ни одного поля, для заполнения!");
                }

                foreach (var row in rowsForRemove)
                {
                    row.Remove();
                }

                var index = rowTemplate.RowIndex;
                foreach (var row in from System.Data.DataRow item in dataTable.Rows select CreateRow(rowTemplate, index, item, fields))
                {
                    sheetData.InsertBefore(row, rowTemplate);
                    index++;
                }

                foreach (var newRow in footer.Select(item => CreateLabel(item, (UInt32)dataTable.Rows.Count)))
                {
                    sheetData.InsertBefore(newRow, rowTemplate);
                }

                rowTemplate.Remove();
            }
        }

        private Row CreateLabel(Footer item, uint count)
        {
            var row = item._Row;
            row.RowIndex = new UInt32Value(item._Row.RowIndex + (count - 1));
            foreach (var cell in item.Cells)
            {
                cell._Cell.CellReference = new StringValue(cell._Cell.CellReference.Value.Replace(Regex.Replace(cell._Cell.CellReference.Value, @"[^d]+", ""), row.RowIndex.ToString()));
                cell._Cell.CellValue = new CellValue(cell.Value);
                cell._Cell.DataType = new EnumValue<CellValues>(CellValues.String);
                row.Append(cell._Cell);
            }
            return row;
        }

        private Row CreateRow(Row rowTemplate, uint index, System.Data.DataRow item, List<Field> fields)
        {
            var newRow = (Row)rowTemplate.Clone();
            newRow.RowIndex = new UInt32Value(index);

            foreach (var cell in newRow.Elements<Cell>())
            {
                cell.CellReference = new StringValue(cell.CellReference.Value.Replace(Regex.Replace(cell.CellReference.Value, @"[^d]+", ""), index.ToString(CultureInfo.InvariantCulture)));
                foreach (var fil in fields.Where(fil => cell.CellReference == fil.Column + index))
                {
                    cell.CellValue = new CellValue(item[fil._Field].ToString());
                    cell.DataType = new EnumValue<CellValues>(CellValues.String);
                }
            }
            return newRow;
        }


        private string GetCellValue(Cell cell, WorkbookPart wbPart)
        {
            var value = cell.InnerText;

            if (cell.DataType == null)
            {
                return value;
            }
            switch (cell.DataType.Value)
            {
                case CellValues.SharedString:

                    var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();

                    if (stringTable != null)
                    {
                        value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
                    }
                    break;
            }

            return value;
        }

        private void OpenFile(string filePath)
        {
            if (!File.Exists(filePath))
            {
                throw new Exception(String.Format("Не удалось найти файл "{0}"!", filePath));
            }

            var process = Process.Start(filePath);
            if (process != null)
            {
                process.WaitForExit();
            }
        }
    }
}

2) Footer – будет содержать строки и их ячейки идущие после наших данных.

класс Footer

using System;
using System.Collections.Generic;
using DocumentFormat.OpenXml.Spreadsheet;
namespace Framework.Create
{
    public class Footer
    {
        /// <summary>
        /// строка
        /// </summary>
        public Row _Row { get; private set; }
        /// <summary>
        /// ячейки данной строки
        /// </summary>
        public List<CellForFooter> Cells { get; private set; }

        public Footer(Row row, Cell cell, String cellValue)
        {
            _Row = new Row((Row)row.Clone()) { RowIndex = row.RowIndex };
            var _Cell = (Cell)cell.Clone();
            _Cell.CellReference = cell.CellReference;
            Cells = new List<CellForFooter> { new CellForFooter(_Cell, cellValue) };
        }

        public void AddMoreCell(Cell cell, String cellValue)
        {
            var _Cell = (Cell)cell.Clone();
            _Cell.CellReference = cell.CellReference;
            Cells.Add(new CellForFooter(_Cell, cellValue));
        }
    }
}

3) CellForFooter – содержит в себе координаты ячейки и её значение, используется в Footer-е.

класс CellForFooter

using System;
using DocumentFormat.OpenXml.Spreadsheet;
namespace Framework.Create
{
    public class CellForFooter
    {
        /// <summary>
        /// ячейка
        /// </summary>
        public Cell _Cell { get; private set; }
        /// <summary>
        /// значение
        /// </summary>
        public String Value { get; private set; }

        public CellForFooter(Cell cell, String value)
        {
            _Cell = cell;
            Value = value;
        }
    }
}

4) Field – будет содержать индекс строки, где находится DataField, координаты ячеек с DataField и название поля, значение которого надо вывести.

класс Field

using System;
namespace Framework.Create
{
    public class Field
    {
        /// <summary>
        /// Индекс строки
        /// </summary>
        public uint Row { get; private set; }
        /// <summary>
        /// координаты колонки
        /// </summary>
        public String Column { get; private set; }
        /// <summary>
        /// название колонки, выводимых данных
        /// </summary>
        public String _Field { get; private set; }

        public Field(uint row, String column, String field)
        {
            Row = row;
            Column = column;
            _Field = field;
        }
    }
}

В папке “Load” создаём 2 класса.
1) Worker – это будет наш главный обработчик.

класс Load.Worker

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
namespace Framework.Load
{
    /// <summary>
    /// Загрузка данных из Excel
    /// </summary>
    public class Worker
    {
        /// <summary>
        /// имя листа (откуда будем читать данные) 
        /// </summary>
        private const String SheetName = "Лист1";

        /// <summary>
        /// Подавать только файлы в формате .xlsx
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public System.Data.DataTable ReadFile(String path)
        {
            CheckFile(path);
            return OpenDocumentForRead(path);
        }

        private System.Data.DataTable OpenDocumentForRead(string path)
        {
            System.Data.DataTable data = null;
            using (var document = SpreadsheetDocument.Open(path, false))
            {
                Sheet sheet;
                try
                {
                    sheet = document.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>().SingleOrDefault(s => s.Name == SheetName);
                }
                catch (Exception ex)
                {
                    throw new Exception(String.Format("Возможно в документе существует два листа с названием "{0}"!n", SheetName), ex);
                }

                if (sheet == null)
                {
                    throw new Exception(String.Format("В файле не найден "{0}"!n", SheetName));
                }

                var relationshipId = sheet.Id.Value;
                var worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(relationshipId);
                var sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();

                var firstRow = true;
                var columsNames = new List<ColumnName>();
                foreach (Row row in sheetData.Elements<Row>())
                {
                    if (firstRow)
                    {
                        columsNames.AddRange(GetNames(row, document.WorkbookPart));
                        data = GetTable(columsNames);
                        firstRow = false;
                        continue;
                    }

                    var item = data.NewRow();
                    foreach (var line in columsNames)
                    {
                        var coordinates = String.Format("{0}{1}", line.Liter, row.RowIndex);
                        var cc = row.Elements<Cell>().SingleOrDefault(p => p.CellReference == coordinates);
                        if (cc == null)
                        {
                            throw new Exception(String.Format("Не удалось найти ячейку "{0}"!", coordinates));
                        }
                        item[line.Name.Trim()] = GetVal(cc, document.WorkbookPart);

                    }
                    data.Rows.Add(item);
                }
            }

            return data;
        }

        private System.Data.DataTable GetTable(IEnumerable<ColumnName> columsNames)
        {
            var teb = new System.Data.DataTable("ExelTable");

            foreach (var col in columsNames.Select(columnName => new System.Data.DataColumn { DataType = typeof(String), ColumnName = columnName.Name.Trim() }))
            {
                teb.Columns.Add(col);
            }

            return teb;
        }

        private IEnumerable<ColumnName> GetNames(Row row, WorkbookPart wbPart)
        {
            return (from cell in row.Elements<Cell>()
                    where cell != null
                    let
                        text = GetVal(cell, wbPart)
                    where !String.IsNullOrWhiteSpace(text)
                    select
                    new ColumnName(text, Regex.Replace(cell.CellReference.Value, @"[-9]", ""))).ToList();
        }

        private string GetVal(Cell cell, WorkbookPart wbPart)
        {
            string value = cell.InnerText;

            if (cell.DataType == null)
            {
                return value;
            }
            switch (cell.DataType.Value)
            {
                case CellValues.SharedString:

                    var stringTable =
                        wbPart.GetPartsOfType<SharedStringTablePart>()
                            .FirstOrDefault();

                    if (stringTable != null)
                    {
                        value =
                            stringTable.SharedStringTable
                                .ElementAt(int.Parse(value)).InnerText;
                    }
                    break;
            }

            return value;
        }

        private void CheckFile(String path)
        {
            if (String.IsNullOrWhiteSpace(path) || !File.Exists(path))
            {
                throw new Exception(String.Format("Такого файла "{0}", не существует!", path));
            }
        }
    }
}

2) ColumnName – будет название колонки, для загружаемых данных.

класс ColumnName

using System;
namespace Framework.Load
{
    public class ColumnName
    {
        /// <summary>
        /// название колонки, для загружаемых данных
        /// </summary>
        public String Name { get; private set; }
        /// <summary>
        /// буква колонки
        /// </summary>
        public String Liter { get; private set; }

        public ColumnName(string name, string liter)
        {
            Name = name;
            Liter = liter;
        }
    }
}

В проекте “Interfaces” создадим интерфейс наших данных IDataForTest.

интерфейс IDataForTest

using System;
namespace Interfaces
{
    public interface IDataForTest
    {
        String A { get; }
        String B { get; }
        String C { get; }
    }
}

В проекте “Converter” создадим класс
ConvertToDataTable – для конвертирования наших данных в DataTable.

класс ConvertToDataTable

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using Interfaces;
namespace Converter
{
    public class ConvertToDataTable
    {
        public DataTable ExcelTableLines(IEnumerable<IDataForTest> lines)
        {
            var dt = CreateTable();
            foreach (var line in lines)
            {
                var row = dt.NewRow();
                row["AAA"] = line.A;
                row["BBB"] = line.B;
                row["CCC"] = line.C;
                dt.Rows.Add(row);
            }
            return dt;
        }

        public Hashtable ExcelTableHeader(Int32 count)
        {
            var head = new Dictionary<String, String> { { "Date", DateTime.Today.Date.ToShortDateString() }, { "Count", count.ToString() } };
            return new Hashtable(head);
        }

        private DataTable CreateTable()
        {
            var dt = new DataTable("ExelTable");
            var col = new DataColumn { DataType = typeof(String), ColumnName = "AAA" };
            dt.Columns.Add(col);
            col = new DataColumn { DataType = typeof(String), ColumnName = "BBB" };
            dt.Columns.Add(col);
            col = new DataColumn { DataType = typeof(String), ColumnName = "CCC" };
            dt.Columns.Add(col);
            return dt;
        }
    }
}

В проекте “OpenXmlPrj”
Будет класс для выполнения программы “Program”.

класс Program

using System;
using System.Collections.Generic;
using System.Data;
namespace OpenXmlPrj
{
    class Program
    {
        static void Main(string[] args)
        {
            //заполняем тестовыми данными
            var myData = new List<DataForTest>
            {
                new DataForTest("a1","b1","c1"),
                new DataForTest("a2","b2","c2"),
                new DataForTest("a3","b3","c3"),
                new DataForTest("a4","b4","c4"),
                new DataForTest("a5","b5","c5")
            };

            var ex = new Converter.ConvertToDataTable();
            //ex.ExcelTableLines(myData) - конвертируем наши данные в DataTable
            //ex.ExcelTableHeader(myData.Count) - формируем данные для Label
            //template - указываем название нашего файла  - шаблона
            new Framework.Create.Worker().Export(ex.ExcelTableLines(myData), ex.ExcelTableHeader(myData.Count), "template");

            Console.WriteLine("Excel File Has Created!nFor Read Data From Excel, press any key!");
            Console.ReadKey();
            //"C:\Loading\ReadMePlease.xlsx" - путь к файлу, с которого будем считывать данные (возвращяет нам DataTable)
            var dt = new Framework.Load.Worker().ReadFile("C:\Loading\ReadMePlease.xlsx");
            var myDataFromExcel = new List<DataForTest>();
            //Заполняем наш объект, считанными данными из DataTable
            foreach (DataRow item in dt.Rows)
            {
                myDataFromExcel.Add(new DataForTest(item));
            }

            Console.WriteLine("---------- Data ---------------------");
            //Выводим считанные данные
            foreach (var line in myDataFromExcel)
            {
                Console.WriteLine("{0} | {1} | {2}", line.A, line.B, line.C);
            }

            Console.WriteLine("Done. Press any key, for exit!");
            Console.ReadKey();
        }
    }
}

И класс для наших данных “DataForTest”.

класс DataForTest

using System;
using System.Data;
using Interfaces;
namespace OpenXmlPrj
{
    public class DataForTest : IDataForTest
    {
        public String A { get; private set; }
        public String B { get; private set; }
        public String C { get; private set; }

        public DataForTest(String a, String b, String c)
        {
            A = a;
            B = b;
            C = c;
        }

        public DataForTest(DataRow item)
        {
            A = item["MyFieldA"].ToString();
            B = item["MyFieldB"].ToString();
            C = item["MyFieldC"].ToString();
        }
    }
}

И проекте “OpenXmlPrj” надо подключить ссылки на следующие проекты: Interfaces, Framework, Converter
Условия для создания шаблона:
1. Excel лист, обязательно должен называться “Лист1” (ну или если захотите переименовать, то в коде надо будет изменить название тоже).
2. Названия после DataField: должны строго совпадать с названиями колонок в DataTable.
3. Шаблон должен быть сохранён в формате “.xlsx”.
Условия для файла, с которого мы будем считывать данные:
1. Excel лист, обязательно должен называться “Лист1” (ну или если захотите переименовать, то в коде надо будет изменить название тоже).
2. Первая строка, должна содержать названия колонок, по которым мы потом будем парсить данные.

Ссылка на исходник, в GitHub-е.

  • Download StudentExcelFile.zip 
  • Download OpenXMLExcel.zip 

Introduction 

This article presents an example on how to read and write Microsoft Excel with Open XML SDK. 

Background       

In the Information Technology, it is very common that the users will give us the following requests: 

  • Given some data in the database or any other data storage, you will be asked to create an Excel file with the data and present the Excel file to the users;
  • Given an Excel file, you will be asked to read the data and process it in your program. 

The article will show you an example to read from and write to Microsoft Excel files with the Open XML SDK. The example is a MVC 2 web application written in Visual Studio 2010. To keep things simple, the example only reads the first sheet of the Excel files, and the Excel files created by the example also have only a single sheet.  

 Image 1

I am well aware that the current version of the ASP.Net MVC is 4. I am also aware that not all the people are using the most recent version. The purpose to keep the example application in a lower version MVC and Visual Studio 2010 is to make the readers easier to download and run the example, because a lot of the readers do not have the most recent version of the Visual Studio. 

  • The «ControllersHomeController.cs» is the application’s controller; 
  • The «ViewsHomeIndex.aspx» is the application’s view;
  • The 3 files in the «SLExcelUtility» folder implements the data and utility classes to read from and write to the Excel files.

You can download the complete Open XML SDK from here. The attached Visual Studio solution comes with the core SDK «DocumentFormat.OpenXml.dll», so you can simply download the attached solution and open it in your Visual Studio and compile to run the example application. 

The Example Excel File  

The following picture shows the example Excel file attached in this article, which has the information of 1000 randomly generated students.  

 Image 2

The purpose of the example web application is to allow users to upload the Excel file to the web server. When the Excel file is uploaded, the application will read the data in the file and save the data in the web session. The web application then shows the users a hyperlink. If the users click on the link, the web application will use the data in the session to recreate an Excel file and download it back to the user. So this example web application shows you both reading from and writing to Excel files.   

The Excel Utility Classes    

Image 3

The «SLExcelUtilitySLExcelData.cs» file implements the data class to keep the data in the Excel file. 

using System.Collections.Generic;
using DocumentFormat.OpenXml.Spreadsheet;
	
namespace OpenXMLExcel.SLExcelUtility
{
    public class SLExcelStatus
    {
        public string Message { get; set; }
        public bool Success
        {
            get { return string.IsNullOrWhiteSpace(Message); }
        }
    }
	
    public class SLExcelData
    {
        public SLExcelStatus Status { get; set; }
        public Columns ColumnConfigurations { get; set; }
        public List<string> Headers { get; set; }
        public List<List<string>> DataRows { get; set; }
        public string SheetName { get; set; }
	
        public SLExcelData()
        {
            Status = new SLExcelStatus();
            Headers = new List<string>();
            DataRows = new List<List<string>>();
        }
    }
} 

The «SLExcelData» class is used to store the data read from the Excel file. 

  • The «Status» property keeps any possible errors when reading the Excel file;
  • The «Headers» property keeps the data in the first row of the Excel sheet; 
  • The «DataRows» property keeps the data for the rest of the rows of the Excel sheet;
  • The «SheetName» property keeps the name of the Excel sheet;
  • The «ColumnConfigurations» property keeps the configuration information of the columns in the Excel sheet. 

The «SLExcelUtilitySLExcelReader.cs» implements the class to read the Excel file.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
	
namespace OpenXMLExcel.SLExcelUtility
{
    public class SLExcelReader
    {
        private string GetColumnName(string cellReference)
        {
            var regex = new Regex("[A-Za-z]+");
            var match = regex.Match(cellReference);
	
            return match.Value;
        }
	
        private int ConvertColumnNameToNumber(string columnName)
        {
            var alpha = new Regex("^[A-Z]+$");
            if (!alpha.IsMatch(columnName)) throw new ArgumentException();
	
            char[] colLetters = columnName.ToCharArray();
            Array.Reverse(colLetters);
	
            var convertedValue = 0;
            for (int i = 0; i < colLetters.Length; i++)
            {
                char letter = colLetters[i];
                
                int current = i == 0 ? letter - 65 : letter - 64;
                convertedValue += current * (int)Math.Pow(26, i);
            }
	
            return convertedValue;
        }
	
        private IEnumerator<Cell> GetExcelCellEnumerator(Row row)
        {
            int currentCount = 0;
            foreach (Cell cell in row.Descendants<Cell>())
            {
                string columnName = GetColumnName(cell.CellReference);
	
                int currentColumnIndex = ConvertColumnNameToNumber(columnName);
	
                for (; currentCount < currentColumnIndex; currentCount++)
                {
                    var emptycell = new Cell()
                    {
                        DataType = null, CellValue = new CellValue(string.Empty)
                    };
                    yield return emptycell;
                }
	
                yield return cell;
                currentCount++;
            }
        }
	
        private string ReadExcelCell(Cell cell, WorkbookPart workbookPart)
        {
            var cellValue = cell.CellValue;
            var text = (cellValue == null) ? cell.InnerText : cellValue.Text;
            if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
            {
                text = workbookPart.SharedStringTablePart.SharedStringTable
                    .Elements<SharedStringItem>().ElementAt(
                        Convert.ToInt32(cell.CellValue.Text)).InnerText;
            }
	
            return (text ?? string.Empty).Trim();
        }
	
        public SLExcelData ReadExcel(HttpPostedFileBase file)
        {
            var data = new SLExcelData();
	
            
            if (file.ContentLength <= 0)
            {
                data.Status.Message = "You uploaded an empty file";
                return data;
            }
	
            if (file.ContentType 
                != "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
            {
                data.Status.Message
                    = "Please upload a valid excel file of version 2007 and above";
                return data;
            }
	
            
            WorkbookPart workbookPart; List<Row> rows;
            try
            {
                var document = SpreadsheetDocument.Open(file.InputStream, false);
                workbookPart = document.WorkbookPart;
	
                var sheets = workbookPart.Workbook.Descendants<Sheet>();
                var sheet = sheets.First();
                data.SheetName = sheet.Name;
	
                var workSheet = ((WorksheetPart)workbookPart
                    .GetPartById(sheet.Id)).Worksheet;
                var columns = workSheet.Descendants<Columns>().FirstOrDefault();
                data.ColumnConfigurations = columns;
	
                var sheetData = workSheet.Elements<SheetData>().First();
                rows = sheetData.Elements<Row>().ToList();
            }
            catch (Exception e)
            {
                data.Status.Message = "Unable to open the file";
                return data;
            }
	
            
            if (rows.Count > 0)
            {
                var row = rows[0];
                var cellEnumerator = GetExcelCellEnumerator(row);
                while (cellEnumerator.MoveNext())
                {
                    var cell = cellEnumerator.Current;
                    var text = ReadExcelCell(cell, workbookPart).Trim();
                    data.Headers.Add(text);
                }
            }
	
            
            if (rows.Count > 1)
            {
                for (var i = 1; i < rows.Count; i++)
                {
                    var dataRow = new List<string>();
                    data.DataRows.Add(dataRow);
                    var row = rows[i];
                    var cellEnumerator = GetExcelCellEnumerator(row);
                    while (cellEnumerator.MoveNext())
                    {
                        var cell = cellEnumerator.Current;
                        var text = ReadExcelCell(cell, workbookPart).Trim();
                        dataRow.Add(text);
                    }
                }
            }
	
            return data;
        }
    }
} 

The «ReadExcel» method takes the Excel file as input and returns an object of the «SLExcelData» class. If the read is successful, the returned «SLExcelData» object will have the data in the Excel sheet. You may pay some attention on the two private methods. 

  • The «ReadExcelCell» method read the data in an Excel cell. When the cell is a «SharedString», we will need to get the data from a shared location; 
  • The «GetExcelCellEnumerator» method turns the Excel row into an Enumerator. The reason why we need this enumerator is that when an Excel cell is empty, the cell simply does not exist in the Open XML «Row».  

The «SLExcelWriter.cs» class implements the class to create an Excel file from a «SLExcelData» object. 

using System;
using System.IO;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
	
namespace OpenXMLExcel.SLExcelUtility
{
    public class SLExcelWriter
    {
        private string ColumnLetter(int intCol)
        {
            var intFirstLetter = ((intCol) / 676) + 64;
            var intSecondLetter = ((intCol % 676) / 26) + 64;
            var intThirdLetter = (intCol % 26) + 65;
	
            var firstLetter = (intFirstLetter > 64)
                ? (char)intFirstLetter : ' ';
            var secondLetter = (intSecondLetter > 64)
                ? (char)intSecondLetter : ' ';
            var thirdLetter = (char)intThirdLetter;
	
            return string.Concat(firstLetter, secondLetter,
                thirdLetter).Trim();
        }
	
        private Cell CreateTextCell(string header, UInt32 index,
            string text)
        {
            var cell = new Cell
            {
                DataType = CellValues.InlineString,
                CellReference = header + index
            };
	
            var istring = new InlineString();
            var t = new Text { Text = text };
            istring.AppendChild(t);
            cell.AppendChild(istring);
            return cell;
        }
	
        public byte[] GenerateExcel(SLExcelData data)
        {
            var stream = new MemoryStream();
            var document = SpreadsheetDocument
                .Create(stream, SpreadsheetDocumentType.Workbook);
	
            var workbookpart = document.AddWorkbookPart();
            workbookpart.Workbook = new Workbook();
            var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
            var sheetData = new SheetData();
	
            worksheetPart.Worksheet = new Worksheet(sheetData);
	
            var sheets = document.WorkbookPart.Workbook.
                AppendChild<Sheets>(new Sheets());
	
            var sheet = new Sheet() { Id = document.WorkbookPart
                .GetIdOfPart(worksheetPart),
                SheetId = 1, Name = data.SheetName??"Sheet 1" };
            sheets.AppendChild(sheet);
	
            
            UInt32 rowIdex = 0;
            var row = new Row { RowIndex = ++rowIdex };
            sheetData.AppendChild(row);
            var cellIdex = 0;
	
            foreach (var header in data.Headers)
            {
                row.AppendChild(CreateTextCell(ColumnLetter(cellIdex++),
                    rowIdex, header??string.Empty));
            }
            if (data.Headers.Count > 0)
            {
                
                if (data.ColumnConfigurations != null)
                {
                    var columns = (Columns)data.ColumnConfigurations.Clone();
                    worksheetPart.Worksheet
                        .InsertAfter(columns, worksheetPart
                        .Worksheet.SheetFormatProperties);
                }
            }
	
            
            foreach (var rowData in data.DataRows)
            {
                cellIdex = 0;
                row = new Row { RowIndex = ++rowIdex };
                sheetData.AppendChild(row);
                foreach (var callData in rowData)
                {
                    var cell = CreateTextCell(ColumnLetter(cellIdex++),
                        rowIdex, callData??string.Empty);
                    row.AppendChild(cell);
                }
            }
	
            workbookpart.Workbook.Save();
            document.Close();
	
            return stream.ToArray();
        }
    }
} 

The «GenerateExcel» method takes an object of type «SLExcelData» and put the data into an Excel sheet. The Excel file is returned in the form of a byte array. 

The MVC Application  

Built upon the Excel utility classes, the MVC application is pretty simple. 

Image 4 

The «ControllersHomeController.cs» is implemented as the following:  

using System.Web;
using System.Web.Mvc;
using OpenXMLExcel.SLExcelUtility;
	
namespace OpenXMLExcel.Controllers
{
    public class HomeController : Controller
    {
        private const string SessionExcelData = "SessionExcelData";
	
        public ActionResult Index()
        {
            return View();
        }
	
        public ActionResult UploadFile(HttpPostedFileBase excelFile)
        {
            var data = (new SLExcelReader()).ReadExcel(excelFile);
            Session[SessionExcelData] = data;
	
            return View("Index", data.Status);
        }
	
        public ActionResult DownloadFile()
        {
            var data = (SLExcelData) Session[SessionExcelData];
            if (data == null)
            {
                ViewData["RedirectUrl"] = Url.Action("Index");
                return View("SessionExpired");
            }
	
            var file = (new SLExcelWriter()).GenerateExcel(data);
            Response.AddHeader("Content-Disposition",
                "attachment; filename=ExcelFile.xlsx");
            return new FileContentResult(file,
                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        }
    }
}  
  • The action method «Index» loads the view page;
  • The action method «UploadFile» uses the «SLExcelReader» class to read the uploaded Excel file and keeps the «SLExcelData» object in the web session; 
  • The action method «DownloadFile» uses the «SLExcelWriter» to create an Excel file based on the «SLExcelData» object in the web session.  

The «ViewsHomeIndex.aspx» file is implemented as the following: 

<%@ Page Language="C#"
    Inherits="System.Web.Mvc.ViewPage<OpenXMLExcel.SLExcelUtility.SLExcelStatus>" %>
	
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
	
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Upload & Download Excel Example</title>
    <link href="<%=Url.Content("~/Content/AppStyle.css") %>" rel="stylesheet"
        type="text/css" />
    <script type="text/javascript"
        src="<%=Url.Content("~/Scripts/jquery-2.0.3.min.js") %>"></script>
    <script type="text/javascript"
        src="<%=Url.Content("~/Scripts/OpenXMLExcelAppScript.js") %>"></script>
</head>
<body>
<form action="<%=Url.Action("UploadFile") %>"
    enctype="multipart/form-data" method="post">
    <div style="margin: 10px">
        <%if (Model != null)
          {%>
            <p>
                <%if (Model.Success)
                  {%>
                    <a href="<%= Url.Action("DownloadFile") %>">
                        Excel file is uploaded successfully, let us download it back
                    </a>
                <% }
                  else
                  {%>
                    <label class="errorMsg"><%=Model.Message %></label>
                <% } %>
            </p>
        <% } %>
        <p>
            <button type="button" id="btnSubmit">Submit</button>
            <input type="file" name="excelFile"/>
        </p>
    </div>
</form>
</body>
</html>  

The JavaScript code used by the view page is the following: 

$(document).ready(function () {
    $('#btnSubmit').click(function () {
        var fileName = $('[name="excelFile"]').val().trim();
        var pos = fileName.lastIndexOf('.');
        var extension = (pos <= 0) ? '' : fileName.substring(pos);
        if (extension != '.xlsx') {
            alert('Please browse a correct excel file to upload');
            return;
        }
        $('form').submit();
    });
}); 

Run the Application  

We now finish this simple example application, we can then test run it. When the web application first launches, it show us the buttons to allow use to browse the Excel file and upload it to the server. 

Image 5 

We can then choose the attached Excel file in this article and upload it. When the upload succeeds, we will have a download link. 

Image 6 

If we click on the download link, an Excel file is generated by the data in the file that we just uploaded. 

Image 7 

We can open this file and compare with the file that we just uploaded. We should see that the two Excel files have the same data. You do not have to upload the Excel file comes with this article, you can actually upload any Excel file and see how the program works. You should keep in the following in mind though,

  • The Excel utility classes in the article only process the first sheet of the Excel file. If you have more than 1 sheet, it only reads the first sheet and the generated Excel has only the data of the first sheet of the Excel file uploaded.  
  • The Excel utility classes only process the data in the Excel files. If you have a fancy Excel sheet that has a lot of beautiful formatting and pictures, they are not processed by the utility classes.  

Points of Interest  

  • This article presents an example on how to read and write Microsoft Excel with Open XML SDK.
  • The Excel utility classes in the article only process the first sheet of the Excel file. If you have more than 1 sheet, it only reads the first sheet and the generated Excel has only the data of the first sheet of the Excel file uploaded. If you need to handle multiple sheets, you can easily extend these classes to do it. 
  • The Excel utility classes only process the data in the Excel files. If you have a fancy Excel sheet that has a lot of beautiful formatting and pictures, they are not processed by the utility classes.  
  • You do not need to use the Excel file attached in this article to test the application, you can choose any excel file to see how it works.
  • I have tested this example multiple times, but my own test is really limited. If you find any problems when you test it, please do not hesitate to let me know. I will make my effort to make it to work better, if I have some time to spare. 
  • I hope you like my postings and I hope this article can help you one way or the other.  

History 

First Revision — 10/18/2013.

I have been working in the IT industry for some time. It is still exciting and I am still learning. I am a happy and honest person, and I want to be your friend.

Исходный адрес:Как работать с документами в формате Office Open XML (очередь)

Резюме: Office Open XMLформатЭтот файл заменяет предыдущий двоичный системный файл Office. этоДокументацияПознакомлю вас с компонентами, содержащимися в отформатированном документе, и некоторыми сценариями, демонстрирующими функции этих файлов.

Фрэнк Райс, Microsoft Corporation

Применимо к: Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007, Microsoft Office Word 2007

скачать2007OfficeManipulatingOpenXMLFilesSample.exe.

*

Содержание этой страницы
 Обзор
 Office Open XML Создание файла в формате Office Open XML
 Office Open XML Обзор файлов формата Office Open XML
 Office Open XML Редактировать документы, созданные в формате Office Open XML, вручную
 <a href='http://www.javaxxz.com/thread-286706-1-1.html'> </a>Office Open XML Работа с документами в формате Office Open XML с помощью программирования
 в заключении
 Дополнительные ресурсы

Обзор

В более ранних версиях Microsoft Office файлы, созданные в Microsoft Office Excel, Microsoft Office PowerPoint и Microsoft Office Word, сохранялись в уникальном едином файловом формате и назывались двоичными файлами. Выпуск Microsoft Office System 2007 представил новый формат файлов для Microsoft Office Excel 2007, Microsoft Office PowerPoint 2007 и Microsoft Office Word 2007: формат Office Open XML.

Формат Office Open XML основан на технологии архивов XML и ZIP. Как и в более ранних версиях Microsoft Office, документы 2007 хранятся в одном файле или контейнере, поэтому процесс управления этими документами по-прежнему прост. Однако, в отличие от более ранних файлов, файлы в формате Office Open XML могут открываться компонентами на дисплее, что позволяет получить доступ к структуре этого файла.

В этой статье вы можете вручную открыть файл и просмотреть каждую часть документа, чтобы просмотреть файл формата Office Open XML. Кроме того, вы также можете запрограммировать этот документ. Файлы, применимые в этой статье, можно получить, загрузив,2007OfficeManipulatingOpenXMLFilesSample.exe.Если вы не можете загрузить, вы можете вместо этого использовать свои собственные программные файлы и файлы изображений.

Создание файла в формате Office Open XML

В этом разделе вы обнаружите формат файла XML образца документа Word 2007, содержащего текст, изображения и атрибуты.

вWordСоздать вOffice Open XML Форматировать документ

1.

Запустите Word 2007.

2.

В новый документ вставьте следующий текст:

Soaring with the American Bald Eagle

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nulla rutrum. Phasellus feugiat bibendum urna. Aliquam lacinia diam ac felis. In vulputate semper orci. Quisque blandit. Mauris et nibh. Aenean nulla. Mauris placerat tempor libero.

Pellentesque bibendum. In consequat, sem molestie iaculis venenatis, orci nunc imperdiet justo, id ultricies ligula elit sit amet ante. Sed quis sem. Ut accumsan nulla vel nisi. Ut nulla enim, ullamcorper vel, semper vitae, vulputate vel, mi. Duis id magna a magna commodo interdum.

3.

Выделите «Парящий с американским белоголовым орлом», а затем на начальной вкладке в группе стилей установите стиль заголовка.

4.

Далее вставляем картинку в документ:

1.

Поместите указатель мыши в конец первого абзаца и нажмите Enter, чтобы вставить новую строку.

2.

Затем щелкните вкладку «Вставка», щелкните изображение, найдите файл изображения (например, файл Eagle1.gif, включенный в загрузку) и щелкните «Вставить».

5.

Теперь добавьте свойство документа:

1.

Нажмите кнопку Microsoft Office, выберите «Подготовка» и нажмите «Свойства».

2.

На панели свойств документа добавьте имя автора, заголовок, тему и примечания, как показано ниже:

стол1.Настройки свойств документа

Атрибуты описание

Автор

Nancy Davolio

заглавие

Soaring with the American Bald Eagle

тема

Bald Eagles

Замечания

A study of the bald eagle

6.

Затем добавьте комментарии к документу

1.

На вкладке «Обзор» нажмите «Новый комментарий».

2.

В поле для комментариев введите Это мой комментарий. Ваш документ теперь выглядит как на Рисунке 1.

.

Рисунок1. примерOffice Word 2007 Документация

7.

Далее сохраняем документ:

1.

Щелкните кнопку Microsoft Office, а затем щелкните Сохранить как.

2.

В списке Тип файла «Сохранить как» выберите Документ Word (* .docx), а затем введите SampleWordDocument.docx в поле имени файла.

3.

Нажмите «Сохранить».

8.

Закройте Word.

Обзор файлов формата Office Open XML

В этом разделе вы просмотрите только что созданный образец документа.

Просмотр документов в формате Office Open XML

1.

Откройте проводник Windows.

2.

Найдите файл SampleWordDocument.docx, щелкните его правой кнопкой мыши и выберите «Переименовать».

важный:

Выполните следующие три шага, чтобы извлечь файлы формата Office Open XML. В зависимости от используемой операционной системы (Windows XP или Windows Vista) шаг 5 отличается.

3.

Добавьте расширение .zip после имени файла, и теперь имя файла станет SampleWordDocument.docx.zip.

4.

Когда появится предупреждающее сообщение, нажмите ОК.

5.

Распакуйте файл-контейнер:

1.

(Если вы используете Windows XP :) Щелкните правой кнопкой мыши файл SampleWordDocument.docx.zip, выберите Открыть с помощью и щелкните Сжатые (заархивированные) папки. Папки и части, составляющие документ, теперь будут отображаться в проводнике.

2.

(Если вы используете Windows Vista :) Щелкните правой кнопкой мыши файл SampleWordDocument.docx.zip и выберите «Извлечь все». В диалоговом окне «Извлечь сжатые (заархивированные) папки» примите расположение по умолчанию или выберите новое расположение, а затем нажмите «Извлечь». Папки и части, составляющие документ, теперь будут отображаться в проводнике.

На следующих шагах вы определите ключевые компоненты, включенные в документ.

6.

Проверьте часть [Content_Types] .xml:

1.

С помощью проводника Windows найдите файл с именем [Content_Types] .xml.

2.

Щелкните файл правой кнопкой мыши, выберите Открыть с помощью, а затем щелкните Internet Explorer. В корне каждого документа в формате Office Open XML находится компонент [Content_Types] .xml. Роль компонента [Content_Types] .xml состоит в том, чтобы определять каждый компонент уникального типа в документе. Каждому компоненту необходимо указать свой тип в этом компоненте. Компонент должен иметь распознаваемый тип, чтобы приложение знало, когда документ отображается.как этоИспользуйте этот компонент. Типы также могут помочь вам понять, что делает компонент и как его использовать.

3.

Закройте файл.

7.

Проверьте папку .rels:

Ассоциация представляет собой связь между двумя компонентами. Ассоциации — это компоненты, хранящиеся в подпапке _rels. Любой компонент имеет связанный компонент, который содержится в папке _rels той же структуры.Эта папка содержит компонент .rels, который определяет их взаимосвязь. Подпапки создаются в той же папке, что и компонент. Соответствующее имя получается путем добавления расширения .rels к имени файла исходного компонента (связанный компонент, используемый для файлов документов, является исключением; его имя — «.rels»).

1.

В проводнике Windows дважды щелкните папку _rels, а затем щелкните правой кнопкой мыши файл .rels.

2.

Наведите указатель на «Метод открытия», нажмите «Выбрать программу», нажмите «Internet Explorer» и нажмите «ОК».

3.

После завершения теста закройте IE.

8.

Проверьте папку docProps:

Свойства документа в версии 2007 всегда структурированы в трех программах Microsoft Office System. Разделенные на три логических XML-компонента, они хранятся во вложенной папке docProps. Это упрощает доступ пользователей, поскольку они находятся в одном месте и не будут перепутаны с другим содержимым документа.

В проводнике Windows дважды щелкните папку docProps, щелкните правой кнопкой мыши файл core.xml, выберите «Открыть с помощью», а затем щелкните Internet Explorer.

9.

Проверьте компоненты core.xml:

Откройте компонент core.xml и просмотрите атрибуты, которые вы ввели ранее. Компонент core.xml содержит атрибуты, введенные пользователем для идентификации документа, такие как заголовок, тема и автор.

10.

Проверьте компонент custom.xml:

В проводнике Windows откройте custom.xml в Internet Explorer.

Компонент custom.xml содержит любые настраиваемые атрибуты документа, добавленные в документ пользователями, разработчиками или с помощью настраиваемой логики.

11.

Проверьте компоненты app.xml:

В проводнике Windows откройте app.xml в Internet Explorer.

Компонент app.xml включает уникальные атрибуты, назначенные документу на уровне приложения, такие как количество страниц статьи, количество текстовых строк, версия приложения и т. Д.

12.

Обнаружить папку слов:

Большинство компонентов содержимого находится в подпапке word. Кроме того, в нем есть подпапка, связанная с _rels.

Дважды щелкните папку _rels.

Во вложенной папке _rels для подключения всех компонентов документа используется связанное имя document.xml.rels.

13.

Проверьте компонент document.xml.rels:

Откройте document.xml.rels в Internet Explorer.

Ассоциация использует идентификаторы и универсальные идентификаторы ресурсов (URI) для поиска компонентов. Это позволяет всем несвязанным компонентам быть недействительными без каких-либо жестко заданных ссылок. Это будет подробно рассмотрено в следующих главах.

В папке Word обратите внимание на компонент styles.xml.

14.

Проверьте компонент styles.xml:

Styles.xml в Internet Explorer.

Он содержит некоторые доступные акценты и тени, которые вы можете использовать в своем документе.

15.

Обязательные и дополнительные компоненты

16.

Использование этих компонентов в файлах формата Office Open XML позволяет хранить документы в высоком модульном виде. Некоторые компоненты должны быть действительными для документа, например, document.xml и fontTable.xml.

17.

Проверьте компонент document.xml:

1.

Откройте файл document.xml в Internet Eexplorer. Компонент document.xml содержит текст тела документа.

2.

После просмотра этого файла закройте Internet Explorer.

18.

Проверьте компонент fontTable.xml:

1.

Откройте компонент fontTable.xml в Internet Explorer.

Компонент fontTable.xml содержит настройки шрифта документа.

2.

После просмотра этого файла закройте Internet Explorer.

Если функция, описанная компонентом, не используется в документе, эти компоненты не нужны. Примеры включают примечания, компоненты верхнего и нижнего колонтитула, которые не являются обязательными для документов Word. Это позволяет пользователям легко управлять структурой документа, не изучая неиспользуемое содержимое.

XML предназначен для структурированного содержимого и изначально не поддерживает двоичное содержимое, такое как изображения или объекты OLE. Двоичные данные могут быть закодированы в символы и сохранены в форме XML, но для этого требуется процесс кодирования и декодирования, что делает его неэффективным для приложений или разработчиков. После выпуска 2007 года нет необходимости кодировать двоичные объекты, поскольку они могут храниться в собственном формате как двоичные компоненты. Следовательно, очень легко получить доступ к двоичным объектам в документах Office. Файлы мультимедиа хранятся в папке мультимедиа.

19.

Отметьте слово «media and word» для вложений папок:

В проводнике Windows дважды щелкните вложенную папку мультимедиа.

Обратите внимание, что мультимедийный файл .gif представляет собой изображение, которое вы вставили ранее.

Замечания:

Вы можете заметить, что имя файла изображения было изменено с Eagle1.gif на image1.gif. Цель изменения — решить вопросы конфиденциальности, поскольку злоумышленник может получить некоторый контент об этом компоненте из имени компонента в документе, например из файла изображения. Например, автор может защитить содержимое документа, зашифровав части текста в документе. Но если вставлены два изображения old_widget.gif и new_reen усиленный_widget.gif. Даже если текст защищен, злоумышленник может узнать, что виджет обновлен. Использование обычных файлов изображений, таких как image1 и image2, может добавить дополнительную защиту файлам формата Office Open XML.

20.

Закройте SampleWordDocument.docx.zip без сохранения.

Редактировать документы, созданные в формате Office Open XML, вручную

Формат Office Open XML имеет множество преимуществ. Одним из преимуществ является возможность использовать документы, созданные в системе Office 2007, без программ Office. Это позволяет создавать серверные решения для сбора, доступа и редактирования документов в масштабируемой среде.

На следующих шагах вы вручную отредактируете документ Word 2007. Обратите внимание, что эти сценарии — лишь небольшой пример этого нового формата файла. В большинстве случаев пользователи не будут вручную редактировать документы таким образом. Но для разработчиков просмотр документов, созданных Office 2007 без написания кода, принесет большие преимущества, особенно при разработке решений или написании моделей программ. Как вы видели ранее, после доступа к файлу-контейнеру этого документа вы можете легко просматривать отдельные компоненты. Это также означает, что вы можете редактировать, заменять или даже добавлять компоненты. Обычно вы можете изменять примечания к документу и обновлять свойства документа.

использоватьXMLмодифицироватьOffice Open XMLФорматировать документ

1.

В Word 2007 откройте документ SampleWordDocument.docx.

Замечания:

Перед открытием файла удалите расширение файла .zip.

2.

Нажмите кнопку Microsoft Office, выберите «Подготовка» и нажмите «Свойства». Обратите внимание на поля автора, заголовок, тему и примечания, а затем закройте документ.

3.

Откройте проводник Windows и перейдите к документу SampleWordDocument.docx.

4.

использовать steps described for your operating systemРаспакуйте файл документа.

Примечания в документе Word 2007 хранятся в компоненте с именем comments.xml. Такое разделение тела документа позволяет легко находить и изменять компоненты.

5.

Перетащите компонент comments.xml из сжатого файла на рабочий стол Windows.

6.

Щелкните правой кнопкой мыши компонент comments.xml, наведите указатель на «Метод открытия», а затем выберите текстовый редактор или редактор XML, чтобы открыть его, например «Блокнот».

7.

Найдите следующий текст:

<w:t>A study of the bald eagle</w:t>

8.

Замените или отредактируйте текст элемента <w: t>, например, измените его на:

<w:t>A detailed study of the bald eagle</w:t>

9.

Сохраните и закройте файл.

10.

С рабочего стола Windows перетащите компонент comments.xml в папку word сжатого файла.

11.

Когда появится предупреждающее сообщение, подтверждающее замену файла, нажмите OK.

На следующем шаге вы можете изменить свойства документа, а затем подтвердить результат изменения. Атрибуты документа хранятся во вложенных папках в корневом каталоге сжатого файла, что упрощает доступ к ним и их редактирование.

12.

Дважды щелкните папку docProps.

13.

Перетащите компонент core.xml из сжатого файла на рабочий стол Windows.

14.

Откройте core.xml в текстовом редакторе.

15.

Найдите следующий текст:

<dc:creator>Nancy Davolio</dc:creator>

16.

Замените или отредактируйте текст элемента <dc: Creator>. Например, замените текст внутри своим именем.

17.

Сохраните и закройте файл, затем перетащите его обратно в папку docProps.

18.

Когда появится предупреждающее сообщение, подтверждающее замену файла, нажмите OK.

19.

Перейдите к контейнеру документа, щелкнув стрелку назад или значок вверх на панели инструментов, пока не найдете файл .zip.

20.

Удалите расширение .zip из имени файла, а затем откройте файл в Word 2007.

21.

Нажмите кнопку Microsoft Office, выберите «Подготовка» и нажмите «Свойства».

Обратите внимание, что текст примечания был изменен. В то же время атрибут автора также был изменен.

На предыдущих шагах вы изменили документ, отредактировав компонент XML в документе. В новом формате файла вы также можете заменить весь компонент документа, чтобы изменить его содержимое, формат или атрибуты. Это позволяет использовать существующие компоненты документа для обновления отдельных документов или обновления целых библиотек документов.

Примером использования существующих компонентов для изменения документа является изменение стиля, используемого в документе. Этот метод полезен, если вам нужно управлять стилями нескольких документов, но вы хотите сохранить физическую версию. Чтобы изменить все типы, используемые в документе, нужно заменить компонент styles.xml.

Этот сценарий позволяет вам скомпилировать набор компонентов стиля для всех документов, а затем создать приложение, которое позволяет пользователям автоматически выбирать разные стили. В фоновом режиме ваше приложение может заменить один готовый компонент другим. На следующих шагах вы выполните эту операцию вручную.

Измените один, заменив существующие компонентыOffice Open XMLФорматировать документ

1.

Сделайте копию документа SampleWordDocument.docx и назовите его AnotherSampleWordDocument.docx.

2.

Откройте AnotherSampleWordDocument.docx в Word 2007.

3.

На начальной странице нажмите «Изменить стиль», наведите указатель на «Набор стилей» и нажмите «Уникальный». Этот документ похож на рисунок 2.

.

Рисунок2. Документ в уникальном стиле

4.

Сохраните и закройте документ.

5.

Использоватьsteps described for your operating system• Извлечь файл документа AnotherSampleWordDocument.docx.

6.

Дважды щелкните папку word и перетащите компонент styles.xml на рабочий стол Windows. Этот компонент будет использоваться для обновления первого созданного вами документа.

7.

Щелкните стрелку назад или значок «Вверх» на панели инструментов, чтобы перейти к контейнеру документа, пока не найдете файл .zip.

8.

Теперь откройте документ SampleWordDocument.docx в Word 2007 и обратите внимание на стиль основной части документа.

9.

Закройте документ.

10.

Использоватьsteps described for your operating systemИзвлеките файл документа SampleWordDocument.docx.

11.

Дважды щелкните, чтобы открыть папку word, а затем перетащите styles.xml с рабочего стола Windows в папку word, чтобы заменить исходный файл.

12.

Когда появится предупреждающее сообщение, подтверждающее копирование файла, нажмите OK.

13.

Перейдите к контейнеру документа файла SampleWordDocument.docx, щелкнув стрелку назад или значок «Вверх» на панели инструментов, пока не будет найден файл .zip.

14.

Удалите расширение .zip из имени файла, а затем откройте файл в Word 2007.

Обратите внимание, что стиль документа был изменен на тот, который вы видите в AnotherSampleWordDocument.docx.

Сначала удалите расширение .zip имени файла AnotherSampleWordDocument.docx.zip.

Другой аспект этой сцены стиля — использование компонента документа верхнего и нижнего колонтитула для быстрого копирования тех же параметров из документа Word 2007 в один или несколько документов Word 2007. Компоненты верхнего и нижнего колонтитула можно изменить вручную, об этом вы узнаете позже. Конечно, этот процесс также можно автоматизировать с помощью кода. Это полезно для организаций, которые хотят использовать стандартные верхние и нижние колонтитулы документов и не должны оплачивать административные задачи в каждом базовом документе. Кроме того, если изменить формат вашего верхнего и нижнего колонтитула, очень легко заменить верхний и нижний колонтитулы.

На следующих шагах вы добавите простой заголовок в SampleWordDocument.docx. Затем обновите его заголовком, отличным от документа AnotherSampleWordDocument.docx.

ОбновитьOffice Open XML Форматировать заголовок документа

1.

Откройте SampleWordDocument.docx в Word 2007.

2.

На вкладке вставки щелкните раскрывающийся список кнопки заголовка, а затем выберите буквенный заголовок. Заголовок будет добавлен к заголовку документа. Этот документ похож на рисунок 3.

.

Рисунок 3. Образец документа с буквенным заголовком

3.

Сохраните и закройте файл.

4.

Откройте AnotherSampleWordDocument.docx в Word 2007.

5.

На вкладке Вставка щелкните раскрывающийся список кнопки заголовка и выберите годовой заголовок. Заголовок будет добавлен к заголовку документа с указанием года. Этот документ похож на рисунок 4.

.

Рисунок 4. Образец документа с годовым заголовком

6.

Сохраните и закройте файл.

7.

использоватьsteps described for your operating system• Извлеките файл документа для AnotherSampleWordDocument.docx.

8.

Дважды щелкните папку word и перетащите файл header1.xml на рабочий стол Windows.

9.

Перейдите к контейнеру документа, щелкая стрелку назад или значок «Вверх» на панели инструментов, пока не найдете файл .zip.

10.

Удалите расширение файла .zip из имени файла AnotherSampleWordDocument.docx.zip.

11.

Использоватьsteps described for your operating systemРаспакуйте файл документа SampleWordDocument.docx.

12.

Дважды щелкните папку Word, чтобы открыть ее, и перетащите файл header1.xml с рабочего стола Windows в папку Word.

13.

Когда появится предупреждающее сообщение, подтверждающее замену файла, нажмите OK.

14.

Перейдите к контейнеру документа, щелкая стрелку назад или значок вверх на панели инструментов, пока не будет найден файл .zip.

15.

Удалите расширение .zip из имени файла SampleWordDocument.docx.zip, чтобы удалить расширение .zip из имени файла, а затем откройте файл в Word 2007.

Обратите внимание на новый заголовок.

Документы также могут содержать двоичные компоненты, такие как файлы изображений или проекты Microsoft VBA, к которым вы можете легко получить доступ как к компонентам XML. Замена двоичных компонентов принесет некоторые интересные вещи. Например, вы можете заменить двоичные компоненты, чтобы заменить целые объекты OLE, такие как изображения Microsoft Office Visio. Ручные операции не имеют значения. Вам необходимо рассмотреть сценарий, который позволяет автоматически обновлять изображения с сервера. Написать инструмент для выполнения таких операций относительно просто. На следующих шагах вы будете использовать изображение для обмена двоичным файлом изображения в документе AnotherSampleWordDocument.docx.

вOffice Open XMLОбмен двоичными компонентами в файлах формата

1.

использовать steps described for your operating system.Распакуйте файл документа SampleWordDocument.docx.

2.

Дважды щелкните папку Word, а затем дважды щелкните папку мультимедиа, чтобы найти изображение Eagle1.gif.

3.

Щелкните правой кнопкой мыши Eagle1.gif и выберите Предварительный просмотр. Это изображение, которое появляется в документе.

4.

Найдите изображение Eagle2.gif в загруженном файле и скопируйте его на рабочий стол Windows. (Или вы можете заменить свой собственный файл изображения)

5.

На рабочем столе Windows щелкните правой кнопкой мыши изображение Eagle2.gif и выберите «Предварительный просмотр». Это файл изображения, который вы будете использовать для замены текущего изображения.

6.

Закройте окно предварительного просмотра, щелкните правой кнопкой мыши Eagle2.gif и нажмите «Переименовать», чтобы изменить его имя на Eagle1.gif.

7.

Перетащите переименованный Eagle1.gif с рабочего стола Windwos в папку мультимедиа.

8.

Когда появится предупреждающее сообщение, подтверждающее замену файла, нажмите OK.

9.

Перейдите к контейнеру документа, щелкая стрелку назад или кнопку «Вверх» на панели инструментов, пока не найдете файл .zip.

10.

Удалите из имени расширение .zip, а затем откройте файл в Word 2007. Обратите внимание, что изображение было обновлено.

Некоторые компоненты необходимы в документах системы Microsoft Office, например, компонент document.xml в Word 2007. Однако некоторые компоненты являются необязательными и существуют только тогда, когда требуются определенные функции. Это означает, что если вам не нужны определенные функции, вы можете удалить эти компоненты и связанные отношения. Документ Office 2007, содержащий код проекта, называется документом с поддержкой макросов (расширение .docm для Word 2007, расширение .xlsm для Excel 2007 и расширение .pptm для PowerPoint 2007). В отличие от документов, не содержащих макросов, документы с поддержкой макросов хранят код в компонентах. Тип компонента зависит от типа кода в документе. Например, документ с поддержкой макросов, содержащий код VBA, хранит свои данные в двоичном компоненте vbaProject.bin.

Другие типы проектов включают книги Excel 2007 с использованием макросов в стиле Excel 4.0 (макросы XLM) или слайд-шоу PowerPoint 2007 с командными кнопками. Эти функции расположены в отдельных компонентах, поэтому их можно легко идентифицировать и удалять.

На следующих шагах вы создадите простой документ с поддержкой макросов и продемонстрируете его возможности. Затем вы удалите компонент vbaProject.bin и его взаимосвязь из документа и увидите его эффект. Обратите внимание, что вы также можете удалить компоненты проекта из файла с поддержкой макросов, щелкнув «Сохранить как» в меню «Файл» или сохранив файл как файл без макросов (.docx, .pptx или .xlsx). Однако для этого необходимо открыть этот документ в программе Система Office 2007. Выполните действия, описанные в следующей процедуре, чтобы выйти из проекта без использования программ Office.

ИзOffice Open XMLФорматировать документ удаленVBAпроект

1.

Используйте Word 2007, чтобы открыть SampleWordDocument.docx.

2.

В группе кода на вкладке инструментов разработки щелкните Visual Basic, чтобы открыть редактор Visual Basic. Вы также можете нажать ALT + F11, чтобы открыть редактор Visual Basic.

Замечания:

Если вы не можете найти тег инструментов разработчика, вам необходимо его добавить. Нажмите кнопку Microsoft Office, затем выберите параметр Word, а затем на общей вкладке выберите «Показать вкладку инструментов разработки на ленте».

3.

В окне кода редактора Visual Basic введите или вставьте следующий оператор:

Sub SampleCode()
Msgbox("Hello World")
End Sub

Замечания:

Если вы не видите окно кода, щелкните меню «Просмотр» и выберите окно кода.

4.

В меню «Выполнить» щелкните «Выполнить подпроцесс / пользовательскую форму», чтобы запустить код. Вы также можете нажать F5.

5.

Нажмите кнопку ОК, чтобы закрыть окно сообщения, а затем закройте редактор Visual Basic. Затем сохраните его как документ с поддержкой макросов.

6.

Нажмите кнопку Microsoft Office, выберите «Сохранить как» и нажмите «Документ Word».

7.

В раскрывающемся списке Тип файла выберите Документ Word с поддержкой макросов (.docm), а затем щелкните Сохранить, чтобы закрыть документ.

8.

использоватьsteps described for your operating system.Извлеките файл документа для SampleWordDocument.docm.

9.

Дважды щелкните папку Word, а затем дважды щелкните папку _rels.

10.

Щелкните document.xml.rels, щелкните Метод открытия, а затем выберите текстовый редактор, например Блокнот.

Замечания:

Этот файл может быть только для чтения. Если он доступен только для чтения, закройте файл, щелкните имя файла правой кнопкой мыши и выберите «Свойства». Затем снимите флажок атрибута только для чтения. Затем снова откройте файл.

11.

Найдите и удалите следующие теги XML:

<Relationship Id="rId1" Type="http://schemas.microsoft.com/office/2006/relationships/vbaProject" Target="vbaProject.bin"/>

12.

Сохраните и закройте файл.

13.

Щелкните правой кнопкой мыши document.xml.rels и выберите «Копировать».

14.

Вернитесь к файлу SampleWordDocument.docm.zip и откройте его.

15.

Дважды щелкните папку Word.

16.

Щелкните проект vbaProject.bin правой кнопкой мыши и выберите команду Удалить. При появлении запроса нажмите ОК, чтобы удалить.

17.

Дважды щелкните папку _rels.

18.

Щелкните правой кнопкой мыши и выберите Вставить.

19.

Когда будет предложено подтвердить сообщение о замене файла (предупреждение о копировании и замене в Windows Vista), нажмите OK.

20.

Перейдите к контейнеру документа, щелкая стрелку назад или кнопку «Вверх» на панели инструментов, пока не найдете файл .zip.

21.

Щелкните правой кнопкой мыши папку SampleWordDocument.docm и выберите команду Удалить, чтобы удалить ее. При появлении запроса нажмите ОК.

22.

Удалите расширение .zip из имени файла SampleWordDocument.docm.zip. При появлении запроса нажмите кнопку ОК в окне предупреждения о переименовании, а затем снова откройте файл в Word 2007.

23.

Нажмите ALT + F11, чтобы просмотреть проект VBA. Обратите внимание, что подпрограмма была потеряна.

Замечания:

Вы можете изменить расширение файла с .docm на .docx, чтобы получить аналогичные результаты. Файлы с расширением без макросов никогда не будут выполнять код.

Работа с документами в формате Office Open XML с помощью программирования

Важное значение формата Office Open XML — его безграничный потенциал для индивидуальных решений. Вы можете получить доступ и изменить содержимое документа с помощью инструментов, которые могут обрабатывать файлы XML или ZIP на любой платформе. Например, вы можете использовать управляемый код в Microsoft Visual Studio для написания серверного приложения для сохранения документов системы 2007 Office. Вы можете использовать мощную библиотеку классов XML Microsoft .NET Framework для редактирования любого компонента документа XML, содержащегося в файле формата Office Open XML.

Мощный способ манипулировать компонентами документа и их отношениями — использовать пространство имен System.IO.Packaging, которое входит в состав Microsoft Windows Software Development Kit. Пространство имен System.IO.Packaging будет подробно рассмотрено позже.

Замечания:

Вы можете загрузить предварительную версию программного обеспечения Microsoft WinFX Runtime Components — Beta2 из центра загрузок Microsoft.

На следующих шагах вы разработаете консольное приложение для изменения стиля форматирования без использования Word 2007. Этот проект завершается заменой компонентов стиля в документе Word 2007 на компоненты стиля, извлеченные из документа. В результате целевой документ принимает тот же стиль, что и документ, извлекший этот стиль.

Замечания:

Таких примеров кода здесь много, вы можете скачать их. После загрузки этих готовых примеров кода вы сможете использовать эти функции Code Snippet Manager в Microsoft Visual Studio 2005 (в меню «Инструменты»), чтобы вставить их в свой проект. Вы можете скачать2007 Office System Sample: Open XML File Format Code Snippets for Visual Studio 2005.

Выполните следующие шаги, чтобы изменить формат документа.

вOffice Open XMLИзменить стиль в формате документа

1.

Сначала создайте папку и подпапки для размещения обновляемых документов и компонентов styles.xml. В этом упражнении назовите папку WordOpenXMLFormatSample. В папке добавьте подпапку с именем NewStylePart.

2.

Скопируйте SampleWordDocument.docx в папку WordOpenXMLFormatSample.

3.

Перейдите к файлу AnotherSampleWordDocument.docx, добавьте расширение файла .zip после имени файла и откройте файл.

4.

Перейдите к компоненту styles.xml в папке word, щелкните его правой кнопкой мыши и выберите «Копировать».

5.

Перейдите к папке WordOpenXMLFormatSample, а затем перейдите к подпапке NewStylePart. Щелкните правой кнопкой мыши подпапку NewStylePart и выберите «Вставить». Теперь папка содержит документ Word 2007 с компонентами стиля по умолчанию, а вложенная папка содержит компонент styles.xml из документа со стилем под названием «Fancy».

6.

Запустите Visual Studio 2005.

7.

В меню «Файл» выберите «Новый проект».

8.

В диалоговом окне «Новый проект» в дереве типов проектов слева щелкните «Другие языки», выберите «Visual C #», а затем выберите «Консольное приложение» в представлении списка шаблонов.

9.

В диалоговом окне «Имя» назовите проект StyleSwapper и нажмите «ОК». Visual Studio создает все файлы в проекте и сохраняет их в каталоге проекта, например на диске «Проекты Visual Studio» StyleSwapper.

Чтобы точно увидеть, где сохранен проект, или изменить местоположение, сделайте следующее:

1.

В меню «Инструменты» выберите «Параметры».

2.

В диалоговом окне «Параметры» щелкните представление в виде дерева проекта и решения, а затем щелкните вкладку «Общие». Здесь вы можете указать место хранения проекта и шаблона или установить другие параметры.

3.

Запомните расположение элемента, затем нажмите OK, чтобы закрыть окно.

Когда вы создаете новый проект, Visual Studio автоматически создает новую программу с тремя контейнерами: свойствами, ссылками и Program.cs. Вы можете просмотреть эти три контейнера в обозревателе решений. Visual Studio также создает пустой класс для добавления большей части кода.

Замечания:

Microsoft .NET Framework 3.0 (WinFX) включает пространство имен System.IO.Packaging. Используя пространство имен System.IO.Packaging, вы можете добавлять компоненты документа, получать и обновлять контент или создавать новые отношения, что позволяет создавать новые документы или изменять существующие пространства имен документов. Некоторые важные члены включают объекты Package, PackagePart Object и объект PackageRelationship. Дополнительные сведения о пространстве имен System.IO.Packaging см. В разделеSystem.IO.Packaging Namespace。

Затем вы добавите ссылку на .NET Framework 3.0 из своего проекта:

10.

Щелкните меню проекта и щелкните Добавить ссылку.

11.

На вкладке обзора в поле поиска найдите WindowsBase.dll. На момент публикации этого документа файл расположен на диске «Program Files» Reference Assemblies «Microsoft» WinFx «v3.0.

12.

Выберите файл WindowsBase.dll и нажмите ОК. Убедитесь, что ссылка была создана, щелкнув ссылку в обозревателе решений.

13.

В обозревателе решений щелкните правой кнопкой мыши Program.cs и выберите Просмотреть код.

14.

Введите следующий код в пространство имен окна кода:

using System.IO; 
using System.IO.Packaging;

Чтобы использовать содержимое документа Система Office 2007, вам необходимо его открыть. System.IO.Packaging имеет член верхнего уровня под названием Package, который эквивалентен документу. После открытия проекта Package вы проверите его структуру и сможете управлять его компонентами. Пакеты могут быть открыты только для чтения, только для записи или для чтения / записи.

15.

Добавьте следующий код после скобок ({) оператора Class Program. Следующие строки устанавливают переменные, содержащие расположение вашего документа Word и style.xml. Эти операторы предполагают, что папка WordOpenXMLFormatSample создана на диске C.

private static String stylePath = @"C:"WordOpenXMLFormatSample"NewStylePart"styles.xml";
private static String packagePath = @"C:"WordOpenXMLFormatSample"SampleWordDocument.docx.zip";

Замечания:

Строки, начинающиеся с символа @, называются буквальными строковыми литералами. Это указывает программе использовать определенные строки, которые появляются при извлечении файла.

16.

Когда проект запущен, основной процесс будет выполнен автоматически. Между открывающим знаком ({) и закрывающей скобкой (}) в Main введите следующую строку:

SwapStylePart(packagePath, stylePath);

Эта строка вызывает процедуру SwapStylePart, которую вы добавите ниже. Он передает путь к документу Word 2007 и компоненту styles.xml.

17.

Добавьте следующий код после закрывающей скобки (}) после Main:

static void SwapStylePart(String packagePath, String stylePath)
{ }

На следующих шагах вы добавите код в программу SwapStylePart, которая используется для открытия документов, которые отображаются как объекты пакета и имеют разрешения на чтение / запись. Обратите внимание на использование оператора using. Его цель — автоматически обработать объект Package и очистить используемую память после завершения оператора.

18.

Введите следующий код в программу SwapStylePart:

using (Package package = Package.Open(packagePath, FileMode.Open, FileAccess.ReadWrite))
{ }

Чтобы иметь возможность использовать любой компонент документа Система Office 2007, вам сначала нужно найти его. Вы можете использовать URL-адрес для ссылки на определенный компонент документа. URL-адрес — это путь, уникальный для каждого компонента.

19.

В скобках оператора using введите следующий оператор:

// Set the URI for the styles document part (/word/styles.xml). 
Uri uriPartTarget = new Uri("/word/styles.xml", UriKind.Relative);

На момент написания этой статьи пространство имен System.IO.Packaging не позволяло копировать или заменять существующий компонент. Чтобы обмениваться компонентами, вы должны сначала удалить существующие компоненты, а затем создать новый с тем же URL-адресом. Обратите внимание, что удаление компонентов не повлияет на отношения каких-либо компонентов. Любые отношения остаются неизменными и по-прежнему применяются к новому компоненту.

20.

Введите следующий код после строки, добавленной на предыдущем шаге:

// Delete the existing document part (/word/styles.xml).
package.DeletePart(uriPartTarget);

Для добавления нового компонента документа в пакет требуется URL-адрес. В этом случае вам нужно только повторно использовать тот же URL-адрес для воссоздания компонента документа стиля. При создании пакета требуется дополнительный параметр: тип содержимого компонента. Типы контента, используемые в настоящее время в документе, можно найти в компоненте [Content_Types] .xml, расположенном в контейнере документа.

21.

Введите следующий код после строки, добавленной на предыдущем шаге:

// Recreate a new document part for styles(/word/styles.xml). PackagePart
packagePartReplacement = package.CreatePart(uriPartTarget, "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml");

Последним шагом при использовании вновь созданного компонента стиля является копирование XML из исходного компонента styles.xml во вновь созданный компонент. Пространство имен System.IO.Packaging не обрабатывает XML локально в XML-документе, поэтому способ копирования содержимого в .NET Framework — это использование Streams.

На следующих шагах вы добавите код, который открывает компонент внешнего стиля в форме потока и записывает его в компонент документа нового стиля. Чтобы скопировать поток, вы вызовете программу CopyStream и выполните передачу между исходным и целевым потоками.

22.

Введите следующий код после строки, добавленной на предыдущем шаге:

using (FileStream fileStream = new FileStream(stylePath, FileMode.Open, FileAccess.Read))
{// Load the new styles.xml
using a stream.CopyStream(fileStream,packagePartReplacement.GetStream());
}

23.

Затем добавьте программу CopyStream после закрывающей скобки программы SwapStylePart:

private static void CopyStream(Stream source, Stream target)
{
const int bufSize = 0x1000;
const int bufSize = 1024;
byte[] buf = new byte[bufSize];
int bytesRead = 0;
while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
{
target.Write(buf, 0, (int)bytesRead);
}
source.Close();
target.Close();
}

Этот процесс устанавливает размер буфера в памяти, и поток данных из исходного компонента styles.xml сохраняется в буфере. При выполнении операции чтения байтов эти байты будут записаны в новый компонент styles.xml. Чтобы увидеть приложение в действии, вам необходимо построить проект: Чтобы увидеть эффект от программы, вам необходимо собрать проект:

24.

В меню «Создать» выберите «Создать StyleSwapper».

Замечания:

Если во время сборки произойдет ошибка, вы увидите диалоговое окно с вопросом, хотите ли вы запустить последнюю сборку. Нажмите Нет, вы увидите описание ошибки в списке ошибок. Если вы не видите список ошибок, в меню «Просмотр» щелкните «Список ошибок».

25.

Предполагая, что ошибок нет, вы запускаете код сейчас. Но сначала вы можете просмотреть текущий документ:

26.

Откройте SampleWordDocument.docx в Word 2007.

27.

Закройте Word 2007 и добавьте расширение .zip после имени файла SampleWordDocument.docx.

28.

Нажмите F5. Вы увидите, что консоль Windows появится, и вскоре вы увидите, что она исчезнет. Поскольку это консольное приложение, оно не имеет пользовательского интерфейса, а просто появляется.

29.

Удалите расширение .zip из имени файла и снова откройте его в Word 2007. Обратите внимание, что стиль документа был изменен на «уникальный» стиль.

В следующем упражнении показано, как использовать настраиваемое приложение для выполнения пакетных операций с файлами формата Office Open XML без Word 2007. В этом упражнении вы создадите размещенную программу, которая будет искать нужные файлы в папках и подпапках, соответствующих определенным критериям. Приложение определяет компоненты документа на наличие терминов и содержащие файлы данных. Вы можете представить себе использование этой программы для идентификации документов, содержащих конкретные имена клиентов, или документов, содержащих конкретные наименования продуктов. Вы также можете добавить в приложение дополнительную логику и использовать другие термины для замены существующих, по сути копируя функцию «Найти-заменить» в Word 2007 без использования приложения.

Поиск в группе по ключевым словамOffice Open XMLФорматировать файл

1.

Запустите Visual Studio 2005.

2.

В меню «Файл» выберите «Новый проект».

3.

В диалоговом окне «Новый проект» в дереве типов проектов слева выберите Visual C #. Затем выберите «Приложение Windows», измените имя проекта на «Поиск ключевых слов» и нажмите «ОК». Visual Studio создала все файлы в проекте.

4.

В обозревателе решений щелкните правой кнопкой мыши Form1.cs и выберите пункт Конструктор представлений.

5.

На вкладке Form1.cs [Дизайн] добавьте в форму следующие элементы управления, а затем установите их свойства так, чтобы форма была похожа на рисунок 5.

.

Рисунок5. KeywordSearch Форма

Таблица 2. Список элементов управления, используемых в форме поиска по ключевым словам документа в формате Office Open XML

Типы Атрибуты

Label

Text: Search Directory

TextBox

Name: txtPath

Текст: C: «WordDocuments. Обратите внимание, что это каталог по умолчанию, с которого начинается поиск.

Label

Text: Search Pattern

ComboBox

Name: cboMask

Items (Collection): *.docx *.docm

Text: *.docx

CheckBox

Name: ckbSubfolders

Text: Include Subfolders

Label

Text: Search Term

TextBox

Name: txtTerm

Button

Name: btnSearch

Text: Search

Button

Name: btnClose

Text: Close

Label

Text: Results

ListBox

Name: lbxResults

6.

В обозревателе решений щелкните правой кнопкой мыши Form1.cs и выберите команду Просмотреть код.

7.

В окне кода добавьте следующий оператор после существующего оператора using:

using System.Xml; using System.IO; using System.IO.Packaging;

Чтобы использовать пространство имен System.IO.Packaging, вам необходимо добавить ссылку на библиотеку WindowsBase.dll, которая находится в .NET Framework 3.0 SDK (WinFX):

8.

В меню проекта щелкните Добавить ссылку.

9.

В поле «Найти» на вкладке «Обзор» найдите имя файла WindowsBase.dll. На момент публикации этой статьи файл находится в каталоге «Program Files» Reference Assemblies «Microsoft» WinFx «v3.0.

10.

Щелкните ОК.

11.

После открывающей скобки ({) общедоступного частичного класса Form1: Form добавьте следующие переменные класса:

FileInfo[] tempfiles; List<FileInfo> files = new List<FileInfo>();

Затем добавьте код к кнопке поиска:

12.

На вкладке Form1.cs [Design] дважды щелкните кнопку поиска, чтобы добавить событие Click.

13.

Между двумя скобками процедуры btnSearch_Click добавьте следующий код:

Boolean match = false; // Ensure that the user added a search term.
if (txtTerm.Text == "")
{
MessageBox.Show("Don't forget the search term.");
}
List<FileInfo> returnedFiles; // Get the starting directory.
DirectoryInfo dir = new DirectoryInfo(txtPath.Text); // Get the list of files.
returnedFiles = GetDirFiles(dir); // Loop through the file list.
foreach(FileInfo file in returnedFiles)
{
match = GetDocPart(file);
}
if(!match)
{ // No matching files were found.
lbxResults.Items.Add("No matches.");
}

В этом коде объявляется логическая переменная, чтобы показать, нашел ли поиск совпадения. Затем, если текстовое поле пусто, код предложит пользователю ввести ключевое слово для поиска. Другие текстовые поля в форме имеют значения по умолчанию. Затем определите класс List, который будет содержать файлы, возвращенные в результате поиска. Класс List предоставляет массив, размер которого можно динамически увеличивать. Переменная dirs указывает на каталог, в котором начинается поиск. Затем вызов процедуры GetDirsFiles вернет список файлов в каталоге. Затем код будет циклически запрашивать возвращенный набор файлов и вызывать процедуру GetDocPart для обнаружения каждого файла по ключевому слову поиска. Если нет соответствующей опции, сообщение будет добавлено в список.

14.

Добавьте программу GetDirFiles:

public List<FileInfo> GetDirFiles(DirectoryInfo dir)
{ // Get all files for the current directory.
Object selectedItem = cboMask.SelectedItem;
tempfiles = dir.GetFiles(selectedItem.ToString());// Add these files to the returned file list.
foreach (FileInfo file1 in tempfiles)
{
files.Add(file1);
}// Search subfolders if requested.
if (ckbSubfolders.Checked)
{// Get subfolders for the current directory.
DirectoryInfo[] dirs = dir.GetDirectories("*.*");
foreach (DirectoryInfo directory in dirs)
{
GetDirFiles(directory);
}
}
return files;
}

Эта программа устанавливает переменную selectedItem в соответствии со стилем поиска, отображаемым в поле со списком. Затем вызовите метод GetFiles в текущем каталоге, чтобы вернуть все файлы, соответствующие шаблону поиска. Возвращенный файл добавляется в список файлов. Если пользователь устанавливает флажок «Включить подпапки», поиск в каждом подкаталоге текущего каталога выполняется путем рекурсивного вызова программы GetDirFiles (с именем каждой подпапки). Наконец, список файлов возвращается вызывающей программе (btnSearch_Click).

15.

Добавьте следующий код после программы GetDirFiles:

private Boolean GetDocPart(FileInfo file)
{ // Retrieve the start part for the input file.
Boolean fileFound = false;
const String documentRelationshipType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
const String dcPropertiesSchema = "http://purl.org/dc/elements/1.1/";// Open the package with read access.
using (Package myPackage = Package.Open(file.DirectoryName + """" + file.Name, FileMode.Open, FileAccess.Read))
{ // Get the main document part (document.xml).
foreach (PackageRelationship relationship in myPackage.GetRelationshipsByType(documentRelationshipType))
{ // There should be only one document part in the package.
Uri documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), relationship.TargetUri);
PackagePart documentPart = myPackage.GetPart(documentUri);
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
nsmgr.AddNamespace("w", dcPropertiesSchema);
XmlDocument doc = new XmlDocument(nt);
doc.Load(documentPart.GetStream());
if (doc.OuterXml.IndexOf(txtTerm.Text) >= 1)
{
lbxResults.Items.Add(file.DirectoryName + """" + file.Name);
fileFound = true;
}// There is only one document part, so exit the loop. break;
}
}
if (lbxResults.Items.Count >0)
{
return true;
}
else
{
return false;
}
}

Программа изначально устанавливает значения переменных для пространства имен в типе отношения документа и структуре атрибута документа. Затем документ открывается как объект Package. В пространстве имен System.IO.Packaging вы можете получить доступ к различным компонентам в пакете через отношения между компонентами (определенные в реляционном компоненте) и через URL-адрес, содержащий путь к структуре компонента. Примером URL-адреса для компонента изображения является «word» media «picture.jpg. Если вы знаете URL-адрес определенного компонента документа в документе Система Office 2007, вы можете напрямую получить доступ, изменить или удалить компонент. В программе GetDocPart передайте Вызовите метод GetPart в объекте Package, а затем передайте его по URL-адресу компонента, чтобы вернуть компонент document.xml.

На следующем шаге объект XmlDocument указывает на XML-файл, содержащий одну или несколько ссылок на разные пространства имен. Как и все файлы XML, синтаксический анализатор XML использует имена с префиксом пространства имен для доступа к большому количеству элементов и атрибутов в документе.

Замечания:

Имя элемента без квалификатора считается компонентом пространства имен по умолчанию.

Квалификаторы этих пространств имен должны быть разрешены в их ссылки на пространства имен во время выполнения. Чтобы сделать эту задачу простой и последовательной, .NET Framework включает XmlNamespaceManager, который предоставляет большое количество инструментов управления пространством имен. Один из них — класс NameTable. Класс NameTable хранит имена атрибутов и элементов внутри. Когда имя элемента или атрибута появляется в документе XML несколько раз, оно сохраняется только один раз в NameTable. Когда квалификатор пространства имен конфликтует, он может использовать строку в NameTable для разрешения.

В следующем операторе создается объект XmlDocument, который заполняется содержимым компонента документа. Далее для поиска проверяется содержимое объекта. Обратите внимание, что метод IndexOf в C # такой же, как метод InStr в Visual Basic. Если ключевое слово поиска найдено, каталог и имя файла добавляются в список в форме, и программа возвращает True. В противном случае соответствующая опция не будет найдена, и программа вернет False.

16.

Наконец, в конструкторе Form1 дважды щелкните кнопку закрытия и добавьте в программу следующий оператор:

Close();

программа испытаний:

17.

На диске C или в любом другом месте по вашему выбору создайте папку с именем WordDocuments.

18.

Скопируйте документ SampleWordDocument.docx и документ AnotherSampleWordDocument.docx в папку WordDocuments.

19.

Откройте Word 2007 и создайте новый документ.

20.

Добавьте текст (не включая Eagle) и сохраните документ в папке WordDocuments с именем SearchSampleDocument.docx.

21.

Нажмите F5, чтобы запустить этот проект.

22.

В форме в поле «Каталог поиска» введите расположение документа .docx.

23.

В поле Search Term введите Eagle, а затем нажмите Search.

Два документа, содержащие «Eagle», отображаются в поле списка, как показано на рисунке 6. Документ SearchSampleDocument.docx не отображается.

.

Рисунок6. Результаты поиска по ключевым словам

24.

закрой окно.

Это весь код, который вам нужен для поиска в документе, в этом случае вам не нужно использовать Word 2007. Вам нужно добавить несколько небольших функций: подсчитать количество документов для поиска, добавить функции замены или поиск других компонентов.

в заключении

В этой статье вы знакомы со структурой файлов формата Office Open XML. Вы просмотрели формат файла и продемонстрировали, как легко открывать и редактировать документы Microsoft Office 2007 с помощью стандартных технологий XML и ZIP. Вы также узнали, как управлять файлами формата Office Open XML вручную и с помощью программирования. Благодаря этому контенту у вас есть основа для создания пользовательских приложений для вашей организации.

Укажите адрес статьи:Как работать с документами в формате Office Open XML (очередь)

In this example, let’s create a demo console project in Visual Studio by selecting File -> New -> Project. From the project window, select Console template and type name and select path for the project, as shown below.

Creating Excel File Using OpenXML

After creating the project, create a Model Class and give a name as TestModel, as shown below.

  1. public class TestModel  
  2.  {              
  3.      public int TestId { getset; }  
  4.      public string TestName { getset; }  
  5.      public string TestDesc { getset; }  
  6.      public DateTime TestDate { getset; }  
  7.  }  

Create one more class and give name as TestModelList.

  1. public class TestModelList  
  2. {  
  3.     public List<TestModel> testData { getset; }  
  4. }  

Let’s add some hard coded data into this model. For that, write the below code in the main method of Program.cs file.

  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {             
  5.           
  6.         TestModelList tmList = new TestModelList();  
  7.         tmList.testData = new List<TestModel>();  
  8.         TestModel tm = new TestModel();  
  9.         tm.TestId = 1;  
  10.         tm.TestName = «Test1»;  
  11.         tm.TestDesc = «Tested 1 time»;  
  12.         tm.TestDate = DateTime.Now.Date;  
  13.         tmList.testData.Add(tm);  
  14.   
  15.         TestModel tm1 = new TestModel();  
  16.         tm1.TestId = 2;  
  17.         tm1.TestName = «Test2»;  
  18.         tm1.TestDesc = «Tested 2 times»;  
  19.         tm1.TestDate = DateTime.Now.AddDays(-1);  
  20.         tmList.testData.Add(tm1);  
  21.   
  22.         TestModel tm2 = new TestModel();  
  23.         tm2.TestId = 3;  
  24.         tm2.TestName = «Test3»;  
  25.         tm2.TestDesc = «Tested 3 times»;  
  26.         tm2.TestDate = DateTime.Now.AddDays(-2);  
  27.         tmList.testData.Add(tm2);  
  28.   
  29.         TestModel tm3 = new TestModel();  
  30.         tm3.TestId = 4;  
  31.         tm3.TestName = «Test4»;  
  32.         tm3.TestDesc = «Tested 4 times»;  
  33.         tm3.TestDate = DateTime.Now.AddDays(-3);  
  34.         tmList.testData.Add(tm);   
  35.           
  36.     }  
  37. }   

Now, we have got a Model ready. So, let’s start writing functions for creating an Excel file using OpenXml. For this, add OpenXml from NuGet Packages by right-clicking the project and selecting «Manage NuGet Package» and search openxml. From the list, select DocumentFormat.OpenXml as shown below and install it.

Creating Excel File Using OpenXML

Next, create functions for creating an Excel package using OpenXml as shown below.

  • First, import OpenXml packages as shown below.

    1. using DocumentFormat.OpenXml;  
    2. using DocumentFormat.OpenXml.Packaging;  
    3. using DocumentFormat.OpenXml.Spreadsheet;  
    4. using X14 = DocumentFormat.OpenXml.Office2010.Excel;  
    5. using X15 = DocumentFormat.OpenXml.Office2013.Excel;  

    Then, add the below code for creating an Excel file into given path.

    1. public void CreateExcelFile(TestModelList data, string OutPutFileDirectory)  
    2. {  
    3.     var datetime = DateTime.Now.ToString().Replace(«/»«_»).Replace(«:»«_»);  
    4.    
    5.     string fileFullname = Path.Combine(OutPutFileDirectory, «Output.xlsx»);  
    6.    
    7.     if (File.Exists(fileFullname))  
    8.     {  
    9.         fileFullname = Path.Combine(OutPutFileDirectory, «Output_» + datetime + «.xlsx»);  
    10.     }  
    11.    
    12.     using (SpreadsheetDocument package = SpreadsheetDocument.Create(fileFullname, SpreadsheetDocumentType.Workbook))  
    13.     {  
    14.         CreatePartsForExcel(package, data);  
    15.     }  
    16. }  
  • Write functions for creating workbook and worksheet into Excel.

    1. private void CreatePartsForExcel(SpreadsheetDocument document, TestModelList data)  
    2. {  
    3.     SheetData partSheetData = GenerateSheetdataForDetails(data);  
    4.    
    5.     WorkbookPart workbookPart1 = document.AddWorkbookPart();  
    6.     GenerateWorkbookPartContent(workbookPart1);  
    7.    
    8.     WorkbookStylesPart workbookStylesPart1 = workbookPart1.AddNewPart<WorkbookStylesPart>(«rId3»);  
    9.     GenerateWorkbookStylesPartContent(workbookStylesPart1);  
    10.    
    11.     WorksheetPart worksheetPart1 = workbookPart1.AddNewPart<WorksheetPart>(«rId1»);  
    12.     GenerateWorksheetPartContent(worksheetPart1, partSheetData);  
    13. }  
  • Write functions for creating workbook and work sheet content in Excel, as shown below.

    1. private void GenerateWorkbookPartContent(WorkbookPart workbookPart1)  
    2. {  
    3.     Workbook workbook1 = new Workbook();  
    4.     Sheets sheets1 = new Sheets();  
    5.     Sheet sheet1 = new Sheet() { Name = «Sheet1», SheetId = (UInt32Value)1U, Id = «rId1» };  
    6.     sheets1.Append(sheet1);  
    7.     workbook1.Append(sheets1);  
    8.     workbookPart1.Workbook = workbook1;  
    9. }  
    10.   
    11. private void GenerateWorksheetPartContent(WorksheetPart worksheetPart1, SheetData sheetData1)  
    12. {  
    13.     Worksheet worksheet1 = new Worksheet() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = «x14ac» } };  
    14.     worksheet1.AddNamespaceDeclaration(«r»«http://schemas.openxmlformats.org/officeDocument/2006/relationships»);  
    15.     worksheet1.AddNamespaceDeclaration(«mc»«http://schemas.openxmlformats.org/markup-compatibility/2006»);  
    16.     worksheet1.AddNamespaceDeclaration(«x14ac»«http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac»);  
    17.     SheetDimension sheetDimension1 = new SheetDimension() { Reference = «A1» };  
    18.    
    19.     SheetViews sheetViews1 = new SheetViews();  
    20.    
    21.     SheetView sheetView1 = new SheetView() { TabSelected = true, WorkbookViewId = (UInt32Value)0U };  
    22.     Selection selection1 = new Selection() { ActiveCell = «A1», SequenceOfReferences = new ListValue<StringValue>() { InnerText = «A1» } };  
    23.    
    24.     sheetView1.Append(selection1);  
    25.    
    26.     sheetViews1.Append(sheetView1);  
    27.     SheetFormatProperties sheetFormatProperties1 = new SheetFormatProperties() { DefaultRowHeight = 15D, DyDescent = 0.25D };  
    28.    
    29.     PageMargins pageMargins1 = new PageMargins() { Left = 0.7D, Right = 0.7D, Top = 0.75D, Bottom = 0.75D, Header = 0.3D, Footer = 0.3D };  
    30.     worksheet1.Append(sheetDimension1);  
    31.     worksheet1.Append(sheetViews1);  
    32.     worksheet1.Append(sheetFormatProperties1);  
    33.     worksheet1.Append(sheetData1);  
    34.     worksheet1.Append(pageMargins1);  
    35.     worksheetPart1.Worksheet = worksheet1;  
    36. }  
  • Write code for workbook styles by giving your own font size, color, font name, border properties, cell style formats etc. as shown below.

    1. private void GenerateWorkbookStylesPartContent(WorkbookStylesPart workbookStylesPart1)  
    2. {  
    3.     Stylesheet stylesheet1 = new Stylesheet() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = «x14ac» } };  
    4.     stylesheet1.AddNamespaceDeclaration(«mc»«http://schemas.openxmlformats.org/markup-compatibility/2006»);  
    5.     stylesheet1.AddNamespaceDeclaration(«x14ac»«http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac»);  
    6.    
    7.     Fonts fonts1 = new Fonts() { Count = (UInt32Value)2U, KnownFonts = true };  
    8.    
    9.     Font font1 = new Font();  
    10.     FontSize fontSize1 = new FontSize() { Val = 11D };  
    11.     Color color1 = new Color() { Theme = (UInt32Value)1U };  
    12.     FontName fontName1 = new FontName() { Val = «Calibri» };  
    13.     FontFamilyNumbering fontFamilyNumbering1 = new FontFamilyNumbering() { Val = 2 };  
    14.     FontScheme fontScheme1 = new FontScheme() { Val = FontSchemeValues.Minor };  
    15.    
    16.     font1.Append(fontSize1);  
    17.     font1.Append(color1);  
    18.     font1.Append(fontName1);  
    19.     font1.Append(fontFamilyNumbering1);  
    20.     font1.Append(fontScheme1);  
    21.    
    22.     Font font2 = new Font();  
    23.     Bold bold1 = new Bold();  
    24.     FontSize fontSize2 = new FontSize() { Val = 11D };  
    25.     Color color2 = new Color() { Theme = (UInt32Value)1U };  
    26.     FontName fontName2 = new FontName() { Val = «Calibri» };  
    27.     FontFamilyNumbering fontFamilyNumbering2 = new FontFamilyNumbering() { Val = 2 };  
    28.     FontScheme fontScheme2 = new FontScheme() { Val = FontSchemeValues.Minor };  
    29.    
    30.     font2.Append(bold1);  
    31.     font2.Append(fontSize2);  
    32.     font2.Append(color2);  
    33.     font2.Append(fontName2);  
    34.     font2.Append(fontFamilyNumbering2);  
    35.     font2.Append(fontScheme2);  
    36.    
    37.     fonts1.Append(font1);  
    38.     fonts1.Append(font2);  
    39.    
    40.     Fills fills1 = new Fills() { Count = (UInt32Value)2U };  
    41.    
    42.     Fill fill1 = new Fill();  
    43.     PatternFill patternFill1 = new PatternFill() { PatternType = PatternValues.None };  
    44.    
    45.     fill1.Append(patternFill1);  
    46.    
    47.     Fill fill2 = new Fill();  
    48.     PatternFill patternFill2 = new PatternFill() { PatternType = PatternValues.Gray125 };  
    49.    
    50.     fill2.Append(patternFill2);  
    51.    
    52.     fills1.Append(fill1);  
    53.     fills1.Append(fill2);  
    54.    
    55.     Borders borders1 = new Borders() { Count = (UInt32Value)2U };  
    56.    
    57.     Border border1 = new Border();  
    58.     LeftBorder leftBorder1 = new LeftBorder();  
    59.     RightBorder rightBorder1 = new RightBorder();  
    60.     TopBorder topBorder1 = new TopBorder();  
    61.     BottomBorder bottomBorder1 = new BottomBorder();  
    62.     DiagonalBorder diagonalBorder1 = new DiagonalBorder();  
    63.    
    64.     border1.Append(leftBorder1);  
    65.     border1.Append(rightBorder1);  
    66.     border1.Append(topBorder1);  
    67.     border1.Append(bottomBorder1);  
    68.     border1.Append(diagonalBorder1);  
    69.    
    70.     Border border2 = new Border();  
    71.    
    72.     LeftBorder leftBorder2 = new LeftBorder() { Style = BorderStyleValues.Thin };  
    73.     Color color3 = new Color() { Indexed = (UInt32Value)64U };  
    74.    
    75.     leftBorder2.Append(color3);  
    76.    
    77.     RightBorder rightBorder2 = new RightBorder() { Style = BorderStyleValues.Thin };  
    78.     Color color4 = new Color() { Indexed = (UInt32Value)64U };  
    79.    
    80.     rightBorder2.Append(color4);  
    81.    
    82.     TopBorder topBorder2 = new TopBorder() { Style = BorderStyleValues.Thin };  
    83.     Color color5 = new Color() { Indexed = (UInt32Value)64U };  
    84.    
    85.     topBorder2.Append(color5);  
    86.    
    87.     BottomBorder bottomBorder2 = new BottomBorder() { Style = BorderStyleValues.Thin };  
    88.     Color color6 = new Color() { Indexed = (UInt32Value)64U };  
    89.    
    90.     bottomBorder2.Append(color6);  
    91.     DiagonalBorder diagonalBorder2 = new DiagonalBorder();  
    92.    
    93.     border2.Append(leftBorder2);  
    94.     border2.Append(rightBorder2);  
    95.     border2.Append(topBorder2);  
    96.     border2.Append(bottomBorder2);  
    97.     border2.Append(diagonalBorder2);  
    98.    
    99.     borders1.Append(border1);  
    100.     borders1.Append(border2);  
    101.    
    102.     CellStyleFormats cellStyleFormats1 = new CellStyleFormats() { Count = (UInt32Value)1U };  
    103.     CellFormat cellFormat1 = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U };  
    104.    
    105.     cellStyleFormats1.Append(cellFormat1);  
    106.    
    107.     CellFormats cellFormats1 = new CellFormats() { Count = (UInt32Value)3U };  
    108.     CellFormat cellFormat2 = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U };  
    109.     CellFormat cellFormat3 = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)1U, FormatId = (UInt32Value)0U, ApplyBorder = true };  
    110.            CellFormat cellFormat4 = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)1U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)1U, FormatId = (UInt32Value)0U, ApplyFont = true, ApplyBorder = true };  
    111.    
    112.     cellFormats1.Append(cellFormat2);  
    113.     cellFormats1.Append(cellFormat3);  
    114.     cellFormats1.Append(cellFormat4);  
    115.    
    116.     CellStyles cellStyles1 = new CellStyles() { Count = (UInt32Value)1U };  
    117.     CellStyle cellStyle1 = new CellStyle() { Name = «Normal», FormatId = (UInt32Value)0U, BuiltinId = (UInt32Value)0U };  
    118.    
    119.     cellStyles1.Append(cellStyle1);  
    120.     DifferentialFormats differentialFormats1 = new DifferentialFormats() { Count = (UInt32Value)0U };  
    121.    TableStyles tableStyles1 = new TableStyles() { Count = (UInt32Value)0U, DefaultTableStyle = «TableStyleMedium2», DefaultPivotStyle = «PivotStyleLight16» };  
    122.    
    123.     StylesheetExtensionList stylesheetExtensionList1 = new StylesheetExtensionList();  
    124.    
    125.     StylesheetExtension stylesheetExtension1 = new StylesheetExtension() { Uri = «{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}» };  
    126.     stylesheetExtension1.AddNamespaceDeclaration(«x14»«http://schemas.microsoft.com/office/spreadsheetml/2009/9/main»);  
    127.            X14.SlicerStyles slicerStyles1 = new X14.SlicerStyles() { DefaultSlicerStyle = «SlicerStyleLight1» };  
    128.    
    129.     stylesheetExtension1.Append(slicerStyles1);  
    130.    
    131.     StylesheetExtension stylesheetExtension2 = new StylesheetExtension() { Uri = «{9260A510-F301-46a8-8635-F512D64BE5F5}» };  
    132.     stylesheetExtension2.AddNamespaceDeclaration(«x15»«http://schemas.microsoft.com/office/spreadsheetml/2010/11/main»);  
    133.     X15.TimelineStyles timelineStyles1 = new X15.TimelineStyles() { DefaultTimelineStyle = «TimeSlicerStyleLight1» };  
    134.    
    135.     stylesheetExtension2.Append(timelineStyles1);  
    136.    
    137.     stylesheetExtensionList1.Append(stylesheetExtension1);  
    138.     stylesheetExtensionList1.Append(stylesheetExtension2);  
    139.    
    140.     stylesheet1.Append(fonts1);  
    141.     stylesheet1.Append(fills1);  
    142.     stylesheet1.Append(borders1);  
    143.     stylesheet1.Append(cellStyleFormats1);  
    144.     stylesheet1.Append(cellFormats1);  
    145.     stylesheet1.Append(cellStyles1);  
    146.     stylesheet1.Append(differentialFormats1);  
    147.     stylesheet1.Append(tableStyles1);  
    148.     stylesheet1.Append(stylesheetExtensionList1);  
    149.    
    150.     workbookStylesPart1.Stylesheet = stylesheet1;  
    151. }  
  • Write a function for generating workbook content, as shown below.

    1. private void GenerateWorkbookPartContent(WorkbookPart workbookPart1)  
    2. {  
    3.     Workbook workbook1 = new Workbook();  
    4.     Sheets sheets1 = new Sheets();  
    5.     Sheet sheet1 = new Sheet() { Name = «Sheet1», SheetId = (UInt32Value)1U, Id = «rId1» };  
    6.     sheets1.Append(sheet1);  
    7.     workbook1.Append(sheets1);  
    8.     workbookPart1.Workbook = workbook1;  
    9. }  
  • Write the below functions to add data into Excel.
    1. private SheetData GenerateSheetdataForDetails(TestModelList data)  
    2. {  
    3.     SheetData sheetData1 = new SheetData();  
    4.     sheetData1.Append(CreateHeaderRowForExcel());  
    5.   
    6.     foreach (TestModel testmodel in data.testData)  
    7.     {  
    8.         Row partsRows = GenerateRowForChildPartDetail(testmodel);  
    9.         sheetData1.Append(partsRows);  
    10.     }  
    11.     return sheetData1;  
    12. }  

    The below function is created for creating Header rows in Excel.

    1. private Row CreateHeaderRowForExcel()  
    2. {  
    3.     Row workRow = new Row();  
    4.     workRow.Append(CreateCell(«Test Id», 2U));  
    5.     workRow.Append(CreateCell(«Test Name», 2U));   
    6.     workRow.Append(CreateCell(«Test Description», 2U));  
    7.     workRow.Append(CreateCell(«Test Date», 2U));                   
    8.     return workRow;  

    Below function is used for generating child rows.

    1. private Row GenerateRowForChildPartDetail(TestModel testmodel)  
    2. {  
    3.     Row tRow = new Row();  
    4.     tRow.Append(CreateCell(testmodel.TestId.ToString()));  
    5.     tRow.Append(CreateCell(testmodel.TestName));  
    6.     tRow.Append(CreateCell(testmodel.TestDesc));  
    7.     tRow.Append(CreateCell(testmodel.TestDate.ToShortDateString()));  
    8.      
    9.     return tRow;  
    10. }  

    Below function is used for creating cell by passing only cell data and it adds default style.

    1. private Cell CreateCell(string text)  
    2. {  
    3.     Cell cell = new Cell();  
    4.     cell.StyleIndex = 1U;  
    5.     cell.DataType = ResolveCellDataTypeOnValue(text);  
    6.     cell.CellValue = new CellValue(text);  
    7.     return cell;  
    8. }  

    Below function is used for creating a cell by passing cell data and cell style.

    1. private Cell CreateCell(string text, uint styleIndex)  
    2. {  
    3.     Cell cell = new Cell();  
    4.     cell.StyleIndex = styleIndex;  
    5.     cell.DataType = ResolveCellDataTypeOnValue(text);  
    6.     cell.CellValue = new CellValue(text);  
    7.     return cell;  
    8. }  

    Below function is created for resolving the data type of numeric value in a cell.

    1. private EnumValue<CellValues> ResolveCellDataTypeOnValue(string text)  
    2. {  
    3.     int intVal;  
    4.     double doubleVal;  
    5.     if (int.TryParse(text, out intVal) || double.TryParse(text, out doubleVal))  
    6.     {  
    7.         return CellValues.Number;  
    8.     }  
    9.     else  
    10.     {  
    11.         return CellValues.String;  
    12.     }  
    13. }  

Now, let’s call the main function for generating Excel file into main method with passing our model into it.

  1. static void Main(string[] args)  
  2.  {  
  3.   
  4.      TestModelList tmList = new TestModelList();  
  5.      tmList.testData = new List<TestModel>();  
  6.      TestModel tm = new TestModel();  
  7.      tm.TestId = 1;  
  8.      tm.TestName = «Test1»;  
  9.      tm.TestDesc = «Tested 1 time»;  
  10.      tm.TestDate = DateTime.Now.Date;  
  11.      tmList.testData.Add(tm);  
  12.   
  13.      TestModel tm1 = new TestModel();  
  14.      tm1.TestId = 2;  
  15.      tm1.TestName = «Test2»;  
  16.      tm1.TestDesc = «Tested 2 times»;  
  17.      tm1.TestDate = DateTime.Now.AddDays(-1);  
  18.      tmList.testData.Add(tm1);  
  19.   
  20.      TestModel tm2 = new TestModel();  
  21.      tm2.TestId = 3;  
  22.      tm2.TestName = «Test3»;  
  23.      tm2.TestDesc = «Tested 3 times»;  
  24.      tm2.TestDate = DateTime.Now.AddDays(-2);  
  25.      tmList.testData.Add(tm2);  
  26.   
  27.      TestModel tm3 = new TestModel();  
  28.      tm3.TestId = 4;  
  29.      tm3.TestName = «Test4»;  
  30.      tm3.TestDesc = «Tested 4 times»;  
  31.      tm3.TestDate = DateTime.Now.AddDays(-3);  
  32.      tmList.testData.Add(tm);  
  33.   
  34.      Program p = new ExelConvertDemo.Program();  
  35.      p.CreateTaktExcelFile(tmList, «d:\»);  
  36.  }  

Output of the Excel file would be similar to the below image.

Creating Excel File Using OpenXML

Понравилась статья? Поделить с друзьями:
  • Документ office excel 2010
  • Документ ms word 2011
  • Документ ms office excel xls
  • Документ ms excel файл с расширением это
  • Документ microsoft word это файл с расширением