Загрузка данных в шаблон excel

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

Способ 1: Встроенный поиск в Microsoft Excel

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

  1. Если вы уже запустили Эксель или создали новый лист, на верхней панели выберите вкладку «Файл».Переход в раздел Файл для использования шаблонов в Microsoft Excel

  2. По умолчанию тут всего два базовых шаблона, поэтому лучше открыть полный список, щелкнув по кнопке «Другие шаблоны».Открытие полного списка для использования шаблонов в Microsoft Excel

  3. Ознакомьтесь с названиями, применениями и миниатюрами популярных заготовок. Среди них есть таблицы для ведения бюджета, расписания, календари и многое другое, что может пригодиться как обычному юзеру, так и сотрудникам компаний.Ознакомление со списком для использования шаблонов в Microsoft Excel

  4. Если вас интересует конкретная категория заготовок, нажмите кнопку «Поиск шаблонов в сети» или следуйте подсказкам в списке ниже.Использование поиска для использования шаблонов в Microsoft Excel

  5. Теперь результаты будут сформированы исключительно из вашего запроса. Точно так же отображаются названия и миниатюры, что позволит составить оценочное суждение о шаблоне и решить, стоит ли загружать его для дальнейшего использования.Результаты поиска для использования шаблонов в Microsoft Excel

  6. Нажмите по шаблону дважды левой кнопкой мыши, чтобы выбрать его. В новом окне подтвердите создание.Кнопка создания документа для использования шаблонов в Microsoft Excel

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

  8. При переключении между листами вы часто будете видеть дополнительную информацию, которая тоже поможет разобраться с содержимым таблицы и понять, как ее применить для своих целей.Переключение между листами в электронной таблице для использования шаблонов в Microsoft Excel

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

Комьюнити теперь в Телеграм

Подпишитесь и будьте в курсе последних IT-новостей

Подписаться

Способ 2: Официальный сайт Microsoft

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

  1. Откройте главную страницу сайта Office.com и на верхней панели выберите пункт «Шаблоны».Переход в раздел на официальном сайте для использования шаблонов в Microsoft Excel

  2. Если вам уже известна категория заготовки, которую вы желаете отыскать и открыть через Microsoft Excel, активируйте строку поиска и введите свой запрос.Использование поиска на официальном сайте для использования шаблонов в Microsoft Excel

  3. В противном случае предлагаем ознакомиться со всеми результатами категорий, выбрав одну из них среди плиток ниже.Выбор категории на официальном сайте для использования шаблонов в Microsoft Excel

  4. Премиум-шаблоны будут отмечены синим ярлыком с бриллиантом сверху. Можете развернуть весь список платных заготовок и посмотреть, чем они отличаются от бесплатных и могут ли оказаться полезными для вас.Просмотр премиум-вариантов для использования шаблонов в Microsoft Excel

  5. Большинство заготовок распространяются свободно. Их действительно тысячи, на самые разные темы. Предлагаю убедиться в этом самостоятельно, пролистав выдачу на официальном сайте.Список бесплатных вариантов для использования шаблонов в Microsoft Excel

  6. После выбора шаблона нажмите «Скачать», чтобы получить его в виде файла в соответствующем формате.Кнопка скачивания на официальном сайте для использования шаблонов в Microsoft Excel

  7. Ожидайте окончания загрузки и откройте шаблон в Excel для проверки листов и дальнейшего редактирования.Открытие полученной таблицы для использования шаблонов в Microsoft Excel

Способ 3: Сторонние сайты с шаблонами

Энтузиасты и владельцы тематических сайтов предлагают альтернативные варианты шаблонов, размещая их в свободном доступе. Многие такие таблицы являются авторскими, узконаправленными или имеющими другие особенности, из-за которых они не были добавлены в общую библиотеку. Если вы решите использовать сторонние сайты, главное – скачивайте файлы исключительно Excel-формата, чтобы не нарваться на вирусы.

  1. Поиск шаблонов на таких сайтах выглядит точно так же, как это было показано выше. Разве что иногда разработчики таких веб-ресурсов дают больше информации о файлах перед их скачиванием.Поиск на сторонних сайтах для использования шаблонов в Microsoft Excel

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

  3. На странице с шаблоном нужно отыскать кнопку скачивания.Скачивание файла со стороннего сайта для использования шаблонов в Microsoft Excel

  4. Иногда шаблон будет открыт для предпросмотра через Google Диск, что дополнительно позволяет убедиться в его безопасности. Если как раз произошло такое открытие, для скачивания файла нажмите кнопку со стрелкой вниз на верхней панели.Предпросмотр на стороннем сайте для использования шаблонов в Microsoft Excel

