Данная статья будет полезна не только начинающим, но и тем, кто уже освоился в Microsoft Excel. В ней я расскажу обо всех известных методах поиска и использования шаблонов, а также покажу, как самостоятельно экспортировать таблицу как шаблон, чтобы выложить ее в открытый доступ. Однако начнем с методов поиска заготовок на любую тему.
Способ 1: Встроенный поиск в Microsoft Excel
Использование встроенного поиска по шаблонам в Экселе – самый простой и быстрый метод нахождения подходящей для вас заготовки, которая поможет решить задачи разной сложности без траты времени на самостоятельное оформление и создание функций. Для перехода к меню с шаблонами понадобится выполнить всего несколько простых действий:
-
Если вы уже запустили Эксель или создали новый лист, на верхней панели выберите вкладку «Файл».
-
По умолчанию тут всего два базовых шаблона, поэтому лучше открыть полный список, щелкнув по кнопке «Другие шаблоны».
-
Ознакомьтесь с названиями, применениями и миниатюрами популярных заготовок. Среди них есть таблицы для ведения бюджета, расписания, календари и многое другое, что может пригодиться как обычному юзеру, так и сотрудникам компаний.
-
Если вас интересует конкретная категория заготовок, нажмите кнопку «Поиск шаблонов в сети» или следуйте подсказкам в списке ниже.
-
Теперь результаты будут сформированы исключительно из вашего запроса. Точно так же отображаются названия и миниатюры, что позволит составить оценочное суждение о шаблоне и решить, стоит ли загружать его для дальнейшего использования.
-
Нажмите по шаблону дважды левой кнопкой мыши, чтобы выбрать его. В новом окне подтвердите создание.
-
Вы будете перенаправлены в лист со стандартным содержимым заготовки. Прочитайте отобразившиеся на экране подсказки, чтобы понять, какие ячейки нужно редактировать, а какие не стоит, чтобы не нарушать работу созданных формул.
-
При переключении между листами вы часто будете видеть дополнительную информацию, которая тоже поможет разобраться с содержимым таблицы и понять, как ее применить для своих целей.
Это самый базовый и простой метод того, как вы можете находить уже готовые таблицы для разных задач, смотреть, какие функции в них используются, как реализовано форматирование и многое другое.
Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей
Подписаться
Способ 2: Официальный сайт Microsoft
По сути, этот метод повторяет предыдущий, однако имеет свои особенности. Иногда браузером для поиска пользоваться проще, дополнительно на странице с шаблоном можно прочитать его описание и рассмотреть стандартный лист более детально. Вместе с этим разработчики предложат приобрести премиум-шаблоны, которые по своей сложности и детализации отличаются от стандартных.
-
Откройте главную страницу сайта Office.com и на верхней панели выберите пункт «Шаблоны».
-
Если вам уже известна категория заготовки, которую вы желаете отыскать и открыть через Microsoft Excel, активируйте строку поиска и введите свой запрос.
-
В противном случае предлагаем ознакомиться со всеми результатами категорий, выбрав одну из них среди плиток ниже.
-
Премиум-шаблоны будут отмечены синим ярлыком с бриллиантом сверху. Можете развернуть весь список платных заготовок и посмотреть, чем они отличаются от бесплатных и могут ли оказаться полезными для вас.
-
Большинство заготовок распространяются свободно. Их действительно тысячи, на самые разные темы. Предлагаю убедиться в этом самостоятельно, пролистав выдачу на официальном сайте.
-
После выбора шаблона нажмите «Скачать», чтобы получить его в виде файла в соответствующем формате.
-
Ожидайте окончания загрузки и откройте шаблон в Excel для проверки листов и дальнейшего редактирования.
Способ 3: Сторонние сайты с шаблонами
Энтузиасты и владельцы тематических сайтов предлагают альтернативные варианты шаблонов, размещая их в свободном доступе. Многие такие таблицы являются авторскими, узконаправленными или имеющими другие особенности, из-за которых они не были добавлены в общую библиотеку. Если вы решите использовать сторонние сайты, главное – скачивайте файлы исключительно Excel-формата, чтобы не нарваться на вирусы.
-
Поиск шаблонов на таких сайтах выглядит точно так же, как это было показано выше. Разве что иногда разработчики таких веб-ресурсов дают больше информации о файлах перед их скачиванием.
-
Многие размещают целые инструкции, в которых рассказано о каждом составляющем шаблона, обо всех функциях, их работе и взаимосвязях. Это будет очень полезно тем, кто ищет заготовку для Excel, чтобы по ней выучить новые функции и узнать, как правильно их использовать.
-
На странице с шаблоном нужно отыскать кнопку скачивания.
-
Иногда шаблон будет открыт для предпросмотра через Google Диск, что дополнительно позволяет убедиться в его безопасности. Если как раз произошло такое открытие, для скачивания файла нажмите кнопку со стрелкой вниз на верхней панели.
Экспорт файла как шаблона
Допустим, вы хотите выложить свой шаблон в официальной библиотеке от Microsoft или просто в открытый доступ, чтобы другие пользователи могли с ним взаимодействовать. Конечно, в таком случае можно использовать сохранение в простом XLSX-формате, но это не совсем актуально для такого рода проектов. В Экселе есть специальный формат экспорта шаблонов, перевод в который осуществляется следующим образом:
-
Откройте электронную таблицу, из которой хотите сделать шаблон. На панели сверху выберите раздел «Файл».
-
Появится дополнительное окно, в котором на левой панели нужно найти пункт «Экспорт».
-
После нажатия по нему появится два варианта выбора сохранения, вам следует указать «Изменить тип файла».
-
Остается только выбрать формат шаблона, отыскав его в общем списке. Кликните по данному пункту дважды левой кнопкой мыши.
-
Задайте для файла шаблона название и сохраните в любом месте на компьютере, которое посчитаете удобным.
Шаблоны в Microsoft Excel – очень интересный тип документов, ведь с их помощью можно начать работу с электронной таблицей не с нуля, а с уже имеющимися общими данными и красивым оформлением. Используйте один из методов поиска заготовок или экспортируйте свои шаблоны так, как это было показано выше.
Очень часто бывает такое, что нужно сформировать документы по определенному шаблону, на основе каких-то данных, например, по каждому сотруднику или по каждому лицевому счету. И делать это вручную бывает достаточно долго, когда этих самых сотрудников или лицевых счетов много, поэтому сегодня мы рассмотрим примеры реализации таких задач в Excel с помощью макроса написанного на VBA Excel.
Немного поясню задачу, допустим, нам необходимо сформировать какие-то специфические документы по шаблону массово, т.е. в итоге их получится очень много, как я уже сказал выше, например, по каждому сотруднику. И это нужно сделать непосредственно в Excel, если было бы можно это сделать в Word, то мы бы это сделали через «Слияние», но нам нужно именно в Excel, поэтому для этой задачи мы будем писать макрос.
Мы с Вами уже выгружали данные по шаблону через клиент Access из базы MSSql 2008 в Word и Excel вот в этой статье — Выгрузка данных из Access в шаблон Word и Excel. Но сейчас допустим, у нас данные располагаются в базе, в клиенте которой нельзя или слишком трудоемко реализовать такую задачу, поэтому мы просто выгрузим необходимые данные в Excel и на основе таких данных по шаблону сформируем наши документы.
В нашем примере мы, конечно, будем использовать простой шаблон, только для того чтобы это было просто наглядно и понятно (только в качестве примера), у Вас в свою очередь шаблон будет, как мне кажется намного сложней.
Напомню, что на данном сайте тема VBA Excel уже затрагивалась, например, в материале – Запрет доступа к листу Excel с помощью пароля
И так приступим!
Реализовывать нашу задачу будем на примере «Электронной карточке сотрудника» (я это просто придумал:), хотя может такие и на самом деле есть), т.е. документ в котором хранится личные данные сотрудника вашего предприятия, в определенном виде, именно в Excel.
Примечание! Программировать будем в Excel 2010.
И для начала приведем исходные данные, т.е. сами данные и шаблон
Данные.
Лист, на котором расположены эти данные так и назовем «Данные»
Шаблон.
Лист, на котором расположен шаблон, тоже так и назовем «Шаблон»
Далее, нам необходимо присвоить имена полей для вставки, так более удобней к ним обращаться чем, например, по номеру ячейки.
Это делается очень просто, выделяете необходимую ячейку или диапазон, и жмете правой кнопкой мыши и выбираете «Присвоить имя», пишите имя ячейки и жмете «ОК»
Свои поля я назвал следующим образом:
- ФИО – fio;
- № — number;
- Должность – dolgn;
- Адрес проживания – addres;
- Тел. № сотрудника – phone;
- Комментарий – comment.
Код макроса на VBA Excel
Для того чтобы написать код макроса, открывайте на ленте вкладку «Разработчик», далее макросы.
Примечание! По умолчанию данной вкладке в Excel 2010 может и не быть, чтобы ее отобразить нажмите правой кнопкой по ленте пункт меню «Настройка ленты»
затем, в правой области поставьте галочку напротив пункта «Разработчик»
После вкладка разработчик станет отображаться на ленте.
Далее, когда Вы откроете вкладку разработчик и нажмете кнопку «Макросы» у Вас отобразится окно создания макроса, Вы пишите название макросы и жмете «создать».
После у Вас откроется окно редактора кода, где собственно мы и будем писать свой код 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
Теперь осталось выполнить этот макрос, для этого откройте вкладку разработчик->макросы->выполнить наш макрос:
и после выполнения у Вас в той же папке появится вот такие файлы
Вот с таким содержимым:
Для удобства можете на листе с данными создать кнопку и задать ей событие выполнить наш только что созданный макрос, и после чего простым нажатием выполнять этот макрос. Вот и все! Удачи!
Время на прочтение
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”.
И пример выгруженных данных (как это будет выглядеть в итоге, после выгрузки).
Ключевые слова:
DataField: — Означает, что на этом месте будут выведены наши банные из DataTable.
DataField:[название выводимого поля]
Label: — Означает, что на этом месте будут выводиться данные, которые надо вставить однократно из словаря
Label:[название ключа в словаре]
А это файл из которого мы будем считывать данные “C:LoadingReadMePlease.xlsx”.
Теперь создадим в VS2010, Решение в котором будет 4 проекта:
1) OpenXmlPrj – это консольный проект, для запуска теста.
2) Interfaces – это проект типа “Библиотека классов”, будет хранить наши интерфейсы данных для выгрузки.
3) Framework — это проект типа “Библиотека классов”, тут и будет происходить вся работа с Excel-ем.
4) Converter — это проект типа “Библиотека классов”, для конвертирования наших данных в DataTable (т.к. работа происходит с DataTable).
Теперь в проекте “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-е.
25.12.08 — 08:03
Товарищи.
Подскажите красивое решение как выгрузить ТЧ документа в файл шаблон excel.
Интересует вопрос добавления новых строк в exel и заполнение полей данными
1 — 25.12.08 — 08:20
СоздатьОбъект(«Excel.Application»); ?
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
Но может можно как то проще ?
3 — 25.12.08 — 08:57
ап
4 — 25.12.08 — 09:03
чет не прет тебе с ветками…
5 — 25.12.08 — 09:05
6 — 25.12.08 — 09:06
В итоге вопрос сводится к тому как добавить в икселе строку и заполнить её значениями выборки. Не могу сообразить
7 — 25.12.08 — 09:09
(5) Все классно. Мне бы не такое универсальное и для восьмерки
8 — 25.12.08 — 09:11
(7) переделай, там делов на 30 минут
9 — 25.12.08 — 09:19
(8) Уже начал
10 — 25.12.08 — 13:26
Мужики. Ну все практически переписал
Но
Хоть убей не копируется строка методом
Для е1 = 2 по ТаблицаРезультата.Количество() Цикл
Д = СписокЗагрузки.ЛистШаблона.Rows(«» + Смещение + «:» + Смещение);
Д.Select();
Д.Copy();
Д.Insert();
КонецЦикла;
ВЫваливается с ошибкой метода Range
11 — 25.12.08 — 13:32
Произошла исключительная ситуация (Microsoft Office Excel): Метод Select из класса Range завершен неверно
12 — 25.12.08 — 13:37
апну чтоли
13 — 25.12.08 — 13:39
(8) Дмитрий. Я как понял обработка (5) ваша.
Подскажите плиз с копированием колонок
14 — 25.12.08 — 13:43
там есть ошибка маленькая, счас найду свежий файл
15 — 25.12.08 — 13:43
(14) Я там уже 2 нашел :-))
Скажите про копирование строки плиз. Как правильно ?
16 — 25.12.08 — 13:45
Смещение = СписокПараметровФайла.Получить(«СтрокаШаблонТЧ»);
СписокЗагрузки.Получить(«ЛистШаблона»).Select();
Если ТЗ.КоличествоСтрок() = 0 Тогда
Д = СписокЗагрузки.Получить(«ЛистШаблона»).Rows(«» + Смещение + «:» + Смещение);
Д.Select();
Д.Delete();
Иначе
Для е1 = 2 по ТЗ.КоличествоСтрок() Цикл
Д = СписокЗагрузки.Получить(«ЛистШаблона»).Rows(«» + Смещение + «:» + Смещение);
Д.Select();
Д.Copy();
Д.Insert();
КонецЦикла;
КонецЕсли;
обращаю внимание на строку №2
для копирования колонок надо Rows заменить
17 — 25.12.08 — 14:00
(16) Спасибо заработало.
Тока физический смысл так и не понял
18 — 25.12.08 — 14:02
(17) у тебя в екселевском шаблоне активная страница была другая.
19 — 25.12.08 — 14:03
(18) и Select сделал шаблон активным
20 — 25.12.08 — 14:04
(19) там еще где-то я чего-то правил, уже не помню, новый файл выложил
SSkripagan
21 — 25.12.08 — 14:50
Всем спасибо за содействие (vde69 в частности).
Релизована полная аналогия для восьмерки
Шаблон формата Excel может быть как библиотекой наборов стилей форматирования, так и готовым документом с таблицами, данными, форматами и графиками. В шаблоны-документы достаточно только ввести свои данные, чтобы получить готовый, тематически стильно оформленный, презентабельный отчет. Например, «Семейный бюджет» – очень полезный встроенный шаблон в Excel.
Создание шаблона в Excel
Создадим свой новый шаблон, в котором следует использовать стили форматирования. Как форматировать с помощью стилей мы знаем из предыдущего урока: стили ячеек и средства управления ими. Чтобы сделать шаблон в Excel, выполним определенный ряд действий, которые послужат практическим примером для решения данной задачи:
- Сначала нужно сделать шаблон таблицы Excel и график, как показано ниже на рисунке. И присвойте ей пользовательский стиль форматирования.
- Сохраняем документ как шаблон: «Файл»-«Сохранить как». В окне сохранения можно указать любую папку, так как Excel потом автоматически перенесет этот файл в специальную директорию для хранения нестандартных шаблонов.
- В поле тип файла следует указать «Шаблоны формата Microsoft Office Excel *.xltx». Заметьте, как только мы выбираем этот тип файла, автоматически открывается папка «Шаблоны» в окне сохранения документа.
- В поле: «Имя файла» введите любое название шаблона. Например, «мои расходы». И жмите СОХРАНИТЬ.
- После сохранения закройте документ.
Теперь чтобы использовать наш шаблон достаточно выбрать меню: «Файл»-«Создать»-«Мои шаблоны». Выберите свой шаблон «мои расходы».
Откройте и сохраните этот документ как обычный файл в формате *.xlsx. А теперь обратите внимание на то, что наш пользовательский стиль так же сохранен в данной книге.
Таким образом, у вас есть готовая форма для быстрого создания отчетов, в которой нужно только изменять данные и не нужно ничего форматировать. Это очень удобно и продуктивно. Используйте возможности шаблонов по максимуму!
Создание файла по шаблону Excel
Можно установить свой пользовательский шаблон, по которому будет оформлен и отформатирован документ при каждом запуске программы Excel. Для этого следует сохранить файл с расширением *.xlsx в папке XLSTART. Данная папка создается при установке программы Excel. Чтобы легко найти путь к ней следует перейти в режим VisualBasic (Alt+F11) и открыть окно: «View»-«Immediate». А там следует набрать код: ? application.StartupPath и нажать Enter. Ниже отобразиться путь:
C:Usersимя пользователяAppDataRoamingMicrosoftExcelXLSTART
Примечание. В разных версиях Windows путь к XLSTART может отличаться, поэтому лучше узнать его через выше описанные действия.
Теперь при каждой загрузке программы будет открыт файл который лежит в этой папке. Более того если вы сохраните там несколько документов, то все они будут открыты при каждой запуске программы.
Полезный совет! Если в папке XLSTART сохранить отформатированный шаблон с именем Лист.xltx. То каждый новый созданный лист будет иметь такой же формат как Лист.xltx. При том не зависимо, в какой способ создан новый лист, через меню или комбинацией горячих клавиш SHIFT+F11. Формат будет один и тот же. А чтобы отменить такую функцию нужно просто удалить этот шаблон из XLSTART.
Форматирование документов – это важный, но очень утомительный процесс. Для его автоматизации существует несколько полезных инструментов такие как: темы, стили и шаблоны. Каждый из них обладает своими преимуществами и недостатками. Например, самый простой способ автоматизации форматирования – это стили. Они облегчаю пользователю процесс форматирования, но могут быть сохранены только в рамках одной книги. Да созданные или измененные пользователем стили можно скопировать в другую книгу. Или создать отдельную, специальную книгу с целым набором свих пользовательских стилей, чтобы копировать их в другие документы, но это крайне неудобно. Для решения такой задачи лучше использовать шаблоны.
Создание темы документа для автоматического форматирования
Тема Excel – это собрание стилей, цветов, шрифтов и много разных графических свойств форматирования, которые легко можем менять в пару кликов мышкой для изменения стильного оформления документа. Темы стали доступны начиная с 2007-й версии и новее. Их можно встретить и в других продуктах входящих в пакет MS Office.
Для примера возьмем простой не форматированный документ и будем присваивать ему разные темы пока не выберем подходящую к данным. Заодно посмотрим, что произойдет выбрать другую тему Excel:
- Создайте новую книгу и заполните ее данными (начиная со столбца H) так как показано на рисунке:
- Выберите инструмент: «Разметка страницы»-«Темы».
- В выпадающем списке наводите курсор мышки на разные темы и обратите внимание на то, как меняется стиль оформления данных документа.
- Щелкните по подходящей теме, которая на Ваш взгляд наиболее подходит к данному документу.
Внимание! Темы присваиваются к целому документу. Поэтому нельзя для разных листов задавать разные темы форматирования.
Пользователь имеет возможность самостоятельно создавать и редактировать любую тему. Для этого доступны 3 инструмента, которые находятся рядом возле тем:
- цвета;
- шрифты;
- эффекты.
Каждый из этих инструментов открывает целые предопределенные наборы для настройки темы. Можно создавать новые наборы шрифтов или наборы цветов, только нельзя создать новые эффекты. Приходится использовать только те, которые предложены программой по умолчанию.
Как только вы сохраните новый набор шрифтов и/или цветов под своим названием, тогда она будет доступна в разделе тем как для Excel, так и для других программ из пакета MS Office (Word, PowerPoint и др.).