aspose-tasks-for-net Salut les amis ! Dans le blog d’aujourd’hui, je vais vous présenter la dernière API Aspose.Tasks. La bonne chose à propos de l’équipe Aspose est qu’elle publie simultanément des API basées sur .NET et Java pour Aspose.Tasks chaque mois. Les variantes basées sur .NET et Java sont au même niveau en termes de fonctionnalités et les deux utilisateurs de l’API peuvent explorer les nouvelles fonctionnalités dans leurs environnements respectifs. Dans la section suivante, je discuterai des nouvelles fonctionnalités et des améliorations apportées à l’API.

Écriture de métadonnées dans des fichiers Microsoft Project en C# et Java

Aspose.Tasks fournit une fonction permettant d’écrire des métadonnées dans des fichiers MPP pour les calendriers, les tâches, les liens de tâches, les ressources et les affectations de ressources. L’exemple suivant décrit comment écrire des informations de métadonnées dans des fichiers MPP.

L’implémentation similaire basée sur Java pour le même est comme ci-dessous :

// Chemin d'accès au répertoire des documents.
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");
// nouveaux champs
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));

// Ajouter un attribut étendu pour le projet et la tâche
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);

Formules de lecture et d’écriture

L’API Aspose.Tasks prend en charge la lecture/écriture de formules dans les fichiers de projet MPP. La propriété Formula de ExtendedAttributeDefinition fournit l’interface de lecture de la valeur de la formule. Les exemples suivants décrivent comment lire des formules à partir d’attributs locaux ainsi que d’Enterprise Extended Attributes à partir du fichier MPP. Il montre également comment écrire des formules dans le fichier MPP.

Lecture des formules dans les attributs étendus locaux et d’entreprise à partir du fichier MPP

L’implémentation similaire basée sur Java pour le même est comme ci-dessous :

// Chemin d'accès au répertoire des documents.
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());

Écriture de formules dans des attributs étendus aux formats de fichier MPP

L’implémentation similaire basée sur Java pour le même est comme ci-dessous :

// Chemin d'accès au répertoire des documents.
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));

// créer un nouveau champ personnalisé (Task Text1) avec une formule qui doublera le coût de la tâche
ExtendedAttributeDefinition attr = ExtendedAttributeDefinition.createTaskDefinition(CustomFieldType.Text,
        ExtendedAttributeTask.Text1, "Custom");
attr.setAlias("Double Costs");
attr.setFormula("[Cost]*2");

project.getExtendedAttributes().add(attr);

// ajouter une tâche pour voir le résultat dans MSP
Task task = project.getRootTask().getChildren().add("Task");
// définir le coût de la tâche
task.set(Tsk.COST, BigDecimal.valueOf(100));
// voir le résultat dans la capture d'écran ci-jointe (result.jpg)
project.save(dataDir + "saved.mpp", SaveFileFormat.MPP);

Implémentation du préfixe de ressource pour les ressources imbriquées

Aspose.Tasks fournit la propriété ResourceSavingArgs.NestedUri qui permet d’enregistrer les ressources imbriquées (par exemple PNG dans les fichiers SVG) dans le dossier séparé. Dans les exemples suivants, nous avons démontré le cas d’utilisation de la fonctionnalité.

L’implémentation similaire basée sur Java pour le même est comme ci-dessous :

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;
    }

}

Travailler avec des attributs étendus

Microsoft Project (MSP) dispose d’un schéma d’échange de données XML étendu qui facilite l’échange d’informations entre les applications et la programmation avec des fichiers de projet. Le schéma vous permet d’ajouter des attributs étendus aux tâches, ressources et affectations. Cet article montre comment utiliser les attributs étendus dans Aspose.Tasks.

La propriété ExtendedAttribute exposée par la classe Resource peut être utilisée pour gérer les attributs étendus d’une ressource. Cette propriété lit et écrit une ArrayList des objets ExtendedAttribute pour traiter les attributs étendus d’une ressource. L’objet ExtendedAttribute expose davantage les propriétés pertinentes

L’implémentation similaire basée sur Java pour le même est comme ci-dessous :

// Chemin d'accès au répertoire des documents.
String dataDir = Utils.getDataDir(ExtendedResourceAttributes.class);

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

// Définir l'attribut étendu
ExtendedAttributeDefinition myNumber1 = prj.getExtendedAttributes()
        .getById((int) ExtendedAttributeTask.Number1);
if (myNumber1 == null) {
    myNumber1 = ExtendedAttributeDefinition.createResourceDefinition(ExtendedAttributeResource.Number1, "Age");
    prj.getExtendedAttributes().add(myNumber1);
}

// Créer un attribut étendu et définir sa valeur
ExtendedAttribute number1Resource = myNumber1.createExtendedAttribute();
number1Resource.setNumericValue(BigDecimal.valueOf(30.5345));

// Ajouter une nouvelle ressource et son attribut étendu
Resource rsc = prj.getResources().add("R1");
rsc.getExtendedAttributes().add(number1Resource);

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

// Afficher le résultat de la conversion.
System.out.println("Process completed Successfully");

Améliorations du rendu

Dans cette version, l’accent a également été mis sur l’amélioration des performances de rendu de l’API. Les problèmes de rendu PDF et HTML ont également été résolus. D’autres améliorations incluent la résolution de problèmes liés à l’ouverture et à l’enregistrement de fichiers MPP, des ID de tâche et des délais incorrects.

Attendez, de nombreuses autres fonctionnalités, améliorations et corrections de bogues sont incluses dans cette version. [Ici, vous pouvez obtenir les détails !] (https://docs.aspose.com/tasks/net/aspose-tasks-for-net-19-8-release-notes/)

Nous avons également maintenu les exemples d’exemples de travail pour les API basées sur .NET et Java sur Github afin que les utilisateurs puissent immédiatement utiliser différents exemples et explorer les fonctionnalités de l’API. Vous pouvez également discuter des problèmes liés à l’API avec nous dans notre support produit forum.