Экспорт файла как шаблона

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

  1. Откройте электронную таблицу, из которой хотите сделать шаблон. На панели сверху выберите раздел «Файл».Переход в раздел Файл для экспорта шаблонов в Microsoft Excel

  2. Появится дополнительное окно, в котором на левой панели нужно найти пункт «Экспорт».Открытие меню сохранения для экспорта шаблонов в Microsoft Excel

  3. После нажатия по нему появится два варианта выбора сохранения, вам следует указать «Изменить тип файла».Переход к изменению формата файла для экспорта шаблонов в Microsoft Excel

  4. Остается только выбрать формат шаблона, отыскав его в общем списке. Кликните по данному пункту дважды левой кнопкой мыши.Выбор формата шаблона для экспорта в Microsoft Excel

  5. Задайте для файла шаблона название и сохраните в любом месте на компьютере, которое посчитаете удобным.Ввод названия файла для экспорта шаблонов в Microsoft Excel

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

Очень часто бывает такое, что нужно сформировать документы по определенному шаблону, на основе каких-то данных, например, по каждому сотруднику или по каждому лицевому счету. И делать это вручную бывает достаточно долго, когда этих самых сотрудников или лицевых счетов много, поэтому сегодня мы рассмотрим примеры реализации таких задач в Excel с помощью макроса написанного на VBA Excel.

Немного поясню задачу, допустим, нам необходимо сформировать какие-то специфические документы по шаблону массово, т.е. в итоге их получится очень много, как я уже сказал выше, например, по каждому сотруднику. И это нужно сделать непосредственно в Excel, если было бы можно это сделать в Word, то мы бы это сделали через «Слияние», но нам нужно именно в Excel, поэтому для этой задачи мы будем писать макрос.

Мы с Вами уже выгружали данные по шаблону через клиент Access из базы MSSql 2008 в Word и Excel вот в этой статье —  Выгрузка данных из Access в шаблон Word и Excel. Но сейчас допустим, у нас данные располагаются в базе, в клиенте которой нельзя или слишком трудоемко реализовать такую задачу, поэтому мы просто выгрузим необходимые данные в Excel и на основе таких данных по шаблону сформируем наши документы.

В нашем примере мы, конечно, будем использовать простой шаблон, только для того чтобы это было просто наглядно и понятно (только в качестве примера), у Вас в свою очередь шаблон будет, как мне кажется намного сложней.

Напомню, что на данном сайте тема VBA Excel уже затрагивалась, например, в материале – Запрет доступа к листу Excel с помощью пароля

И так приступим!

Реализовывать нашу задачу будем на примере «Электронной карточке сотрудника» (я это просто придумал:), хотя может такие и на самом деле есть), т.е. документ в котором хранится личные данные сотрудника вашего предприятия, в определенном виде, именно в Excel.

Примечание! Программировать будем в Excel 2010.

И для начала приведем исходные данные, т.е. сами данные и шаблон

Данные.

Скриншот 1

Лист, на котором расположены эти данные так и назовем «Данные»

Шаблон.

Скриншот 2

Лист, на котором расположен шаблон, тоже так и назовем «Шаблон»

Далее, нам необходимо присвоить имена полей для вставки, так более удобней к ним обращаться чем, например, по номеру ячейки.

Это делается очень просто, выделяете необходимую ячейку или диапазон, и жмете правой кнопкой мыши и выбираете «Присвоить имя», пишите имя ячейки и жмете «ОК»

Курс по SQL для начинающих

Скриншот 3

Свои поля я назвал следующим образом:

  • ФИО – fio;
  • № — number;
  • Должность – dolgn;
  • Адрес проживания – addres;
  • Тел. № сотрудника – phone;
  • Комментарий – comment.

Код макроса на VBA Excel

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

Примечание! По умолчанию данной вкладке в Excel 2010 может и не быть, чтобы ее отобразить нажмите правой кнопкой по ленте пункт меню «Настройка ленты»

Скриншот 4

затем, в правой области поставьте галочку напротив пункта «Разработчик»

Скриншот 5

После вкладка разработчик станет отображаться на ленте.

Далее, когда Вы откроете вкладку разработчик и нажмете кнопку «Макросы» у Вас отобразится окно создания макроса, Вы пишите название макросы и жмете «создать».

