aspose-tasks-for-net Привет, друзья! В сегодняшнем блоге я познакомлю вас с новейшим API Aspose.Tasks. Преимущество команды Aspose в том, что она каждый месяц одновременно публикует как .NET, так и API на основе Java для Aspose.Tasks. Варианты на основе .NET и Java находятся на одном уровне с точки зрения функций, и оба пользователя API могут исследовать новые функции в своих соответствующих средах. В следующем разделе я расскажу о новых функциях и улучшениях, реализованных в API.

Запись метаданных в файлы Microsoft Project на C# и Java

Aspose.Tasks предоставляет возможность записи метаданных в файлы MPP для календарей, задач, ссылок на задачи, ресурсов и назначений ресурсов. В следующем примере показано, как записывать метаданные в файлы MPP.

Аналогичная реализация на основе Java для того же, что и ниже:

// Путь к каталогу документов.
String dataDir = Utils.getDataDir(WriteMetadata.class);

long OneSec = 10000000;
long OneMin = 60 * OneSec;
long OneHour = 60 * OneMin;
long OneDayEightHour = 8 * OneHour;
long OneDayTwentyFourHour = 24 * OneHour;

Project project = new Project(dataDir + "New project 2010.mpp");
java.util.Calendar calendar = java.util.Calendar.getInstance(TimeZone.getTimeZone("GMT"));
calendar.set(2012, java.util.Calendar.DECEMBER, 7, 0, 0, 0);
Date startDate = calendar.getTime();
calendar.set(2013, java.util.Calendar.DECEMBER, 7, 0, 0, 0);
Date toDate = calendar.getTime();

WorkingTime wt = new WorkingTime();
wt.setFromTime(startDate);
wt.setToTime(toDate);

WeekDay day = project.get(Prj.CALENDAR).getWeekDays().toList().get(1);
day.getWorkingTimes().add(wt);

project.get(Prj.CALENDAR).setName("CHANGED NAME!");

Task task = project.getRootTask().getChildren().add("Task 1");
task.set(Tsk.DURATION_FORMAT, TimeUnitType.Day);
task.set(Tsk.DURATION, project.getDuration(3));
task.set(Tsk.CONTACT, "Rsc 1");
// новые поля
task.set(Tsk.IS_MARKED, true);
task.set(Tsk.IGNORE_WARNINGS, true);

Task task2 = project.getRootTask().getChildren().add("Task 2");
task2.set(Tsk.DURATION_FORMAT, TimeUnitType.Day);
task2.set(Tsk.CONTACT, "Rsc 2");

project.getTaskLinks().add(task, task2, TaskLinkType.FinishToStart, project.getDuration(-1, TimeUnitType.Day));

calendar.set(2013, java.util.Calendar.DECEMBER, 13, 9, 0, 0);
startDate = calendar.getTime();
project.set(Prj.START_DATE, startDate);

Resource rsc = project.getResources().add("Rsc 1");
rsc.set(Rsc.TYPE, ResourceType.Work);
rsc.set(Rsc.INITIALS, "WR");
rsc.set(Rsc.ACCRUE_AT, CostAccrualType.Prorated);
rsc.set(Rsc.MAX_UNITS, 1d);
rsc.set(Rsc.CODE, "Code 1");
rsc.set(Rsc.GROUP, "Workers");
rsc.set(Rsc.E_MAIL_ADDRESS, "1@gmail.com");
rsc.set(Rsc.WINDOWS_USER_ACCOUNT, "user_acc1");
rsc.set(Rsc.IS_GENERIC, new NullableBool(true));
rsc.set(Rsc.ACCRUE_AT, CostAccrualType.End);
rsc.set(Rsc.STANDARD_RATE, BigDecimal.valueOf(10));
rsc.set(Rsc.STANDARD_RATE_FORMAT, RateFormatType.Day);
rsc.set(Rsc.OVERTIME_RATE, BigDecimal.valueOf(15));
rsc.set(Rsc.OVERTIME_RATE_FORMAT, RateFormatType.Hour);

rsc.set(Rsc.IS_TEAM_ASSIGNMENT_POOL, true);
rsc.set(Rsc.COST_CENTER, "Cost Center 1");

ResourceAssignment assn = project.getResourceAssignments().add(task, rsc);
assn.set(Asn.UID, 1);
assn.set(Asn.WORK, task.get(Tsk.DURATION));
assn.set(Asn.REMAINING_WORK, assn.get(Asn.WORK));
assn.set(Asn.REGULAR_WORK, assn.get(Asn.WORK));
task.set(Tsk.WORK, assn.get(Asn.WORK));

