aspose-tasks-for-net ¡Hola amigos! En el blog de hoy, le daré un recorrido por la API Aspose.Tasks más reciente. Lo bueno del equipo de Aspose es que publica API basadas en .NET y Java para Aspose.Tasks simultáneamente todos los meses. Tanto las variantes basadas en .NET como Java están al mismo nivel en términos de características y ambos usuarios de la API pueden explorar las nuevas características en sus respectivos entornos. En la siguiente sección, hablaré sobre las nuevas funciones y mejoras realizadas en la API.

Escribir metadatos en archivos de Microsoft Project en C# y Java

Aspose.Tasks proporciona una función para escribir metadatos en archivos MPP para calendarios, tareas, enlaces de tareas, recursos y asignaciones de recursos. El siguiente ejemplo describe cómo escribir información de metadatos en archivos MPP.

La implementación similar basada en Java para lo mismo es como la siguiente:

// La ruta al directorio de documentos.
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");
// campos nuevos
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));

// Agregar atributo extendido para proyecto y tarea
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);

Fórmulas de lectura y escritura

Aspose.Tasks API admite fórmulas de lectura/escritura en archivos de proyecto MPP. La propiedad Formula de ExtendedAttributeDefinition proporciona la interfaz para leer el valor de la fórmula. Los siguientes ejemplos describen cómo leer fórmulas de atributos extendidos locales y empresariales del archivo MPP. También muestra cómo escribir fórmulas en un archivo MPP.

Lectura de fórmulas en atributos extendidos locales y empresariales del archivo MPP

La implementación similar basada en Java para lo mismo es como la siguiente:

// La ruta al directorio de documentos.
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());

Escritura de fórmulas en atributos extendidos para formatos de archivo MPP

La implementación similar basada en Java para lo mismo es como la siguiente:

// La ruta al directorio de documentos.
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));

// cree un nuevo campo personalizado (Texto de tarea 1) con una fórmula que duplicará el costo de la tarea
ExtendedAttributeDefinition attr = ExtendedAttributeDefinition.createTaskDefinition(CustomFieldType.Text,
        ExtendedAttributeTask.Text1, "Custom");
attr.setAlias("Double Costs");
attr.setFormula("[Cost]*2");

project.getExtendedAttributes().add(attr);

// agregue una tarea para ver el resultado en MSP
Task task = project.getRootTask().getChildren().add("Task");
// establecer el costo de la tarea
task.set(Tsk.COST, BigDecimal.valueOf(100));
// vea el resultado en la captura de pantalla adjunta (result.jpg)
project.save(dataDir + "saved.mpp", SaveFileFormat.MPP);

Implementación de prefijos de recursos para recursos anidados

Aspose.Tasks proporciona la propiedad ResourceSavingArgs.NestedUri que permite guardar recursos anidados (por ejemplo, PNG dentro de archivos SVG) en una carpeta separada. En los siguientes ejemplos, hemos demostrado el caso de uso para usar la función.

La implementación similar basada en Java para lo mismo es como la siguiente:

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

}

Trabajar con atributos extendidos

Microsoft Project (MSP) tiene un amplio esquema de intercambio de datos XML que facilita el intercambio de información entre aplicaciones y la programación con archivos de proyecto. El esquema le permite agregar atributos extendidos a tareas, recursos y asignaciones. Este artículo muestra cómo trabajar con atributos extendidos en Aspose.Tasks.

La propiedad ExtendedAttribute expuesta por la clase Resource se puede usar para administrar los atributos extendidos de un recurso. Esta propiedad lee y escribe una ArrayList de los objetos ExtendedAttribute para manejar los atributos extendidos de un recurso. El objeto ExtendedAttribute expone aún más las propiedades relevantes

La implementación similar basada en Java para lo mismo es como la siguiente:

// La ruta al directorio de documentos.
String dataDir = Utils.getDataDir(ExtendedResourceAttributes.class);

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

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

// Crear atributo extendido y establecer su valor
ExtendedAttribute number1Resource = myNumber1.createExtendedAttribute();
number1Resource.setNumericValue(BigDecimal.valueOf(30.5345));

// Agregar un nuevo recurso y su atributo extendido
Resource rsc = prj.getResources().add("R1");
rsc.getExtendedAttributes().add(number1Resource);

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

// Muestra el resultado de la conversión.
System.out.println("Process completed Successfully");

Mejoras de renderizado

En esta versión, el enfoque también se ha puesto en la mejora del rendimiento de representación de la API. También se han solucionado los problemas de representación de PDF y HTML. Otras mejoras incluyen la resolución de problemas relacionados con la apertura y el guardado de archivos MPP, identificadores de tareas y cronogramas incorrectos.

Un momento, hay muchas otras funciones, mejoras y correcciones de errores incluidas en esta versión. ¡Aquí puede obtener los detalles!

También hemos mantenido los ejemplos de muestra de trabajo para las API basadas en .NET y Java en Github para que los usuarios puedan usar de inmediato diferentes muestras y explorar las características de la API. También puede hablar sobre problemas relacionados con la API con nosotros en nuestro [foro] de soporte de productos 3.