Скриншот 6

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

Sub Карточка()
'Книга
NewBook = ""
' Путь, где будут храниться наши карточки
' Т.е. в той папке, откуда запустился файл с макросом
Path = ThisWorkbook.Path
' Выбираем лист с данными
Sheets("Данные").Select
' Запускаем цикл, скажем на 100000 итераций
' Начиная со второй строки, не учитывая заголовок
For i = 2 To 100000
' Выйдем из него, когда фамилии закончатся, т.е. строки
If Cells(i, 1).Value = "" Then
        i = 100000
    Exit For
End If
' Имя файла карточки, назовем по фамилии
Name_file = Path & "" & Sheets("Данные").Cells(i, 1).Value & ".xls"
‘Выбираем лист с шаблоном
Sheets("Шаблон").Select
' Присваиваем значения нашим ячейкам, по именам которые мы задавали
    Range("fio").Value = Sheets("Данные").Cells(i, 1).Value & " " & _
        Sheets("Данные").Cells(i, 2).Value & " " & Sheets("Данные").Cells(i, 3).Value
    Range("number").Value = Sheets("Данные").Cells(i, 4).Value
    Range("addres").Value = Sheets("Данные").Cells(i, 5).Value
    Range("dolgn").Value = Sheets("Данные").Cells(i, 6).Value
    Range("phone").Value = Sheets("Данные").Cells(i, 7).Value
    Range("comment").Value = Sheets("Данные").Cells(i, 8).Value
    ' Копируем все
    Cells.Select
    Selection.Copy
    ' Создаем новую книгу или делаем ее активной 
    If NewBook = "" Then
        Workbooks.Add
        NewBook = ActiveWorkbook.Name
    Else
        Workbooks(NewBook).Activate
        Cells(1, 1).Select
    End If
    ' Вставляем данные в эту книгу
    Application.DisplayAlerts = False
    ActiveSheet.Paste
    Application.CutCopyMode = False
    ' Сохраняем с нашим новым названием
    ActiveWorkbook.SaveAs Filename:= _
    Name_file, FileFormat:=xlExcel8, _
    Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
    CreateBackup:=False
    NewBook = ActiveWorkbook.Name
    Application.DisplayAlerts = True
    ' Снова активируем файл с макросом и выбираем лист
    Workbooks("Макрос.xls").Activate
    Sheets("Данные").Select
' Переходим к следующей строке
Next i
' Закроем книгу
Workbooks(NewBook).Close
' Выведем сообщение об окончании
MsgBox ("Выполнено!")
End Sub

Теперь осталось выполнить этот макрос, для этого откройте вкладку разработчик->макросы->выполнить наш макрос:

Скриншот 7

и после выполнения у Вас в той же папке появится вот такие файлы

Скриншот 8

Вот с таким содержимым:

Скриншот 9

Для удобства можете на листе с данными создать кнопку и задать ей событие выполнить наш только что созданный макрос, и после чего простым нажатием выполнять этот макрос. Вот и все! Удачи!

Время на прочтение
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-е.

   SSkripagan

25.12.08 — 08:03

Товарищи.

Подскажите красивое решение как выгрузить ТЧ документа в файл шаблон excel.

Интересует вопрос добавления новых строк в exel и заполнение полей данными

   OFF

1 — 25.12.08 — 08:20

СоздатьОбъект(«Excel.Application»); ?

   SSkripagan

2 — 25.12.08 — 08:33

(1) Далее вариант

Через    

МассивКОМ = Новый COMSafeArray(«VT_VARIANT», ВсегоКолонок, ВсегоСтрок);

Не катит.

Подумал просто черещ копирование строк

Через макрос получилось нечто такое

  Range(«B5:E5»).Select

  Selection.Copy Destination:=Range(«B6:E6»)

  Range(«B6»).Select

  ActiveCell.FormulaR1C1 = «123»

  Range(«C6»).Select

  ActiveCell.FormulaR1C1 = «Иванов»

   Range(«D6»).Select

   ActiveCell.FormulaR1C1 = «500»

   Range(«E6»).Select

   ActiveCell.FormulaR1C1 = «24»

   Range(«E11»).Select

Но может можно как то проще ?

   SSkripagan

3 — 25.12.08 — 08:57

ап

   Нуф-Нуф

4 — 25.12.08 — 09:03

чет не прет тебе с ветками…

   vde69

