AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.05.2019, 17:54   #1  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
D365FO: Пример импорта из (экспорта в) Excel
Добрый день! В связи с увеличившимися просьбами как на курсах, на и на форуме - хочу выложить простейший пример импорта из Excel.
В примере производится импорт из Excel, затем полученные значения записываются в новый Excel-файл и сохраняются.
Для загрузки файла используется класс FileUploadBuild. Для сохранения - DocuFileSave

Выгрузка производится в той же сессии, что и загрузка - иначе не получается скачать экспортируемый файл (canRunInNewSession = false)

X++:
// VSUH, Пример импорта из файла Excel / экспорта в файл Excel
class Tutorial_ExcelImportExport extends RunBaseBatch
{
    private DialogRunbase             dialog;
    private FileUploadBuild           dialogFileUpload;
    private const FormControlName     fileUploadControlName = "FileName";
    protected Filename                uploadFileName;
    protected URL                     uploadFileURL;
    protected SharedServiceUnitFileID uploadFileID;

    #define.CurrentVersion(1)
    #localmacro.CurrentList
        uploadFileName,
        uploadFileURL,
        uploadFileID
    #endmacro
    #File

    public Object dialog()
    {
        FormBuildControl formBuildControl;
        DialogGroup dialogGroup;
        ;
        dialog = super();

        dialogGroup = dialog.addGroup(this.labelGroupControl());
        formBuildControl = dialog.formBuildDesign().control(dialogGroup.name());

        dialogFileUpload = formBuildControl.addControlEx(classstr(FileUpload), fileUploadControlName);
        dialogFileUpload.fileTypesAccepted(#xls + ',' + #xlsx);
        dialogFileUpload.fileNameLabel(this.labelUploadControl());

        return dialog;
    }

    public boolean getFromDialog()
    {
        boolean ret;

        ret = super();

        FileUpload fileUploadControl = dialog.formRun().control(dialog.formRun().controlId(fileUploadControlName));
        FileUploadTemporaryStorageResult fileUploadResult = fileUploadControl.getFileUploadResult();

        if (fileUploadResult != null && fileUploadResult.getUploadStatus())
        {
            uploadFileURL = fileUploadResult.getDownloadUrl();
            uploadFileName = fileUploadResult.getFileName();
            uploadFileID = fileUploadResult.getFileId();
        }

        return ret;
    }

    private void deleteFile(SharedServiceUnitFileID _fileId)
    {
        FileUploadTemporaryStorageResult result = new FileUploadTemporaryStorageResult('', '', true, '', '', _fileId);
        result.deleteResult();
    }

    public void run()
    {
        System.IO.Stream              stream;
        OfficeOpenXml.ExcelPackage    package, packageOut;
        OfficeOpenXml.ExcelWorksheet  worksheet, worksheetOut;
        Counter                       rowCount, columnCount;
        anytype                       value;
        DocuFileSaveResult            saveResult;
        System.IO.MemoryStream        streamOut = new System.IO.MemoryStream();
        FilePath                      filePath;
        Filename                      fileName, fileNameLog;
        Filename                      fileExt;
        ;
        try
        {
            stream    = File::UseFileFromURL(uploadFileURL);
            package   = new OfficeOpenXml.ExcelPackage(stream);
            if (!package)
            {
                throw Exception::Error;
            }
            worksheet = package.get_workbook().get_worksheets().get_Item(this.worksheetNum());
            rowCount = worksheet.get_Dimension().get_End().get_Row();
            columnCount = worksheet.get_Dimension().get_End().get_Column();

            packageOut = new OfficeOpenXml.ExcelPackage(streamOut);
            var worksheetsOut = packageOut.get_Workbook().get_Worksheets();
            [filePath, fileName, fileExt] = fileNameSplit(uploadFileName);
            fileNameLog = filename + this.labelLogFileSuffix();
            worksheetOut = worksheetsOut.Add(worksheet.Name);
            for (int i = 1; i <= rowcount; i++)
            {
                for (int j = 1; j <= columnCount; j++)
                {
                    value = worksheet.get_cells().get_Item(i, j).get_Value();
                    worksheetOut.get_cells().get_Item(i, j).set_Value(value);
                }
            }
            
            packageOut.Save();
            saveResult = DocuFileSave::promptForSaveLocation(fileNameLog, fileExt, null, this.labelReportResult());
            DocuFileSave::processSaveResult(streamOut, saveResult);
            packageOut.Dispose();

            package.Dispose();
            this.deleteFile(uploadFileID);
        }
        catch
        {
            if (package)
            {
                packageOut.Save();
                saveResult = DocuFileSave::promptForSaveLocation(fileNameLog, fileExt, null, this.labelReportResult());
                DocuFileSave::processSaveResult(streamOut, saveResult);
                packageOut.Dispose();
                package.Dispose();
                this.deleteFile(uploadFileID);
                error(strfmt("@SYS63093", uploadFileName));
            }
            else
            {
                error(strfmt("@SYS345194", uploadFileName));
            }
        }
    }

    protected boolean canRunInNewSession()
    {
        return false;
    }

    public container pack()
    {
        return [#CurrentVersion, #CurrentList];
    }

    public boolean unpack(container _packedClass)
    {
        Version version = RunBase::getVersion(_packedClass);

        switch (version)
        {
            case #CurrentVersion:
                [version, #CurrentList] = _packedClass;
                break;
            default:
                return false;
        }

        return true;
    }

    // Номер листа в Excel, с которого производится загрузка
    protected Integer worksheetNum()
    {
        return 1;
    }

    // Название группы полей в диалоге импорта
    protected Description labelGroupControl()
    {
        return "@SYS54759";
    }

    // Суффикс файла-лога, добавляемый к исходному названию файла
    protected Description labelLogFileSuffix()
    {
        return "@SYS2515";
    }

    // Название контрола, в котором выбирается файл для отправки на сервер
    protected Description labelUploadControl()
    {
        return "@SYS4820";
    }

    // Название результирующего отчета о результатах загрузки
    protected Description labelReportResult()
    {
        return "@SYS30597";
    }

    public static server Tutorial_ExcelImportExport construct()
    {
        return new Tutorial_ExcelImportExport();
    }

    public static ClassDescription description()
    {
        return "@GLS105893";
    }

    public static void main(Args _args)
    {
        Tutorial_ExcelImportExport    import;
        ;
        import =  Tutorial_ExcelImportExport::construct();
        if (import.prompt())
        {
            import.runOperation();
        }
    }

}
При запуске класса - выдается такое окно:
Нажмите на изображение для увеличения
Название: SNAG_Program-0012.png
Просмотров: 219
Размер:	14.0 Кб
ID:	12308
В нем необходимо нажать кнопку Обзор, выбрать файл и нажать кнопку Отправить.
Нажмите на изображение для увеличения
Название: SNAG_Program-0013.png
Просмотров: 98
Размер:	16.1 Кб
ID:	12309
Если все прошло успешно, то можно жать ОК. Класс начнет работать и перекладывать содержимое из одного файла в другой.
По завершении перекладки - система предложит сохранить новый файл
Название: SNAG_Program-0014.png
Просмотров: 1691

Размер: 20.0 Кб
Здесь можно нажать кнопку загрузить и файл будет скачан браузером в папку Загрузки (ну или будет выдан запрос, куда его сохранять - в зависимости от настроек браузера)

Проверялось на PU10 и далее (на PU25 работает)
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 15.05.2019 в 20:02.
За это сообщение автора поблагодарили: Oz (2), trud (10), raz (5), AlexeyS (5), AvrDen (1), IvanS (1), raniel (1), Dreadlock (4), pedrozzz (3), Vovan911 (1).
Старый 03.07.2019, 16:19   #2  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,039 / 1630 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
В продолжении темы импорта из Excel.
Выложил классы обертки которые несколько упрощают импорт https://github.com/TrudAX/XppTools#-...-and-csv-files. Плюс расширил тулзу для генерации RunBase, чтобы она генерировала шаблонный код с использованием этих классов https://github.com/TrudAX/TRUDUtilsD...-class-builder
За это сообщение автора поблагодарили: raz (1), sukhanchik (10), AvrDen (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
erconsult: Copy-paste with keyboard script 2: from Excel to D365FO Blog bot DAX Blogs 0 03.08.2018 11:12
kurthatlevik: D365FO – Some nice excel tricks Blog bot DAX Blogs 0 02.06.2018 00:13
Вспомогательный класс для импорта из Excel через ADO gl00mie DAX: База знаний и проекты 80 10.04.2017 10:55
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Использование OWC.Spreadsheet для ускорения экспорта/импорта в/из Excel. storer DAX: Программирование 24 28.03.2005 19:10
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:39.