rsc.set(Rsc.WORK, task.get(Tsk.WORK));
assn.set(Asn.START, task.get(Tsk.START));
assn.set(Asn.FINISH, task.get(Tsk.FINISH));

// Добавить расширенный атрибут для проекта и задачи
ExtendedAttributeDefinition attr = ExtendedAttributeDefinition.createTaskDefinition(CustomFieldType.Flag,
        ExtendedAttributeTask.Flag1, "My Flag Field");
project.getExtendedAttributes().add(attr);

ExtendedAttribute taskAttr = attr.createExtendedAttribute();
taskAttr.setFlagValue(true);
task2.getExtendedAttributes().add(taskAttr);

project.save(dataDir + "updated.mpp", SaveFileFormat.MPP);

Чтение и запись формул

Aspose.Tasks API поддерживает чтение/запись формул в файлы проекта MPP. Свойство Formula объекта ExtendedAttributeDefinition предоставляет интерфейс для чтения значения формулы. В следующих примерах показано, как считывать формулы из локальных, а также корпоративных расширенных атрибутов из файла MPP. Также показано, как записывать формулы в файл MPP.

Чтение формул в локальных и корпоративных расширенных атрибутах из файла MPP

Аналогичная реализация на основе Java для того же, что и ниже:

// Путь к каталогу документов.
String dataDir = Utils.getDataDir(WriteReadFormula.class);

Project proj = new Project(dataDir + "FormulaField.mpp"); // attached test mpp
ExtendedAttributeDefinition attr = proj.getExtendedAttributes().get(0);

System.out.println("Attribute Formula: " + attr.getFormula());

Запись формул с расширенными атрибутами в форматы файлов MPP

Аналогичная реализация на основе Java для того же, что и ниже:

// Путь к каталогу документов.
String dataDir = Utils.getDataDir(WriteReadFormula.class);

Project project = new Project(dataDir + "New project 2010.mpp");
project.set(Prj.NEW_TASKS_ARE_MANUAL, new NullableBool(false));

// создайте новое настраиваемое поле (Task Text1) с формулой, которая удвоит стоимость задачи
ExtendedAttributeDefinition attr = ExtendedAttributeDefinition.createTaskDefinition(CustomFieldType.Text,
        ExtendedAttributeTask.Text1, "Custom");
attr.setAlias("Double Costs");
attr.setFormula("[Cost]*2");

project.getExtendedAttributes().add(attr);

// добавить задачу, чтобы увидеть результат в MSP
Task task = project.getRootTask().getChildren().add("Task");
// установить стоимость задачи
task.set(Tsk.COST, BigDecimal.valueOf(100));
// см. результат на прикрепленном скриншоте (result.jpg)
project.save(dataDir + "saved.mpp", SaveFileFormat.MPP);

Реализация префикса ресурса для вложенных ресурсов

Aspose.Tasks предоставляет свойство ResourceSavingArgs.NestedUri, которое позволяет сохранять вложенные ресурсы (например, PNG внутри файлов SVG) в отдельной папке. В следующих примерах мы продемонстрировали вариант использования этой функции.

Аналогичная реализация на основе Java для того же, что и ниже:

public class ResourcePrefixForNestedResources implements IFontSavingCallback, ICssSavingCallback, IImageSavingCallback {

    public static String dataDir = Utils.getDataDir(ResourcePrefixForNestedResources.class);

    public static void main(String[] args) throws IOException {
        FileInputStream fs = new FileInputStream(dataDir + "Project1.mpp");
        Project project = new Project(fs);
        HtmlSaveOptions options = GetSaveOptions(1);
        FileOutputStream stream = new FileOutputStream(dataDir + "document.html");
        project.save(stream, options);
    }