5 — 25.12.08 — 09:05

   SSkripagan

6 — 25.12.08 — 09:06

В итоге вопрос сводится к тому как добавить в икселе строку и заполнить её значениями выборки. Не могу сообразить

   SSkripagan

7 — 25.12.08 — 09:09

(5) Все классно. Мне бы не такое универсальное и для восьмерки

   vde69

8 — 25.12.08 — 09:11

(7) переделай, там делов на 30 минут

   SSkripagan

9 — 25.12.08 — 09:19

(8) Уже начал

   SSkripagan

10 — 25.12.08 — 13:26

Мужики. Ну все практически переписал

Но

Хоть убей не копируется  строка методом

   Для е1 = 2 по ТаблицаРезультата.Количество() Цикл  

       Д = СписокЗагрузки.ЛистШаблона.Rows(«» + Смещение + «:» + Смещение);

       Д.Select();

       Д.Copy();

       Д.Insert();

   КонецЦикла;

ВЫваливается с ошибкой метода Range

   SSkripagan

11 — 25.12.08 — 13:32

Произошла исключительная ситуация (Microsoft Office Excel): Метод Select из класса Range завершен неверно

   Нуф-Нуф

12 — 25.12.08 — 13:37

апну чтоли

   SSkripagan

13 — 25.12.08 — 13:39

(8) Дмитрий. Я как понял обработка (5) ваша.

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

   vde69

14 — 25.12.08 — 13:43

там есть ошибка маленькая, счас найду свежий файл

   SSkripagan

15 — 25.12.08 — 13:43

(14) Я там уже 2 нашел :-))

Скажите про копирование строки плиз. Как правильно ?

   vde69

16 — 25.12.08 — 13:45

Смещение = СписокПараметровФайла.Получить(«СтрокаШаблонТЧ»);

   СписокЗагрузки.Получить(«ЛистШаблона»).Select();    

   Если ТЗ.КоличествоСтрок() = 0 Тогда

       Д = СписокЗагрузки.Получить(«ЛистШаблона»).Rows(«» + Смещение + «:» + Смещение);

       Д.Select();

       Д.Delete();

   Иначе

       Для е1 = 2 по ТЗ.КоличествоСтрок() Цикл  

           Д = СписокЗагрузки.Получить(«ЛистШаблона»).Rows(«» + Смещение + «:» + Смещение);

           Д.Select();

           Д.Copy();

           Д.Insert();

       КонецЦикла;

   КонецЕсли;

обращаю внимание на строку №2

для копирования колонок надо Rows заменить

   SSkripagan

17 — 25.12.08 — 14:00

(16) Спасибо заработало.

