We're sorry Aspose doesn't work properply without JavaScript enabled.

Free Support Forum - aspose.com

[Aspose.Cells for Java] 複数ブックの結合を行いたい

お世話になっております。
Aspose.Cells for Java ver21.5を使用しています。
要件としては複数のブックを結合したいと思うのですが、
シートのaddメソッドを使ってもうまくできません。
別々のブック同士の結合は出来ないのでしょうか?
なお、各ブックにはオートシェイプやグラフチャートも含まれる為、
bookの[Combine]メソッドは使えませんでした。

(サンプルソース)
以下は、複数のブックを順にオープンして、ワークシート毎に新しいブック(newBook)にコピーするロジックです。しかし実際にはシートのコピーができませんでした。

 // Fileクラスのオブジェクトを生成する
File dir = new File("C:\\usr\\share\\temp\\excel");
// listFilesメソッドを使用して一覧を取得する
File[] list = dir.listFiles();

// NewBook定義
Workbook newBook = new Workbook();
WorksheetCollection newSheets = newBook.getWorksheets();

if (list != null) {
  Arrays.stream(list).forEach(f -> {
    // 対象ファイルがExcelの場合のみ処理する
    if (f.getName().lastIndexOf(".xlsx") != -1) {
      try {
        Workbook oldBook = new Workbook(f.getPath());
        WorksheetCollection oldSheets = oldBook.getWorksheets();
        for (int j = 0; j < oldSheets.getCount(); j++) {
          // newBookにoldBookからシートをコピー
          newSheets.add(oldSheets.get(j));
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  });
  try {
    // newBookを保存
    newBook.save("C:\\usr\\share\\temp\\excel\\NewBook.xlsx", SaveFormat.XLSX);
  } catch (Exception e) {
    e.printStackTrace();
  }
}

複数ブックの結合で他に良い方法があれば教えて下さい。
よろしくお願いいたします。

@ika0616,
您能否分享至少两个合并时失败的示例 Excel 文件,并借助示例文件的图像/描述确定问题以供我们参考?

@ahsaniqbalsidiqui
失礼しました。マージ前のサンプルファイルを連携します。サンプルファイル.zip (659.0 KB)

@ahsaniqbalsidiqui
すみません、私の方が少し勘違いしていました。
まずブックのマージですが、以下のロジックで「Combineメソッド」を使用する事で実現ができました。
ただ、製品マニュアルを見ると『現在、結合できるのは2番目のワークブックオブジェクトのセルデータとセルスタイルのみです。画像、チャート、その他の描画オブジェクトはサポートされていません。』と記載があります。
そこで確認ですが、先に添付したサンプルファイルようにオートシェイプやグラフチャートが存在するブック同士のマージは、以下のように「Combineメソッド」をそのまま使用して問題ないですか?

(サンプルソース)
// Fileクラスのオブジェクトを生成する
File dir = new File(“C:\usr\share\temp\excel”);
// ファイル一覧を取得する
Optional<File[]> list = Optional.ofNullable(dir.listFiles());

if (list.isEmpty()) {
  return;
}

// NewBook定義
Workbook newBook = new Workbook("C:\\usr\\share\\temp\\excel\\test.xlsx");
Arrays.stream(list.get()).forEach(f -> {
  try {
    // 個々のファイルをマージ
    newBook.combine(new Workbook(f.getPath()));
  } catch (Exception e) {
    e.printStackTrace();
  }
});
try {
  // マージ後のブックを保存
  newBook.save("C:\\usr\\share\\temp\\excel\\NewBook.xlsx", SaveFormat.XLSX);
} catch (Exception e) {
  e.printStackTrace();
}

@ika0616

添付の出力ファイルのように、combineメソッドがワークシートのすべての内容をコピーしているようです。 問題に気付いた場合はお知らせください。NewBook.zip (550.5 KB)

@ahsaniqbalsidiqui
確認頂きありがとうございます。
combineメソッドを使ってみます。また問題があれば別途お知らせします。
よって本件はクローズして頂いて結構です。

@ika0616,
どういたしまして、フィードバックをありがとうございます。

@ahsaniqbalsidiqui
すみません、本件について追加で質問させて下さい。

現状は上記ロジックにて「combineメソッド」 を使って複数のExcelファイルのマージをしています。
マージ自体は問題なくできるのですが、マージ対象のファイルが1000個ほどになると、
途中でメモリリークしてしまいます。
(個々のファイルは200~300KB前後で構成)
なお、要件的には最大5000ファイルのマージが必要な状態です。

(参考:サーバースペック) AWS Fargate
CPU:1vCPU
メモリ:5GB

上記踏まえて質問ですが、
ブックのマージをする場合、combineメソッド以外に何か方法はありますか?
(極力使用するメモリ消費を抑えたいと考えています。)

@ika0616,
問題を再現して調査できるように、サンプルアプリケーションといくつかのサンプルファイルを共有してください。

@ahsaniqbalsidiqui
本件について、サンプルアプリケーションは以下になります。
(アプリケーション全体は共有できないので、マージしている部分のみを抜粋しました。)
(サンプルソース)
// Fileクラスのオブジェクトを生成する
File dir = new File(“C:\usr\share\temp\excel”);
// ファイル一覧を取得する
Optional<File[]> list = Optional.ofNullable(dir.listFiles());

if (list.isEmpty()) {
  return;
}

// NewBook定義
Workbook newBook = new Workbook("C:\\usr\\share\\temp\\excel\\test.xlsx");
Arrays.stream(list.get()).forEach(f -> {
  try {
    // 個々のファイルをマージ
    newBook.combine(new Workbook(f.getPath()));
  } catch (Exception e) {
    e.printStackTrace();
  }
});
try {
  // マージ後のブックを保存
  newBook.save("C:\\usr\\share\\temp\\excel\\NewBook.xlsx", SaveFormat.XLSX);
} catch (Exception e) {
  e.printStackTrace();
}

また、サンプルファイルは以前共有したファイルと同じものですが再度共有します。
サンプルファイル.zip (659.0 KB)

@ahsaniqbalsidiqui
お聞きしたいのが、
①asposeを使ったExcelのマージを行う場合、上記Combineメソッド以外の方法はありますか?
(メモリを節約する他の方法があれば教えて下さい。)
②combineメソッド内での処理が分からないのですが、今のスペック(1vCPU、メモリ:5GB)
では5000ファイルをマージする事自体が無理だと思いますか?
(asposeとしてマージファイルに上限数などはありますか?)

以上、よろしくお願いいたします。

@ika0616,
調査のために、この問題を「CELLSJAVA-43951」としてデータベースに記録しました。 ニュースが届き次第、このトピックで更新します。

結合方法のみでワークブックをマージできます。 組み合わせるファイルの数に制限がないため、任意の数のファイルを組み合わせることができます。

@ika0616,

組み合わせる必要のあるすべてのファイルのすべてのデータと設定が必要な場合、シナリオに適した解決策はありません。 メモリコストは、これらのファイルのデータと設定にも依存します。 とにかく、処理する必要のあるファイル/ワークブックが非常に多いため、この種のプロセスにはかなりの量のメモリが必要になるのは合理的だと思います。

コードの場合、ブックを結合した後で手動で破棄して、メモリ使用量を改善できるかどうかを確認できます。

try {

Workbook s = new Workbook(f.getPath());
newBook.combine(s));
s.dispose();

}
catch (Exception e) 
{
e.printStackTrace();
}

すべての結合/コピー方法について、セルの値だけでなく、他の多くのデータと設定も結果のワークブックにコピーする必要があります。 他のファイルのセルの値のみが必要な場合は、セルを列挙して、結果のワークブックに1つずつ値を入れることができると思います。 この方法では、結合/コピー方法よりもはるかに優れたパフォーマンスが得られるはずです。

@Amjad_Sahi
ありがとうございます。
本件について、
・複数ブックのマージにはcombineメソッドを使う事
・マージ対象のブック数に比例して、必要メモリも多くなる事
は理解しました。
その後要件を調整し、複数ブックのマージは取り止める事になりました。

その為、本件についてはクローズして頂いて結構です。
ありがとうございました。

@ika0616,

あなたのフィードバックに感謝し、あなたが今それを整理したことを知って良かったです。 チケットをクローズしました。 ご不明な点やその他の問題がございましたら、お気軽にご返信ください。すぐにサポートさせていただきます。