    public void cssSaving(CssSavingArgs args) {
        FileOutputStream stream;
        try {
            stream = new FileOutputStream(dataDir + "css/" + args.getFileName());
            args.setStream(stream);
            args.setKeepStreamOpen(false);
            args.setUri(dataDir + "css/" + args.getFileName());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public void fontSaving(FontSavingArgs args) {
        FileOutputStream stream;
        try {
            stream = new FileOutputStream(dataDir + "fonts/" + args.getFileName());
            args.setStream(stream);
            args.setKeepStreamOpen(false);
            args.setUri(dataDir + "fonts/" + args.getFileName());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    public void imageSaving(ImageSavingArgs args) {
        if (args.getFileName().endsWith("png")) {
            FileOutputStream stream1;
            try {
                stream1 = new FileOutputStream(dataDir + "resources/nestedResources/" + args.getFileName());
                args.setStream(stream1);
                args.setKeepStreamOpen(false);
                args.setUri(dataDir + "resources/" + args.getFileName());
                args.setNestedUri(dataDir + "nestedResources/" + args.getFileName());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        } else {
            FileOutputStream stream2;
            try {
                stream2 = new FileOutputStream(dataDir + "resources/" + args.getFileName());
                args.setStream(stream2);
                args.setKeepStreamOpen(false);
                args.setUri(dataDir + "resources/" + args.getFileName());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    private static HtmlSaveOptions GetSaveOptions(int pageNumber) {
        HtmlSaveOptions saveOptions = new HtmlSaveOptions();
        saveOptions.setIncludeProjectNameInPageHeader(false);
        saveOptions.setIncludeProjectNameInTitle(false);
        saveOptions.setPageSize(PageSize.A3);
        saveOptions.setTimescale(Timescale.ThirdsOfMonths);
        saveOptions.setReduceFooterGap(true);
        saveOptions.setFontFaceTypes(FontFaceType.Ttf);
        saveOptions.setExportCss(ResourceExportType.AsFile);
        saveOptions.setExportFonts(ResourceExportType.AsFile);
        saveOptions.setExportImages(ResourceExportType.AsFile);

        ResourcePrefixForNestedResources program = new ResourcePrefixForNestedResources();
        saveOptions.setFontSavingCallback(program);
        saveOptions.setCssSavingCallback(program);
        saveOptions.setImageSavingCallback(program);

        saveOptions.getPages().clear();
        saveOptions.getPages().add(pageNumber);

        File dirFonts = new File(dataDir + "fonts");
        if (!dirFonts.exists()) {
            dirFonts.mkdir();
        }

        File dirResources = new File(dataDir + "resources");
        if (!dirResources.exists()) {
            dirResources.mkdir();
        }

        File dirNResources = new File(dataDir + "nestedResources");
        if (!dirNResources.exists()) {
            dirNResources.mkdir();
        }

        File dirCSS = new File(dataDir + "css");
        if (!dirCSS.exists()) {
            dirCSS.mkdir();
        }

        return saveOptions;
    }

}

Работа с расширенными атрибутами

Microsoft Project (MSP) имеет обширную схему обмена XML-данными, которая упрощает обмен информацией между приложениями и программирование с файлами проекта. Схема позволяет добавлять расширенные атрибуты к задачам, ресурсам и назначениям. В этой статье показано, как работать с расширенными атрибутами в Aspose.Tasks.

Свойство ExtendedAttribute, предоставляемое классом Resource, можно использовать для управления расширенными атрибутами ресурса. Это свойство считывает и записывает ArrayList объектов ExtendedAttribute для работы с расширенными атрибутами ресурса. Объект ExtendedAttribute дополнительно предоставляет соответствующие свойства

Аналогичная реализация на основе Java для того же, что и ниже:

// Путь к каталогу документов.
String dataDir = Utils.getDataDir(ExtendedResourceAttributes.class);

Project prj = new Project(dataDir + "project5.mpp");

// Определить расширенный атрибут
ExtendedAttributeDefinition myNumber1 = prj.getExtendedAttributes()
        .getById((int) ExtendedAttributeTask.Number1);
if (myNumber1 == null) {
    myNumber1 = ExtendedAttributeDefinition.createResourceDefinition(ExtendedAttributeResource.Number1, "Age");
    prj.getExtendedAttributes().add(myNumber1);
}

// Создайте расширенный атрибут и установите его значение
ExtendedAttribute number1Resource = myNumber1.createExtendedAttribute();
number1Resource.setNumericValue(BigDecimal.valueOf(30.5345));

// Добавьте новый ресурс и его расширенный атрибут
Resource rsc = prj.getResources().add("R1");
rsc.getExtendedAttributes().add(number1Resource);

prj.save(dataDir + "Project5.xml", SaveFileFormat.XML);

// Показать результат конвертации.
System.out.println("Process completed Successfully");

Улучшения рендеринга

В этом выпуске акцент также был сделан на улучшении производительности рендеринга API. Проблемы с рендерингом PDF и HTML также были решены. Другие улучшения включают решение проблемы, связанной с открытием и сохранением файлов MPP, неправильными идентификаторами задач и сроками.

Подождите, в этот выпуск включено множество других функций, улучшений и исправлений ошибок. [Здесь вы можете получить подробную информацию!] (https://docs.aspose.com/tasks/net/aspose-tasks-for-net-19-8-release-notes/)

Мы также сохранили рабочие образцы примеров для API на основе .NET и Java на Github, чтобы пользователи могли сразу же использовать другие примеры и изучать функции API. Вы также можете обсудить с нами проблемы, связанные с API, на нашем форуме поддержки 3.