Вопрос

У меня есть пустая электронная таблица, но когда я обращаюсь к ней с помощью Apache POI (версия 3.10), в ней говорится, что в ней 1024 столбца и 20 физических столбцов.
Я действительно удалил все ячейки, осталось только некоторое форматирование, но никакого содержимого.
И если я удалю некоторые столбцы с помощью LibreOffice Calc (версия 4.1.3.2), то только количество столбцов увеличивается!Что происходит?
Есть ли надежный способ получить реальное количество столбцов (или ячеек в строке)?

import java.net.URL;
import org.apache.poi.ss.usermodel.*;

public class Test {
    public static void main(final String... args) throws Exception {
        final URL url = new URL("http://aditsu.net/empty.xlsx");
        final Workbook w = WorkbookFactory.create(url.openStream());
        final Row r = w.getSheetAt(0).getRow(0);
        System.out.println(r.getLastCellNum());
        System.out.println(r.getPhysicalNumberOfCells());
    }
}
Это было полезно?

Решение

После еще некоторого расследования, я думаю, я понял, что происходит.

Во-первых, немного терминологии из POI:есть некоторые ячейки, которые на самом деле вообще не существуют в электронной таблице - они называются потерянный, или не определено/не определено.Затем есть несколько ячеек, которые определены, но не имеют значения - они называются пустой ячейки.Оба типа ячеек отображаются пустыми в программе для работы с электронными таблицами и их невозможно отличить визуально.

В моей электронной таблице есть несколько пустых ячеек, которые LibreOffice добавил в конец строки (возможно, ошибка).Когда я удаляю столбцы, LibreOffice, похоже, сдвигает последующие ячейки (включая пустые) влево и добавляет больше пустых ячеек в конце (до 1024).

А теперь ключевая часть:ни getLastCellNum() ни getPhysicalNumberOfCells() игнорируйте пустые ячейки. getLastCellNum() дает последнее определенный ячейка, и getPhysicalNumberOfCells() дает количество определенный ячейки, обе из которых включают пустые ячейки.Похоже, нет ни одного доступного метода, который пропускал бы пустые ячейки.javadoc для getPhysicalNumberOfCells() это несколько вводит в заблуждение - "если бы значения были только в столбцах 0,4,5, тогда было бы 3", но на самом деле это также подсчет пустых ячеек, которые на самом деле не имеют значений.

Итак, единственное решение, которое я нашел, - это пройтись по ячейкам и проверить, являются ли они пустыми.

Дополнительное примечание: getLastRowNum() и getFirstCellNum() основаны на 0, но getLastCellNum() основан на 1, wtf?

Другие советы

Скорее всего, у вас есть какой-то формат форматирования для вас ряд.У меня есть пустой файл XLSX, созданный с Excel и метод getRow, производит NULL для пустых строк.

@ADITSU в соответствии с https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/row.html , getlastcellnum () Получает индекс последней ячейки, содержащейся в этой строке плюс один.

+1 для LibreOffice Brougle!Это ошибка, и на мой взгляд очень случайно.Я получаю нуль случайно, и часто помогаю, если я удалю пустые строки (ниже) и пустые столбцы (на правой стороне). ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top