4

Apache MetaModel をプロジェクトに組み込もうとしていますが、奇妙な問題が発生し続けています。コードで Excel スプレッドシートの行を更新します。コードは適切な行を見つけて削除し、その行を (私の更新で) スプレッドシートの一番下に追加します。同じデータが同じ行にとどまるように、更新をインプレースで行いたいと思います。私はそれが間違っていると思ったので、ばかげた単純なプロジェクトをセットアップして動作を複製しました。残念ながら、問題は残っています。

xlsx ファイルは次のとおりです。

Name    Address           City          State   Zip
Bob     123 Main St.      Norman        OK      11111
Fred    989 Elm Street    Chicago       IL      22222
Mary    555 First Street  San Francisco CA      33333

ここで、Bob の Zip を「なし」に更新したいと思います。

package MMTest;
import java.io.File;
import org.apache.metamodel.UpdateableDataContext;
import org.apache.metamodel.excel.ExcelDataContext;
import org.apache.metamodel.schema.Column;
import org.apache.metamodel.schema.Schema;
import org.apache.metamodel.schema.Table;
import org.apache.metamodel.update.Update;
public class MMTest {
    public static void main(String[] args) {
    UpdateableDataContext excel = new ExcelDataContext(new File("C:/test/test.xlsx"));
    Schema schema = excel.getDefaultSchema();
    Table[] tables = schema.getTables();
    assert tables.length == 1;
    Table table = schema.getTables()[0];
    Column Name = table.getColumnByName("Name");
    Column Zip = table.getColumnByName("Zip");
    excel.executeUpdate(new Update(table).where(Name).eq("Bob").value(Zip, "None"));
    }
}

かなり単純ですよね?いいえ。結果は次のとおりです。

Name    Address           City          State   Zip
<blank line>                
Fred    989 Elm Street    Chicago       IL      22222
Mary    555 First Street  San Francisco CA      33333
Bob     123 Main St.      Norman        OK      None

簡単なものがありませんか?ドキュメントはかなりまばらですが、このパッケージについてインターネットで提供されているものはすべて読みました。お時間をいただきありがとうございます。

4

2 に答える 2

1

パーティーに遅れましたが、私は最近この問題にぶつかり、まだ他の場所で答えを見つけていません. 実際の削除はExcelDeleteBuilder.javaで行われます

行の順序を維持することに関心がない場合は、変更できます

    for (Row row : rowsToDelete) {
        sheet.removeRow(row);
    }

    for (Row row : rowsToDelete) {
        int rowNum = row.getRowNum() + 1;
        sheet.removeRow(row);
        sheet.shiftRows(rowNum, sheet.getLastRowNum(), -1);
    }

shiftRows()の理解を深めるには、Apache POI ドキュメントを参照してください。Adi が指摘したように、「更新された」行が一番下に移動することになりますが、私の使用例では、空の行は正常に削除されます。

NB私はApache Metamodel 4.5.4から作業しています

于 2016-11-16T22:58:17.617 に答える