aspose-tasks-for-net Hallo Freunde! Im heutigen Blog werde ich Ihnen eine Tour durch die neueste Aspose.Tasks-API geben. Das Gute am Aspose-Team ist, dass es jeden Monat gleichzeitig sowohl .NET- als auch Java-basierte APIs für Aspose.Tasks veröffentlicht. Sowohl .NET- als auch Java-basierte Varianten sind in Bezug auf die Funktionen auf dem gleichen Niveau, und beide API-Benutzer können die neuen Funktionen in ihren jeweiligen Umgebungen erkunden. Im folgenden Abschnitt werde ich über neue Funktionen und Verbesserungen in der API sprechen.

Schreiben von Metadaten in Microsoft Project-Dateien in C# und Java

Aspose.Tasks bietet eine Einrichtung zum Schreiben von Metadaten in MPP-Dateien für Kalender, Aufgaben, Aufgabenverknüpfungen, Ressourcen und Ressourcenzuweisungen. Das folgende Beispiel beschreibt, wie Metadateninformationen in MPP-Dateien geschrieben werden.

Die ähnliche Java-basierte Implementierung für dasselbe ist wie folgt:

// Der Pfad zum Dokumentenverzeichnis.
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");
// neue Felder
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));

// Erweitertes Attribut für Projekt und Aufgabe hinzufügen
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);

Formeln lesen und schreiben

Die Aspose.Tasks-API unterstützt das Lesen/Schreiben von Formeln in MPP-Projektdateien. Die Eigenschaft Formula der ExtendedAttributeDefinition stellt die Schnittstelle zum Lesen des Formelwerts bereit. Die folgenden Beispiele beschreiben, wie Formeln aus lokalen sowie Enterprise Extended Attributes aus der MPP-Datei gelesen werden. Es zeigt auch, wie man Formeln in eine MPP-Datei schreibt.

Lesen von Formeln in lokalen und erweiterten Unternehmensattributen aus der MPP-Datei

Die ähnliche Java-basierte Implementierung für dasselbe ist wie folgt:

// Der Pfad zum Dokumentenverzeichnis.
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());

Schreiben von Formeln in erweiterten Attributen in MPP-Dateiformate

Die ähnliche Java-basierte Implementierung für dasselbe ist wie folgt:

// Der Pfad zum Dokumentenverzeichnis.
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));

// Erstellen Sie ein neues benutzerdefiniertes Feld (Aufgabentext1) mit einer Formel, die die Aufgabenkosten verdoppelt
ExtendedAttributeDefinition attr = ExtendedAttributeDefinition.createTaskDefinition(CustomFieldType.Text,
        ExtendedAttributeTask.Text1, "Custom");
attr.setAlias("Double Costs");
attr.setFormula("[Cost]*2");

project.getExtendedAttributes().add(attr);

// Fügen Sie eine Aufgabe hinzu, um das Ergebnis in MSP anzuzeigen
Task task = project.getRootTask().getChildren().add("Task");
// Aufgabenkosten festlegen
task.set(Tsk.COST, BigDecimal.valueOf(100));
// siehe das Ergebnis im beigefügten Screenshot (result.jpg)
project.save(dataDir + "saved.mpp", SaveFileFormat.MPP);

Ressourcenpräfix für verschachtelte Ressourcen implementieren

Aspose.Tasks bietet die Eigenschaft ResourceSavingArgs.NestedUri, die es ermöglicht, verschachtelte Ressourcen (z. B. PNG in SVG-Dateien) in einem separaten Ordner zu speichern. In den folgenden Beispielen haben wir den Anwendungsfall für die Verwendung der Funktion demonstriert.

Die ähnliche Java-basierte Implementierung für dasselbe ist wie folgt:

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

}

Arbeiten mit erweiterten Attributen

Microsoft Project (MSP) verfügt über ein umfangreiches XML-Datenaustauschschema, das den Austausch von Informationen zwischen Anwendungen und die Programmierung mit Projektdateien erleichtert. Mit dem Schema können Sie Aufgaben, Ressourcen und Zuweisungen erweiterte Attribute hinzufügen. Dieser Artikel zeigt, wie Sie mit erweiterten Attributen in Aspose.Tasks arbeiten.

Die ExtendedAttribute-Eigenschaft, die von der Resource-Klasse verfügbar gemacht wird, kann verwendet werden, um die erweiterten Attribute einer Ressource zu verwalten. Diese Eigenschaft liest und schreibt eine ArrayList der ExtendedAttribute-Objekte, um mit den erweiterten Attributen einer Ressource umzugehen. Das ExtendedAttribute-Objekt stellt außerdem die relevanten Eigenschaften bereit

Die ähnliche Java-basierte Implementierung für dasselbe ist wie folgt:

// Der Pfad zum Dokumentenverzeichnis.
String dataDir = Utils.getDataDir(ExtendedResourceAttributes.class);

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

// Erweitertes Attribut definieren
ExtendedAttributeDefinition myNumber1 = prj.getExtendedAttributes()
        .getById((int) ExtendedAttributeTask.Number1);
if (myNumber1 == null) {
    myNumber1 = ExtendedAttributeDefinition.createResourceDefinition(ExtendedAttributeResource.Number1, "Age");
    prj.getExtendedAttributes().add(myNumber1);
}

// Erstellen Sie ein erweitertes Attribut und legen Sie seinen Wert fest
ExtendedAttribute number1Resource = myNumber1.createExtendedAttribute();
number1Resource.setNumericValue(BigDecimal.valueOf(30.5345));

// Fügen Sie eine neue Ressource und ihr erweitertes Attribut hinzu
Resource rsc = prj.getResources().add("R1");
rsc.getExtendedAttributes().add(number1Resource);

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

// Ergebnis der Konvertierung anzeigen.
System.out.println("Process completed Successfully");

Rendering-Verbesserungen

In dieser Version wurde der Fokus auch auf die Verbesserung der Rendering-Leistung der API gelegt. Die PDF- und HTML-Rendering-Probleme wurden ebenfalls behoben. Weitere Verbesserungen umfassen die Lösung von Problemen im Zusammenhang mit dem Öffnen und Speichern von MPP-Dateien, falschen Aufgaben-IDs und Zeitleisten.

Warten Sie, in dieser Version sind viele weitere Funktionen, Verbesserungen und Fehlerbehebungen enthalten. Hier können Sie die Details abrufen!

Wir haben auch die funktionierenden Beispielbeispiele für .NET- und Java-basierte APIs auf Github gepflegt, sodass Benutzer sofort verschiedene Beispiele verwenden und API-Funktionen erkunden können. Sie können auch in unserem Produktsupport Forum mit uns über API-bezogene Probleme sprechen.