aspose-tasks-for-net Ciao amici! Nel blog di oggi, ti farò un tour dell’ultima API di Aspose.Tasks. L’aspetto positivo del team di Aspose è che pubblica simultaneamente ogni mese sia l’API basata su .NET che l’API basata su Java per Aspose.Tasks. Entrambe le varianti basate su .NET e Java sono allo stesso livello in termini di funzionalità ed entrambi gli utenti API possono esplorare le nuove funzionalità nei rispettivi ambienti. Nella sezione seguente, parlerò delle nuove funzionalità e dei miglioramenti apportati nell’API.

Scrittura di metadati in file di Microsoft Project in C# e Java

Aspose.Tasks fornisce una funzione per scrivere metadati in file MPP per calendari, attività, collegamenti attività, risorse e assegnazioni di risorse. L’esempio seguente descrive come scrivere le informazioni sui metadati nei file MPP.

L’implementazione simile basata su Java per lo stesso è come sotto:

// Il percorso della directory dei documenti.
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");
// nuovi campi
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));

// Aggiungi attributo esteso per progetto e attività
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);

Lettura e scrittura di formule

L’API Aspose.Tasks supporta la lettura/scrittura di formule nei file di progetto MPP. La proprietà Formula di ExtendedAttributeDefinition fornisce l’interfaccia per leggere il valore della formula. Gli esempi seguenti descrivono come leggere le formule dagli attributi locali e Enterprise Extended dal file MPP. Mostra anche come scrivere formule nel file MPP.

Lettura di formule negli attributi estesi locali ed aziendali dal file MPP

L’implementazione simile basata su Java per lo stesso è come sotto:

// Il percorso della directory dei documenti.
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());

Scrivere formule in attributi estesi a formati di file MPP

L’implementazione simile basata su Java per lo stesso è come sotto:

// Il percorso della directory dei documenti.
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));

// crea un nuovo campo personalizzato (Testo attività1) con formula che raddoppierà il costo dell'attività
ExtendedAttributeDefinition attr = ExtendedAttributeDefinition.createTaskDefinition(CustomFieldType.Text,
        ExtendedAttributeTask.Text1, "Custom");
attr.setAlias("Double Costs");
attr.setFormula("[Cost]*2");

project.getExtendedAttributes().add(attr);

// aggiungi un'attività per vedere il risultato in MSP
Task task = project.getRootTask().getChildren().add("Task");
// impostare il costo dell'attività
task.set(Tsk.COST, BigDecimal.valueOf(100));
// vedere il risultato nello screenshot allegato (result.jpg)
project.save(dataDir + "saved.mpp", SaveFileFormat.MPP);

Implementazione del prefisso delle risorse per le risorse nidificate

Aspose.Tasks fornisce la proprietà ResourceSavingArgs.NestedUri che consente di salvare le risorse nidificate (ad esempio PNG all’interno di file SVG) in una cartella separata. Negli esempi seguenti, abbiamo dimostrato il caso d’uso per l’utilizzo della funzionalità.

L’implementazione simile basata su Java per lo stesso è come sotto:

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

}

Lavorare con gli attributi estesi

Microsoft Project (MSP) dispone di un ampio schema di scambio di dati XML che semplifica lo scambio di informazioni tra le applicazioni e la programmazione con i file di progetto. Lo schema consente di aggiungere attributi estesi a attività, risorse e assegnazioni. Questo articolo illustra come utilizzare gli attributi estesi in Aspose.Tasks.

La proprietà ExtendedAttribute esposta dalla classe Resource può essere utilizzata per gestire gli attributi estesi di una risorsa. Questa proprietà legge e scrive un ArrayList degli oggetti ExtendedAttribute per gestire gli attributi estesi di una risorsa. L’oggetto ExtendedAttribute espone ulteriormente le proprietà rilevanti

L’implementazione simile basata su Java per lo stesso è come sotto:

// Il percorso della directory dei documenti.
String dataDir = Utils.getDataDir(ExtendedResourceAttributes.class);

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

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

// Crea un attributo esteso e impostane il valore
ExtendedAttribute number1Resource = myNumber1.createExtendedAttribute();
number1Resource.setNumericValue(BigDecimal.valueOf(30.5345));

// Aggiungi una nuova risorsa e il suo attributo esteso
Resource rsc = prj.getResources().add("R1");
rsc.getExtendedAttributes().add(number1Resource);

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

// Visualizza il risultato della conversione.
System.out.println("Process completed Successfully");

Miglioramenti al rendering

In questa versione l’attenzione è stata posta anche sul miglioramento delle prestazioni di rendering dell’API. Sono stati affrontati anche i problemi di rendering di PDF e HTML. Altri miglioramenti includono la risoluzione di problemi relativi all’apertura e al salvataggio di file MPP, ID attività e timeline errati.

Aspetta, ci sono molte altre funzionalità, miglioramenti e correzioni di bug incluse in questa versione. Qui puoi ottenere i dettagli!

Abbiamo anche mantenuto gli esempi di esempio funzionanti per API basate su .NET e Java su Github in modo che gli utenti possano utilizzare immediatamente diversi campioni ed esplorare le funzionalità dell’API. Puoi anche parlare di problemi relativi alle API con noi nel nostro supporto per i prodotti forum.