aspose-tasks-for-net こんにちは!本日のブログでは、最新の Aspose.Tasks API について紹介します。 Aspose チームの良いところは、Aspose.Tasks 用の .NET と Java ベースの API を毎月同時に公開していることです。 .NET ベースと Java ベースのバリアントはどちらも、機能に関しては同じレベルにあり、両方の API ユーザーがそれぞれの環境で新しい機能を試すことができます。次のセクションでは、API の新機能と改善点について説明します。
C# および Java での Microsoft Project ファイルへのメタデータの書き込み
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 プロジェクト ファイルへの数式の読み取り/書き込みをサポートしています。 ExtendedAttributeDefinition の Formula プロパティは、式の値を読み取るためのインターフェイスを提供します。次の例では、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));
// タスク コストを 2 倍にする数式で新しいカスタム フィールド (タスク テキスト 1) を作成します。
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 は、ネストされたリソース (SVG ファイル内の PNG など) を別のフォルダーに保存できる ResourceSavingArgs.NestedUri プロパティを提供します。次の例では、この機能を使用するユース ケースを示しています。
同様の 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 で拡張属性を使用する方法について説明します。
Resource クラスによって公開される ExtendedAttribute プロパティを使用して、リソースの拡張属性を管理できます。このプロパティは、ExtendedAttribute オブジェクトの ArrayList を読み書きして、リソースの拡張属性を処理します。 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 ファイルのオープンと保存に関する問題の解決、不適切なタスク ID とタイムラインが含まれます。
このリリースには、他にも多くの機能、機能強化、およびバグ修正が含まれています。 詳細はこちら!
また、Github で .NET ベースと Java ベースの両方の API の実用的なサンプル サンプルを維持しているため、ユーザーはすぐにさまざまなサンプルを使用して API 機能を調べることができます。製品サポート フォーラム で API 関連の問題について話し合うこともできます。