Apache POI видит столбцы в пустой электронной таблице?
-
23-12-2019 - |
Вопрос
У меня есть пустая электронная таблица, но когда я обращаюсь к ней с помощью 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!Это ошибка, и на мой взгляд очень случайно.Я получаю нуль случайно, и часто помогаю, если я удалю пустые строки (ниже) и пустые столбцы (на правой стороне). ...