Официальный форум российского программного комплекса T-FLEX PLM


Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
Синхронизация значений переменных с ячейками Excel
 
В параллельной ветке форума задаётся вопрос по поводу двухсторонней синхронизации значений переменных с ячейками 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 и всё будет работать.
Разговор был о произвольной ячейки, с БД не получается.
Ушёл остывать)
 
Сергей Козлов, а можно переделать макрос, чтобы он мог без мороки с БД брать данные из файла xls (xlsx) и подменять значения 90% переменных?
нужные ячейки экселя можно выстроить по столбцам или строкам на отдельном листе - это не проблема
Изменено: MACTEP - 25.03.2014 15:33:13
 
Вроде в примере вверху именно это и сделано. Никакой мороки с БД там и нет. Данные берутся прямо из Excel и кладутся прямо в переменные.
Посмотрите повнимательнее.
Данные из Excel можно брать по-разному. Это один из вариантов. Но это не тема форума по T-FLEX CAD.
Страницы: 1