Тока физический смысл так и не понял :-(

   vde69

18 — 25.12.08 — 14:02

(17) у тебя в екселевском шаблоне активная страница была другая.

   SSkripagan

19 — 25.12.08 — 14:03

(18) и Select сделал шаблон активным

   vde69

20 — 25.12.08 — 14:04

(19) там еще где-то я чего-то правил, уже не помню, новый файл выложил

  

SSkripagan

21 — 25.12.08 — 14:50

Всем спасибо за содействие (vde69 в частности).

Релизована полная аналогия для восьмерки

Шаблон формата Excel может быть как библиотекой наборов стилей форматирования, так и готовым документом с таблицами, данными, форматами и графиками. В шаблоны-документы достаточно только ввести свои данные, чтобы получить готовый, тематически стильно оформленный, презентабельный отчет. Например, «Семейный бюджет» – очень полезный встроенный шаблон в Excel.

Создание шаблона в Excel

Создадим свой новый шаблон, в котором следует использовать стили форматирования. Как форматировать с помощью стилей мы знаем из предыдущего урока: стили ячеек и средства управления ими. Чтобы сделать шаблон в Excel, выполним определенный ряд действий, которые послужат практическим примером для решения данной задачи:

  1. Сначала нужно сделать шаблон таблицы Excel и график, как показано ниже на рисунке. И присвойте ей пользовательский стиль форматирования.
  2. Статьи расходов.

  3. Сохраняем документ как шаблон: «Файл»-«Сохранить как». В окне сохранения можно указать любую папку, так как Excel потом автоматически перенесет этот файл в специальную директорию для хранения нестандартных шаблонов.
  4. В поле тип файла следует указать «Шаблоны формата Microsoft Office Excel *.xltx». Заметьте, как только мы выбираем этот тип файла, автоматически открывается папка «Шаблоны» в окне сохранения документа.
  5. Тип файла.

  6. В поле: «Имя файла» введите любое название шаблона. Например, «мои расходы». И жмите СОХРАНИТЬ.
  7. После сохранения закройте документ.

Теперь чтобы использовать наш шаблон достаточно выбрать меню: «Файл»-«Создать»-«Мои шаблоны». Выберите свой шаблон «мои расходы».

Мои шаблоны.

Откройте и сохраните этот документ как обычный файл в формате *.xlsx. А теперь обратите внимание на то, что наш пользовательский стиль так же сохранен в данной книге.

Таким образом, у вас есть готовая форма для быстрого создания отчетов, в которой нужно только изменять данные и не нужно ничего форматировать. Это очень удобно и продуктивно. Используйте возможности шаблонов по максимуму!



Создание файла по шаблону Excel

Можно установить свой пользовательский шаблон, по которому будет оформлен и отформатирован документ при каждом запуске программы Excel. Для этого следует сохранить файл с расширением *.xlsx в папке XLSTART. Данная папка создается при установке программы Excel. Чтобы легко найти путь к ней следует перейти в режим VisualBasic (Alt+F11) и открыть окно: «View»-«Immediate». А там следует набрать код: ? application.StartupPath и нажать Enter. Ниже отобразиться путь:

C:Usersимя пользователяAppDataRoamingMicrosoftExcelXLSTART

XLSTART.

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

Теперь при каждой загрузке программы будет открыт файл который лежит в этой папке. Более того если вы сохраните там несколько документов, то все они будут открыты при каждой запуске программы.

Полезный совет! Если в папке XLSTART сохранить отформатированный шаблон с именем Лист.xltx. То каждый новый созданный лист будет иметь такой же формат как Лист.xltx. При том не зависимо, в какой способ создан новый лист, через меню или комбинацией горячих клавиш SHIFT+F11. Формат будет один и тот же. А чтобы отменить такую функцию нужно просто удалить этот шаблон из XLSTART.

Форматирование документов – это важный, но очень утомительный процесс. Для его автоматизации существует несколько полезных инструментов такие как: темы, стили и шаблоны. Каждый из них обладает своими преимуществами и недостатками. Например, самый простой способ автоматизации форматирования – это стили. Они облегчаю пользователю процесс форматирования, но могут быть сохранены только в рамках одной книги. Да созданные или измененные пользователем стили можно скопировать в другую книгу. Или создать отдельную, специальную книгу с целым набором свих пользовательских стилей, чтобы копировать их в другие документы, но это крайне неудобно. Для решения такой задачи лучше использовать шаблоны.

Создание темы документа для автоматического форматирования

Тема Excel – это собрание стилей, цветов, шрифтов и много разных графических свойств форматирования, которые легко можем менять в пару кликов мышкой для изменения стильного оформления документа. Темы стали доступны начиная с 2007-й версии и новее. Их можно встретить и в других продуктах входящих в пакет MS Office.

Для примера возьмем простой не форматированный документ и будем присваивать ему разные темы пока не выберем подходящую к данным. Заодно посмотрим, что произойдет выбрать другую тему Excel:

  1. Создайте новую книгу и заполните ее данными (начиная со столбца H) так как показано на рисунке:
  2. Статьи расходов.

  3. Выберите инструмент: «Разметка страницы»-«Темы».
  4. В выпадающем списке наводите курсор мышки на разные темы и обратите внимание на то, как меняется стиль оформления данных документа.
  5. Статьи расходов.

  6. Щелкните по подходящей теме, которая на Ваш взгляд наиболее подходит к данному документу.

Внимание! Темы присваиваются к целому документу. Поэтому нельзя для разных листов задавать разные темы форматирования.

Пользователь имеет возможность самостоятельно создавать и редактировать любую тему. Для этого доступны 3 инструмента, которые находятся рядом возле тем:

  • цвета;
  • шрифты;
  • эффекты.

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

Шрифты.

Как только вы сохраните новый набор шрифтов и/или цветов под своим названием, тогда она будет доступна в разделе тем как для Excel, так и для других программ из пакета MS Office (Word, PowerPoint и др.).

Понравилась статья? Поделить с друзьями:
  • Загрузка данных в файл excel к другому файлу excel
  • Загрузка данных в excel по номенклатуре
  • Загрузка всего файла excel в 1с
  • Загрузка в access excel файлов
  • Загрузка word при загрузке windows