Здравейте, в тази статия ще обясня как се работи на базово ниво с TreeMap и как се извлича информация от *.xlsx (екселски) файл.
Задачата, която ще използвам за пример изисква да се извлекат офисите от първата колона и приходите от последната такава в тази екселска таблица, след което да се изкарат сортирани, като срещу всеки офис стои общия му приход (без да се повтарят).
За да можем да прочетем информация от xls или xlsx файл ще ни е нужна външна библиотека. Използвам съм Apache POI библиотеката. Jar файловете, които ни трябват са:
dom4j-1.6.1.jar
poi-3.10-FINAL-20140208.jar
poi-ooxml-3.10-FINAL-20140208.jar
poi-ooxml-schemas-3.10-FINAL-20140208.jar
xmlbeans-2.3.0.jar
Слагаме ги в /lib поддиректория на проекта и ги включваме в него. Как става това съм обяснил по-подробно в началото на този пост.
Като за начало ето линк към готово решение. Poi библиотеката като цяло е много удобна и лесна за употреба и извличането на данните не е особено сложна задача. Това, което ме затрудни обаче, бе какъв тип данни да използвам за съхранението им. Първоначално се спрях се на познатия ми от C# тип Dictionary<key, value> който в джава намерих като HashМap<key, value> след което осъзнах, че TreeMap<key, value> ще бъде по-удобен (работят по идентичен начин, с разликата, че TreeMap сортира данните по ключ, следователно ще е по-лесно да ги изкарам накрая). Създаването на нова „карта“ става по следния начин:
TreeMap<String, Double> allOffices = new TreeMap<String, Double>();
За ключ ще изполвам името на офиса като стринг, а за стойност прихода във формат double.
Започвам като отварям файла в Try-With-Resources конструкция, която е препоръчително да се използва при работа с ресурси:
try (FileInputStream input = new FileInputStream(„Incomes-Report.xlsx“)) {
След което се възползвам от методите на POI Library, за да чета от него. Мисля, че кода говори сам – създавам нов workbook, след което от него взимам Sheet, който се казва „Incomes“ и хващам вторият ред от него (в програмирането се брои от нула). Тук трябва да имаме предвид, че има значение дали файлът е .XLSX или .XLS и ако сме намерили готов код за xls файл (както направих първоначално), той няма да работи, а освен това ще са необходими и други библиотеки.
XSSFWorkbook wb = new XSSFWorkbook(input);
XSSFSheet sheet = wb.getSheet(„Incomes“);
XSSFRow currentRow = sheet.getRow(1);
while (currentRow != null) {XSSFCell officeCell = currentRow.getCell(0);String currentOffice = officeCell.getStringCellValue();XSSFCell incomeCell = currentRow.getCell(5);double currentIncome = incomeCell.getNumericCellValue();……currentRow = sheet.getRow(1 + currentRow.getRowNum());}
if (allOffices.containsKey(currentOffice)) {currentIncome += allOffices.get(currentOffice);}allOffices.put(currentOffice, currentIncome);
for (String office: allOffices.keySet()) {double income = allOffices.get(office);System.out.printf(„%s -> %.2f“, office, income);System.out.println();}