обновление файла excel с помощью метамодели apache

Я пытаюсь включить 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

Теперь я хочу обновить почтовый индекс Боба до «Нет».

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

Я пропустил что-то простое? Документации довольно мало, но я прочитал все, что может предложить Интернет по этому пакету. Я ценю ваше время.


person dlunday    schedule 08.08.2014    source источник


Ответы (2)


Поздно на вечеринку, но я недавно столкнулся с этой проблемой и еще не нашел ответа в другом месте. Фактическое удаление происходит в ExcelDeleteBuilder.java.

Если вы не беспокоитесь о поддержании порядка строк, вы можете изменить

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

to

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

См. документы Apache POI для лучшего понимания shiftRows(). Как указал Ади, вы все равно получите «обновленную» строку, перемещенную вниз, но в моем случае использования пустая строка успешно удалена.

Н.Б. Я работаю с метамоделью Apache 4.5.4.

person L. Herron    schedule 16.11.2016

Вы ничего не упускаете. ExcelDataContext не обеспечивает собственное поведение при обновлении. По умолчанию для обновления данных используется независимая реализация хранилища метамодели apache по умолчанию. Эта реализация UpdateCallback использует DeleteAndInsertCallback, который вызывает поведение, которое вы наблюдаете. Он выбирает строку для обновления, обновляет ее новым значением в памяти, удаляет исходную строку и вставляет обновленную строку (которая оказывается внизу, что является поведением ExcelDataContext). Вы можете открыть задачу по адресу https://issues.apache.org/jira/browse/METAMODEL Прикрепите пример кода и данные. Лучше всего будет неудачный модульный тест в https://git-wip-us.apache.org/repos/asf/metamodel.git

person Adi Pandit    schedule 25.04.2015
comment
Есть ли улучшения в этом поведении? Потому что даже я сталкиваюсь с этой проблемой и ищу здесь ключ к разгадке....!!!! - person zeal; 09.12.2015