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());
}
}
المحلول
بعد تحقيق بعض أكثر, أعتقد أنني فهمت ما يحدث.
أولا بعض المصطلحات من البوي:هناك بعض الخلايا التي لا وجود لها في الواقع على الإطلاق في جدول البيانات - هذه تسمى في عداد المفقودين, أو غير معرف/لم يتم تعريف.ثم هناك بعض الخلايا التي يتم تعريف ولكن لا قيمة لها - هذه تسمى فارغة الخلايا.كلا النوعين من الخلايا تظهر فارغة في جدول بيانات البرنامج و لا يمكن تمييزها بصريا.
بلدي جدول لديه بعض الخلايا الفارغة التي ليبر أوفيس وأضاف في نهاية الصف (ربما الخلل).عند حذف أعمدة ، ليبر أوفيس يبدو أن التحول اللاحقة الخلايا (بما في ذلك الفراغ منها) إلى اليسار, و يضيف المزيد من الخلايا الفارغة في النهاية (ما يصل إلى 1024).
و الآن جزء رئيسي:لا getLastCellNum()
ولا getPhysicalNumberOfCells()
تجاهل الخلايا الفارغة. getLastCellNum()
يعطي الماضي تعريف الخليوي ، getPhysicalNumberOfCells()
يعطي عدد تعريف الخلايا على حد سواء بما في ذلك الخلايا الفارغة.هناك لا يبدو أن هناك أي طريقة المتاحة التي يتخطى الخلايا الفارغة.جافادوك على 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 ليبر أوفيس strugle!انها علة, و في رأيي هو عشوائي جدا.أنا على الحصول على باطل عشوائيا, و غالبا ما يساعد لو حذف الصفوف الفارغة (خوار) و أعمدة فارغة (على الجانب الأيمن)....