logo

Запись данных в Excel файл

В примере рассмотрим запись данных в файл формата *.xls из блоков процесса с помощью сценария и с помощью шаблона.

Запись в файл сценарием

В сценарии используется создание файла из потока (методы класса FileStream) библиотеки Aspose.Cells для заполнения файла данными.

В качестве примера рассмотрим экспорт в Excel данных о рейтингах сотрудников.

Экспортируемые в Excel данные представлены в блоках Калибровка рейтингов (переменная контекста context. KalibrovkaReytingov) и Рейтинг результативности (переменная контекста context. ReytingRezuljtativnosti).

Для корректной работы сценария необходимо подключить сборку System.Drawing и пространства имен:

1
2
3
4
5
6
using System;
using Aspose.Cells;
using EleWise.ELMA.Runtime;
using EleWise.ELMA.Runtime.Managers;
using System.Drawing;
using System.IO;

Основной метод для экспорта данных в Excel – ExportToExcel. В нем создается файл методом CreateFile и каждая строка первого и второго блока записываются методом FilingXLS. После записи строк в таблицу файл сохраняется с использованием менеджера доступа к файлам DataAccessManager.FileManager.

Текст сценария:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
public void ExportToExcel(Context context)
{// создать файл
 CreateFile(context);
  
 // записать первую таблицу
 int indRow = 1;
 foreach (var row in context.KalibrovkaReytingov)
 {
  string kateg = "";
  if (row.Kategoriya!=null)
   kateg = row.Kategoriya.KodKategorii;
  string neobOc = "";
  if (row.NeobhodimostjProvestiGodovuyuOcenku)
   neobOc = "Да";
  else
   neobOc = "Нет";
  string korrSales = "";
  if (row.KorrektirovkaOcenkiZaSales!=null)
   korrSales = row.KorrektirovkaOcenkiZaSales.Value;
  string korrNS = "";
  if (row.KorrektirovkOcenkiZaNS!=null)
   korrNS = row.KorrektirovkOcenkiZaNS.Value;
  string reyt = "";
  if (row.ItogovyyReytingSotrudnikaPoRezuljtatamKalibrovki!=null)
   reyt = row.ItogovyyReytingSotrudnikaPoRezuljtatamKalibrovki.Value;
 
  string[] parList = new string[10];
  parList[0] = row.Sotrudnik.FIO;
  parList[1] = row.PRID;
  parList[2] = kateg;
  parList[3] = neobOc;
  parList[4] = row.OcenkiSalesIzFormySotrudnika;
  parList[5] = korrSales;
  parList[6] = row.OcenkiZaNSIzFormySotrudnika;
  parList[7] = korrNS;
  parList[8] = row.ItogovyyReytingRezuljtativnostiIzFormySotrudnika;
  parList[9] = reyt;
  FilingXLS(context, indRow, 1, parList);
  indRow++;
 }
 // вставить строки из второй таблице
 indRow++;
 string[] parNameList = new string[4];
 parNameList[0] = "Рейтинг результативности";
 parNameList[1] = "Количество сотрудников в вашей команде с рейтингом";
 parNameList[2] = "Утвержденная шкала распределения рейтингов";
 parNameList[3] = "Распределение рейтингов в вашей команде";
 FilingXLS(context, indRow, 2, parNameList);
 indRow++;
 foreach(var row in context.ReytingRezuljtativnosti)
 {
  string kol = "";
  if (row.KolichestvoSotrudnikovVKomandeSReytingom!=null)
   kol = row.KolichestvoSotrudnikovVKomandeSReytingom.ToString();
  string raspr = "";
  if (row.RaspredelenieReytingovVVasheyKomande!=null)
   raspr = row.RaspredelenieReytingovVVasheyKomande.ToString();
   
  string[] parList = new string[4];
  parList[0] = row.ReytingRezuljtativnosti;
  parList[1] = kol;
  parList[2] = row.UtverzhdennayaShkalaRaspredeleniyaReytingov;
  parList[3] = raspr;
  FilingXLS(context, indRow, 2, parList);
  indRow++;
 }   
 
 DataAccessManager.FileManager.SaveFile(context.Fayl);  
}

Файл создается в специально созданной папке на сервере FormShablonPM. Формат наименования файла «KalibReyt<ггггммдд>_<чч.мм>.xls». Созданный файл записывается в контекстную переменную context.Fayl.

