使用apache元模型更新Excel文件 - java

我正在尝试将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更新为“None”。

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

我是否缺少简单的东西?该文档非常稀疏,但是我已经阅读了互联网在此软件包中提供的所有内容。感谢您的宝贵时间。

参考方案

晚会晚了,但是我最近碰到了这个问题,还没有在其他地方找到答案。实际的删除发生在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所指出的那样,您仍将“更新”行移到底部,但是在我的用例中,成功删除了空行。

N.B.我正在使用Apache Metamodel 4.5.4

Apache Commons软件包中的IntegerUtils和DoubleUtils - java

我广泛使用了Apache Commons包,尤其是StringUtils,BooleanUtils,ObjectUtils,MapUtils类,并发现它们非常有用。我想知道是否有诸如IntegerUtils,DoubleUtils之类的类为其各自的包装器类提供类似的功能(我在Apache Commons包中找不到此类)。谢谢,文卡特 参考方案 我希望他们有一…

有效地将包含字母的字符串转换为Int-Apache Spark - java

我正在使用将用户作为字符串的数据集(即B000GKXY4S)。我想将这些用户中的每一个都转换为int,因此可以在Apache Spark ALS中使用Rating(user:Int,product:Int,rating:Double)类。最有效的方法是什么?最好使用Spark Scala函数或python本机函数。 参考方案 如果只想将任何可匹配的Strin…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

Java:线程池如何将线程映射到可运行对象 - java

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

Java:我可以在Hashmaps中使用数组吗? - java

我可以在Hashmaps中使用数组吗?如果是这样,则声明这种哈希图的确切语法是什么?谢谢 参考方案 数组也是对象。甚至像int[]这样的原始数组。Map<String,String[]> map = new HashMap<String,String[]>();