【问题标题】:updating an excel file with apache metamodel使用 apache 元模型更新 excel 文件
【发布时间】:2014-08-08 17:44:58
【问题描述】:

我正在尝试将 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

我错过了一些简单的东西吗?文档非常稀少,但我已经阅读了互联网在这个包上提供的所有内容。感谢您的宝贵时间。

【问题讨论】:

    标签: java excel apache metamodel apache-metamodel


    【解决方案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);
        }
    

    请参阅 Apache POI 文档以更好地理解 shiftRows()。 正如 Adi 指出的那样,您最终仍会将“更新”行移至底部,但在我的用例中,空行已成功删除。

    注意我正在使用 Apache Metamodel 4.5.4

    【讨论】:

      【解决方案2】:

      你没有错过任何东西。 ExcelDataContext 没有提供它自己的更新行为。默认使用 apache 元模型的默认存储不可知实现来更新数据。 UpdateCallback 的实现使用了导致您正在观察的行为的 DeleteAndInsertCallback。它选择要更新的行,用内存中的新值更新它,删除原始行并插入更新的行(最终在底部,这是 ExcelDataContext 行为)。 您可以在https://issues.apache.org/jira/browse/METAMODEL 上打开一个问题 附上您的示例代码和数据。 最好是失败的单元测试 https://git-wip-us.apache.org/repos/asf/metamodel.git

      【讨论】:

      • 这种行为有什么改善吗?因为,即使我也面临这个问题并在这里寻找线索......!!!!
      猜你喜欢
      • 2015-11-23
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多