Цитата:
Изначально опубликовано Владимир Максимов
Альтернатива - это обычное открытие текстового файла (Файл - Открыть). Это метод Workbooks.OpenText() или Workbooks.Open()
Нет. Это не альтернатива. Это совсем другой способ. Я говорил о
связывании предварительно отформатированных ячеек листа Excel с данными хранящимися в CSV файле.
О каких двумерных массивах может идти речь? (к слову, можно сформировать массив любой мерности из одномерного, просто указав смещение)
Цитата:
Изначально опубликовано Владимир Максимов
Т.е. пользователь вынужден вручную осуществлять открытие или импорт внешнего текстового файла. Нет возможности автоматизировать этот процесс.
Так вот. Указанная в самом первом посте задача была решена и автоматизирована следующим образом (Для обработки прайс-листа):
Пользователь имеет в своем распоряжении три кнопки:
1) В аксапте - кнопка "Выгрузить в Excel". По ее нажатию запускается следующий код :
Данный код запускает Excel, и при открытии книги, связанные ячейки автоматически обновляются данными из CSV.
PHP код:
static void ExcelStart(Args _args)
{
sysDataExport ex = new sysDataExport();
ComExcelDocument_RU doc;
;
//Экспортируем группу определений в текстовый файл
ex.parmGroupId("PrLst");
ex.initParmFilename("C:\\PriceList.dat");
ex.parmFiletype(FileType::Comma);
ex.run();
// Открываем существующий шаблон
doc = new ComExcelDocument_RU();
doc.Open("C:\\PriceList.xls");
doc.finalize();
}
Отмечу, что экселевский шаблон должен быть предварительно сформирован разработчиком как было описано мною выше.
2) В Excel - кнопка "Импорт Из Аксапты".
Данная кнопка через COM инициирует экспорт данных Аксаптой в текстовый файл. И обновляет связи.
На кнопке макрос:
Код:
Sub ImportFromAxapta()
'Вызов аксаптовского Joba который производит экспорт
Dim Axapta As Object
Dim Args As Object
Set Axapta = CreateObject("AxaptaCOMConnector.Axapta")
Axapta.Logon "COM+", "", "", ""
Set Args = Axapta.CreateObject("args")
Args.Call "parm", "PrLst"
Axapta.CallJob "COMExport", Args
Axapta.Logoff
Set Axapta = Nothing
'Обновление данных для связанных ячеек
ActiveWorkbook.RefreshAll
End Sub
Аксаптовский JOB:
PHP код:
static void COMExport(Args _args)
{
sysDataExport ex = new sysDataExport();
;
if(_args)
ex.parmGroupId(_args.parm());
ex.initParmFilename("C:\\PriceList.dat");
ex.parmFiletype(FileType::Comma);
ex.run();
}
3) Excel: Кнопка - "Экспорт в Аксапту". Макрос очищает лист от форматирования и заголовков столбцов и экспортирует данные в текстовый файл. Далее, через COM запускается JOB который в аксапте инициирует операцию импорта
На кнопке макрос:
Код:
Sub ExportToAxapta()
'Предварительно удаляем CSV хранилище
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
fs.DeleteFile "C:\PriceList.dat"
'Сохраняем книгу и удаляем заголовки столбцов
ActiveWorkbook.Save
Rows("1:1").Select
Range("F1").Activate
Selection.Delete Shift:=xlUp
'Формируем CSV файл
ActiveWorkbook.SaveAs Filename:= _
"C:\PriceList.dat", _
FileFormat:=xlCSV, CreateBackup:=False
'Возвращаемся к главному документу
ActiveWorkbook.Close SaveChanges:=True
Workbooks.Open Filename:= _
"C:\\PriceList.xls"
'Вызов аксаптовского Joba который производит импорт
Dim Axapta As Object
Dim Args As Object
Set Axapta = CreateObject("AxaptaCOMConnector.Axapta")
Axapta.Logon "COM+", "", "", ""
Set Args = Axapta.CreateObject("args")
Args.Call "parm", "PrLst"
Axapta.CallJob "COMImport", Args
Axapta.Logoff
Set Axapta = Nothing
End Sub
Аксаптовский JOB
PHP код:
static void COMImport(Args _args)
{
sysDataImport ex = new sysDataImport();
;
if(_args)
ex.parmGroupId(_args.parm());
ex.initParmFilename("C:\\PriceList.dat");
ex.run_modified();
}
В jobe использован модифицированый метод Run, класса SysDataImport для того, чтобы при вызове через СОМ не происходил вызов диалоговых окон для взаимодействия с пользователем при импорте.
Итого: корректный, прозрачный двусторонний обмен Axapta-Excel с минимальными задержками для практически любых шаблонов.