Текст сценария по созданию файла:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public void CreateFile(Context context)
{
// Создать файл на сервере формата *.xls
 var PathSystem   = Locator.GetServiceNotNull<IRuntimeApplication>().Configuration.Config.FilePath.Replace("configuration.config","");
 string fullpath  = PathSystem + "FormShablonPM\\";
 DateTime now = DateTime.Now;
 string nowForFileName = now.Year.ToString();
 if (now.Month< 10)
  nowForFileName += "0" + now.Month.ToString();
 else
  nowForFileName += now.Month.ToString();
  
 if (now.Day< 10)
  nowForFileName += "0" + now.Day.ToString();
 else
  nowForFileName += now.Day.ToString();
 nowForFileName += "_" ;  
  
 Console.WriteLine(now.ToString().Substring(12,1));
 if (now.ToString().Substring(12,1) == ":")
  nowForFileName+= now.ToString().Substring(11,1) + "." + now.ToString().Substring(13,2);
 else
  nowForFileName+= now.ToString().Substring(11,2) + "." + now.ToString().Substring(14,2);
  
 string name = "KalibReyt";
  
 string fileName = fullpath + name + nowForFileName + ".xls";
 Stream stream = new FileStream(fileName, FileMode.Create);
 var temp = BinaryFile.CreateContentFilePath(fileName);
 using (var fs = new FileStream(temp, FileMode.CreateNew, FileAccess.Write))
 {
  stream.Seek(0, SeekOrigin.Begin);
  stream.CopyTo(fs);
 }
 var mimeMappingService = Locator.GetServiceNotNull<IMimeMappingService>();
 var fileFL = new BinaryFile
 {
  ContentType = mimeMappingService.GetTypeByExtension(Path.GetExtension(fileName)),
  Name = Path.GetFileName(fileName),
  ContentFilePath = temp,
  CreateDate = DateTime.Now,
 };
  
 DataAccessManager.FileManager.SaveFile(fileFL);
  
 // записать файл в контекстную переменную
 context.Fayl = fileFL;
  
 // записать в файл первую строку с заголовками
 string[] parList = new string[10];
 parList[0] = "Сотрудник";
 parList[1] = "PRID";
 parList[2] = "Категория";
 parList[3] = "Необходимость провести годовую оценку";
 parList[4] = "Оценки Sales из формы сотрудника";
 parList[5] = "Корректировка оценки за Sales";
 parList[6] = "Оценки за NS из формы сотрудника";
 parList[7] = "Корректировка оценки за NS";
 parList[8] = "Итоговый рейтинг результативности из формы сотрудника";
 parList[9] = "Итоговый рейтинг сотрудника по результатам калибровки";
 FilingXLS(context, 0, 1, parList);
 
}

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

В метод FilingXLS для записи строки таблицы передаются параметры:

  • сontext – переменная контекста процесса;
  • row – номер создаваемой строки;
  • tablNumber – номер таблицы;
  • list – список значений ячеек.

Форматирование таблицы производится внутри метода FilingXLS с помощью метода SetCellBord и SetColumnWidth.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public void FilingXLS(Context context, int row, int tablNumber, params string[] list)
{// Записать строку в файл
 string filepath_excel = context.Fayl.ContentFilePath;
 Workbook workbook = new Workbook(filepath_excel);
 workbook.Settings.Encoding = Encoding.GetEncoding(1251);
 Worksheet newWorksheet;
 newWorksheet = workbook.Worksheets[0];
 Cells cells = newWorksheet.Cells;  
  
 int beginInd = 0;
 int countRow = list.Count();
 if (tablNumber == 2){
  beginInd = 6;
  countRow = list.Count()+6;}
 for (int i = beginInd; i < countRow; i++)
 {
  int j = i;
  if (tablNumber == 2)
   j = i - 6;
  cells[row, i].PutValue(list[j]);
   
  SetCellBord(cells[row, i], row, i, context, newWorksheet); // установить границы ячейки
  // при вызове для первой строки установить ширину столбцов
  if (row ==0){
   cells.SetColumnWidth(j, 18);
   if (i == 0)
    cells.SetColumnWidth(j, 30);
   if (i==1)
    cells.SetColumnWidth(j, 12);
   if (i == 2)
    cells.SetColumnWidth(j, 15);
   if (i == 5||i == 7)
    cells.SetColumnWidth(j, 16);}
   
 }
 workbook.Save(filepath_excel);
 
}

