我试图将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
我错过了一些简单的东西吗?文档很稀疏,但我已经阅读了互联网在这个软件包上提供的所有内容。我很感激你的时间。
答案 0 :(得分: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指出的那样,你仍然会将“更新”行移到底部,但在我的用例中,空行被成功删除。
N.B。我正在使用Apache Metamodel 4.5.4
答案 1 :(得分:0)
你没有遗漏任何东西。 ExcelDataContext没有提供自己的更新行为。使用apache元模型的默认存储不可知实现来更新数据是默认的。 UpdateCallback的实现使用DeleteAndInsertCallback,这会导致您正在观察的行为。它选择要更新的行,使用内存中的新值更新它,删除原始行并插入更新的行(最后一行是ExcelDataContext行为)。 您可以在https://issues.apache.org/jira/browse/METAMODEL处打开问题 附上您的示例代码和数据。 最好的是一个失败的单元测试 https://git-wip-us.apache.org/repos/asf/metamodel.git