Apache POI видит столбцы в пустой таблице?

У меня есть пустая таблица, но когда я получаю доступ к ней с помощью 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() дает количество определенных ячеек, включая и пустые ячейки. Кажется, что нет доступных методов, которые пропускают пустые ячейки. getPhysicalNumberOfCells() для getPhysicalNumberOfCells() несколько вводит в заблуждение – «если только столбцы 0,4,5 имеют значения, тогда будет 3», но на самом деле это тоже подсчет пустых ячеек, которые на самом деле не имеют значений.

Таким образом, единственным решением, которое я нашел, является цикл через ячейки и проверка, являются ли они пустыми.

Боковое примечание: getLastRowNum() и getFirstCellNum() основаны на 0, но getLastCellNum() основан на 1, wtf?

Скорее всего, у вас есть какое-то форматирование, применяемое для вас. У меня есть пустой файл xlsx, созданный с помощью excel и метода getRow создает null для пустых строк.

  • Excel индекс нижнего элемента в столбце, но> 0
  • Лучшие способы получить таблицы из R в Libre Office Writer?
  • Автоматическая заливка LibreOffice Calc на основе списка и стоимости ячейки
  • Условный SUM с Calc на основе другого столбца
  • Подсчитайте различные вхождения и скопируйте уникальные значения
  • Сохранить файл в другом расширении в Excel 2013
  • Столбцы группы 2 и суммы для другого столбца
  • Разница в формуле SUMIFS между Libreoffice calc и Excel
  • Умножать числа в содержимом ячейки Excel или LibreOffice константой, когда они смешиваются с текстом?
  • Как найти частичные элементы соответствия в таблице Excel?
  • Как извлечь данные из одной ячейки в другую
  • Interesting Posts

    Объект, требуемый для Private Sub

    Макрос для копирования ячеек из одной открытой книги в другую открытую рабочую книгу … если я не знаю их путь к файлу

    Разделить текст в ячейках при разрыве строк и копировать на новый лист

    Более эффективный способ удаления строк

    Использование пользовательских типов данных в VBA

    Импорт CSV с использованием проблемы с загрузкой LOAD DATA INFILE

    Сценарий удаления диапазона VBA

    Сценарий Excel VBA для сравнения двух наборов данных и перестановок идентификаторов

    FROM ключевое слово не найдено, где ожидается Ошибка в SQL

    SUMPRODUCT с пустыми ячейками / ISNUMBER

    Java XLS получает ячейку через имя столбца

    Excel Показать данные на основе пользовательского выбора

    Найти значение String в ячейке, которое имеет незначительные модификации до конца

    C # Как обновить таблицу доступа из Excel?

    Экспортируйте в HTML, после чего Excel внезапно падает после этого

    Давайте будем гением компьютера.