В методе SetCellBord динамически в зависимости от номера строки, столбца и таблицы устанавливаются границы ячеек, шрифт и цвет фона.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public void SetCellBord(Cell cell, int indRow, int indCol, Context context, Worksheet newWorksheet)
   {// установить границы ячейки
     Style style = cell.GetStyle();
     if (indRow == (context.KalibrovkaReytingov.Count + 2)||indRow == 0){
       style.IsTextWrapped = true;
       style.Font.IsBold = true;
       style.Pattern = BackgroundType.Solid;
       if (indRow == 0)
         style.ForegroundColor = Color.FromArgb(197, 217, 241);
       else
         style.ForegroundColor = Color.FromArgb(255, 204, 153);
       style.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Medium;
       style.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Medium;
       style.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Medium;
       style.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Medium;
     }
     else
     {       
       style.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
       style.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
       style.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
       style.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;     
       if (indRow == (context.KalibrovkaReytingov.Count)||indRow == (context.KalibrovkaReytingov.Count)+context.ReytingRezuljtativnosti.Count + 2)
         style.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Medium;
       if ((indCol == 0&& indRow <= context.KalibrovkaReytingov.Count)||(indCol == 6&&indRow > (context.KalibrovkaReytingov.Count)+1))
         style.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Medium;
       if (indCol == 9&& (indRow <= (context.KalibrovkaReytingov.Count)||indRow > (context.KalibrovkaReytingov.Count)+1))
         style.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Medium;
        
     }
     if (indCol > 3&&indRow <= context.KalibrovkaReytingov.Count ){
       style.Font.IsBold = true; }
      
     style.Borders[BorderType.TopBorder].Color = Color.FromArgb(128, 128, 128);
     style.Borders[BorderType.BottomBorder].Color = Color.FromArgb(128, 128, 128);
     style.Borders[BorderType.LeftBorder].Color = Color.FromArgb(128, 128, 128);
     style.Borders[BorderType.RightBorder].Color = Color.FromArgb(128, 128, 128);
     style.Font.Size = 10;
     style.Font.Name = "Calibri";
 
     cell.SetStyle(style);
   }

После выполнения экспорта получаем заполненный файл, связанный с контекстной переменной context.Fayl.

Запись в файл по шаблону

Для записи в файл по шаблону необходимо сформировать документ-шаблон и загрузить его в систему:

  • как документ при использовании генерации по шаблону-документу или при генерации сценарием;
  • в настройках блока Генерация документа.

Для вывода блоков в документ формата *.xls используем конструкцию:

1
2
3
{for Item in {$Blok}}
{$Item.Tekst1} {$Item.Tekst2} {$Item.Tekst3}
{end}

Значения каждого из полей {$Item.Tekst1} может располагаться как в отдельной ячейке, так и в одной ячейке. Оператор {for Item in {$Blok}} должен располагаться в первой ячейке строки (в первом столбце листа).

Есть возможность выводить несколько блоков в одном документе.

Генерацию по шаблону можно выполнить с помощью блока Генерация документа или в сценарии.

Для корректной работы сценария по генерации документа из шаблона необходимо подключить пространства имен:

1
2
3
4
using EleWise.ELMA.Documents.Managers;
using EleWise.ELMA.Runtime.Managers;
using EleWise.ELMA.Services;
using EleWise.ELMA.Templates;

Текст сценария генерации документа по шаблону:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void ExportToExcel(Context context)
{// создать файл
 int id_doc=348; //идентификатор документа, в котором содержится шаблон
 var versionFile = Locator.GetServiceNotNull<IDocumentFileManager>().GetFileByDocumentId(id_doc);
 var file = Locator.GetServiceNotNull<ITemplateFileManager>().CreateFromTemplate(versionFile.Id);
 // Создаем генератор
 var generator = Locator.GetServiceNotNull<DocumentGeneratorManager>().Create(file.ContentFilePath);
 // Генерируем документ
 generator.Generate(context);
 // Сохраняем файл сгенерированного документа
 Locator.GetServiceNotNull<IFileManager>().SaveFile(file);
 // Записываем результат в переменную
 context.Fayl = file;
 }

Минусы использования генерации по шаблону по сравнению с созданием документа в сценарии с использованием библиотеки Aspose.Cells:

  • в документе нельзя расположить 2 таблицы в 2 столбца (то есть располагающихся в одних строках), так как команды конструкции цикла по блоку for и end должны располагаться в первом столбце;
  • ограниченные возможности форматирования строк таблиц (например, нельзя отрисовать нижнюю границу таблицы, отличную от границ ячеек всей остальной таблицы или задать разный фон для строк).

При создании документа в сценарии с использованием библиотеки Aspose.Cells возможности конструирования и форматирования таблиц практически не ограничены.