В параллельной ветке форума задаётся вопрос по поводу двухсторонней синхронизации значений переменных с ячейками Excel.
Если бы данные передавались в одну сторону, то решение описано в документации. Нужно создать БД по ссылке на файл Excel и всё будет работать. Если же данные нужно передавать обратно, либо синхронизация должна быть не автоматической, то такое решение не подойдёт.Выкладываю решение.
В приложенном архиве 2 файла - файл ExcelSync с макросами - передача из Excel и сохранение в Excel. При необходимости их можно подключить к событиям открытия и сохранения документа, чтобы не жать на кнопки.
В дополнение файл Microsoft.Office.Interop.Excel.dll, который генерируется автоматически при подключении ссылки на Excel. Данный файл я сделал на Excel 2010. Можно его заменить на другую версию.
Текст макроса:
using System;
using TFlex.Model;
using Microsoft.Office.Interop.Excel;
namespace NewMacroNamespace
{
public class NewMacroClass
{
static TFlex.Model.Variable FindVar(Document doc,string name)
{
foreach(TFlex.Model.Variable v in doc.GetVariables())
{
if(v.Name == name)
return v;
}
return null;
}
public static void OnOpen()
{
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Workbook excelWorkbook = app.Workbooks.Open("c:\\mail\\a.xlsx", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Sheets excelSheets = excelWorkbook.Worksheets;
string currentSheet = "Лист1";
Worksheet excelWorksheet = (Worksheet)excelSheets.get_Item(currentSheet);
string cellValue = (excelWorksheet.Cells[2, 2] as Range).Value.ToString();
Document doc = TFlex.Application.ActiveDocument;
var v = FindVar(doc,"aaa") ;
if(v == null)
{
excelWorkbook.Close();
return;
}
doc.BeginChanges("Меняем значение переменной");
v.Expression = cellValue;
doc.EndChanges();
excelWorkbook.Close();
}
public static void OnSave()
{
Document doc = TFlex.Application.ActiveDocument;
var v = FindVar(doc,"aaa");
if(v == null)
return;
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Workbook excelWorkbook = app.Workbooks.Open("c:\\mail\\a.xlsx", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Sheets excelSheets = excelWorkbook.Worksheets;
string currentSheet = "Лист1";
Worksheet excelWorksheet = (Worksheet)excelSheets.get_Item(currentSheet);
(excelWorksheet.Cells[2, 2] as Range).Value = v.RealValue;
excelWorkbook.Close(true);
}
}
}f
Если бы данные передавались в одну сторону, то решение описано в документации. Нужно создать БД по ссылке на файл Excel и всё будет работать. Если же данные нужно передавать обратно, либо синхронизация должна быть не автоматической, то такое решение не подойдёт.Выкладываю решение.
В приложенном архиве 2 файла - файл ExcelSync с макросами - передача из Excel и сохранение в Excel. При необходимости их можно подключить к событиям открытия и сохранения документа, чтобы не жать на кнопки.
В дополнение файл Microsoft.Office.Interop.Excel.dll, который генерируется автоматически при подключении ссылки на Excel. Данный файл я сделал на Excel 2010. Можно его заменить на другую версию.
Текст макроса:
using System;
using TFlex.Model;
using Microsoft.Office.Interop.Excel;
namespace NewMacroNamespace
{
public class NewMacroClass
{
static TFlex.Model.Variable FindVar(Document doc,string name)
{
foreach(TFlex.Model.Variable v in doc.GetVariables())
{
if(v.Name == name)
return v;
}
return null;
}
public static void OnOpen()
{
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Workbook excelWorkbook = app.Workbooks.Open("c:\\mail\\a.xlsx", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Sheets excelSheets = excelWorkbook.Worksheets;
string currentSheet = "Лист1";
Worksheet excelWorksheet = (Worksheet)excelSheets.get_Item(currentSheet);
string cellValue = (excelWorksheet.Cells[2, 2] as Range).Value.ToString();
Document doc = TFlex.Application.ActiveDocument;
var v = FindVar(doc,"aaa") ;
if(v == null)
{
excelWorkbook.Close();
return;
}
doc.BeginChanges("Меняем значение переменной");
v.Expression = cellValue;
doc.EndChanges();
excelWorkbook.Close();
}
public static void OnSave()
{
Document doc = TFlex.Application.ActiveDocument;
var v = FindVar(doc,"aaa");
if(v == null)
return;
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Workbook excelWorkbook = app.Workbooks.Open("c:\\mail\\a.xlsx", 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Sheets excelSheets = excelWorkbook.Worksheets;
string currentSheet = "Лист1";
Worksheet excelWorksheet = (Worksheet)excelSheets.get_Item(currentSheet);
(excelWorksheet.Cells[2, 2] as Range).Value = v.RealValue;
excelWorkbook.Close(true);
}
}
}f