2015-03-15 10 views
-1

Я пытаюсь получить конкретные данные с листа excel. Данные динамические. Это может быть что угодно. Заголовки столбцов - единственные вещи, которые я могу использовать для заполнителей, но позиции заголовка столбца могут различаться в листе.Получение конкретных данных с листа excel JAVA

Например у меня есть лист, как это:

| Имя | Фамилия | Значение |

| bar | poo | 5 |

| baz | foo | 7 |

Но, к примеру, мне нужно пересечь лист, чтобы получить столбец фамилии, а затем, если я найду фамилию = 'poo', я должен вытащить соответствующее значение, которое на листе находится в следующем столбце, но это динамическое. Столбец фамилии и значения всегда рядом друг с другом, они могут находиться в любом положении вверху. Но если я найду конкретную «вещь» в столбце фамилии, мне нужно потянуть ее значение.

Мне удалось пройти через лист и сохранить все данные в массиве 2d И отобразить эти данные. из проведенного исследования, это не эффективный подход, поскольку перемещение и хранение больших данных с листов может использовать много памяти. Ive прочитал, что вы можете прочитать лист Excel и вместо сохранения этих значений в массиве вы можете сразу их записать на другой лист, если они соответствуют определенному условию. EG: (pseudo) Если (columnheader == surname & & фамилия == foo), то получите соответствующее значение, а затем напишите это значение на новый лист.

Хорошо, так что мои вопросы:

1.How ли я достичь перебора листа не хранить его в массиве и писать его прямо на другой лист, если он соответствует условию?

2. Из кода, который у меня ниже, как мне достичь сортировки по данным в массиве и найти, если surname = foo получить соответствующее значение?

Как я уже сказал, данные на листе являются динамическими, за исключением заголовков столбцов, но там, где заголовки являются динамическими.

Извините за длинный пост, любая помощь будет принята с благодарностью.

package demo.poi; 
 

 

 
import java.io.File; 
 
import java.io.FileInputStream; 
 
import java.io.FileOutputStream; 
 
import java.math.BigDecimal; 
 
import org.apache.poi.ss.usermodel.Cell; 
 
import org.apache.poi.ss.usermodel.Row; 
 
import org.apache.poi.ss.usermodel.Sheet; 
 
import org.apache.poi.ss.usermodel.Workbook; 
 
import org.apache.poi.xssf.usermodel.XSSFCell; 
 
import org.apache.poi.xssf.usermodel.XSSFRow; 
 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 
 

 

 
public class test { 
 

 
    public static void main(String[] args) throws Exception { 
 

 
     File excel = new File("test.xlsx"); 
 
     FileInputStream fis = new FileInputStream(excel); 
 

 
     XSSFWorkbook wb = new XSSFWorkbook(fis); 
 
     XSSFSheet ws = wb.getSheetAt(0); 
 
     ws.setForceFormulaRecalculation(true); 
 

 
     int rowNum = ws.getLastRowNum() + 1; 
 
     int colNum = ws.getRow(0).getLastCellNum(); 
 
     int surnameHeaderIndex = -1, valueHeaderIndex = -1; 
 

 
     //Read the headers first. Locate the ones you need 
 
     XSSFRow rowHeader = ws.getRow(0); 
 
     for (int j = 0; j < colNum; j++) { 
 
      XSSFCell cell = rowHeader.getCell(j); 
 
      String cellValue = cellToString(cell); 
 
      if("SURNAME".equalsIgnoreCase(cellValue)) { 
 
       surnameHeaderIndex = j; 
 
      } else if("VALUE".equalsIgnoreCase(cellValue)) { 
 
       valueHeaderIndex = j; 
 
      } 
 
     } 
 

 
     if(surnameHeaderIndex == -1 || valueHeaderIndex == -1) { 
 
      throw new Exception("Could not find header indexes\nSurname : " + surnameHeaderIndex + " | Value : " + valueHeaderIndex); 
 
     } 
 
     //createnew workbook 
 
     XSSFWorkbook workbook = new XSSFWorkbook(); \t \t 
 
\t \t //Create a blank sheet 
 
\t \t XSSFSheet sheet = workbook.createSheet("data"); 
 
\t \t 
 
     for (int i = 1; i < rowNum; i++) { 
 
      XSSFRow row = ws.getRow(i); 
 
      row = sheet.createRow(rowNum++); 
 
      String surname = cellToString(row.getCell(surnameHeaderIndex)); 
 
      String value = cellToString(row.getCell(valueHeaderIndex)); 
 
      int cellIndex = 0; 
 
      row.createCell(cellIndex++).setCellValue(surname); 
 
      row.createCell(cellIndex++).setCellValue(value); 
 
      
 

 
      
 
     } 
 
     FileOutputStream fos = new FileOutputStream(new File("test1.xlsx")); 
 
     workbook.write(fos); 
 
     fos.close(); 
 
    } 
 

 
    public static String cellToString(XSSFCell cell) { 
 

 
     int type; 
 
     Object result = null; 
 
     type = cell.getCellType(); 
 

 
     switch (type) { 
 

 
     case XSSFCell.CELL_TYPE_NUMERIC: 
 
      result = BigDecimal.valueOf(cell.getNumericCellValue()) 
 
        .toPlainString(); 
 

 
      break; 
 
     case XSSFCell.CELL_TYPE_STRING: 
 
      result = cell.getStringCellValue(); 
 
      break; 
 
     case XSSFCell.CELL_TYPE_BLANK: 
 
      result = ""; 
 
      break; 
 
     case XSSFCell.CELL_TYPE_FORMULA: 
 
      result = cell.getCellFormula(); 
 
     } 
 

 
     return result.toString(); 
 
    } 
 
}

+0

Приведите полный пример и желаемый результат.Вы упоминаете сортировку, но я не совсем понимаю, что вы имеете в виду. – alkis

+0

привет, поэтому в основном от этого превосходный лист. Я хочу повторить и найти конкретные значения. Например, теперь, когда я получил все данные в массиве, мне нужно делать что-то с ним. Например: Результат, который я ищу, когда я нахожу столбец Surname, найдите значение «foo», и когда вы найдете foo, перейдите к значению и получить соответствующее число. Если вы посмотрите на демо-лист, значение для «foo» равно «7». Но как получить местоположение foo и связать его со значением 7, если позиции заголовка столбца динамичны? – JavaPotter

ответ

1

Что-то, как это должно быть хорошей отправной точкой. В основном вы разбираете первый ряд, где расположены заголовки. Вы находите позицию заголовков, которые хотите, и сохраняйте их. В этом примере есть только два заголовка (фамилия, значение), которые необходимы, поэтому я просто сохраняю две переменные. Если их больше, то решение будет состоять в том, чтобы сохранить положение этих заголовков в HashMap, где ключ - это имя заголовка. После этого начинается итерация строк. Программа анализирует значения требуемых столбцов (row.getCell(index)). Теперь у вас есть значения, которые вам нужны, и только они. Вы можете делать все, что хотите, можете распечатать их или написать файл или еще что-то.

Вот пример. Обработка ошибок зависит от вас. Это только пример.

package POIParser; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.math.BigDecimal; 

import org.apache.poi.xssf.usermodel.XSSFCell; 
import org.apache.poi.xssf.usermodel.XSSFRow; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class MainPoi { 

    public static void main(String[] args) throws Exception { 

     File excel = new File("test.xlsx"); 
     FileInputStream fis = new FileInputStream(excel); 

     XSSFWorkbook wb = new XSSFWorkbook(fis); 
     XSSFSheet ws = wb.getSheetAt(0); 
     ws.setForceFormulaRecalculation(true); 

     int rowNum = ws.getLastRowNum() + 1; 
     int colNum = ws.getRow(0).getLastCellNum(); 
     int surnameHeaderIndex = -1, valueHeaderIndex = -1; 

     // Read the headers first. Locate the ones you need 
     XSSFRow rowHeader = ws.getRow(0); 
     for (int j = 0; j < colNum; j++) { 
      XSSFCell cell = rowHeader.getCell(j); 
      String cellValue = cellToString(cell); 
      if ("SURNAME".equalsIgnoreCase(cellValue)) { 
       surnameHeaderIndex = j; 
      } else if ("VALUE".equalsIgnoreCase(cellValue)) { 
       valueHeaderIndex = j; 
      } 
     } 

     if (surnameHeaderIndex == -1 || valueHeaderIndex == -1) { 
      throw new Exception("Could not find header indexes\nSurname : " 
        + surnameHeaderIndex + " | Value : " + valueHeaderIndex); 
     } 
     // createnew workbook 
     XSSFWorkbook workbook = new XSSFWorkbook(); 
     // Create a blank sheet 
     XSSFSheet sheet = workbook.createSheet("data"); 

     for (int i = 1; i < rowNum; i++) { 
      XSSFRow row = ws.getRow(i); 
      String surname = cellToString(row.getCell(surnameHeaderIndex)); 
      String value = cellToString(row.getCell(valueHeaderIndex)); 
      int cellIndex = 0; 
      //Create a newRow object for the output excel. 
      //We begin for i = 1, because of the headers from the input excel, so we go minus 1 in the new (no headers). 
      //If for the output we need headers, add them outside this for loop, and go with i, not i-1 
      XSSFRow newRow = sheet.createRow(i-1); 
      newRow.createCell(cellIndex++).setCellValue(surname); 
      newRow.createCell(cellIndex++).setCellValue(value); 
     } 

     FileOutputStream fos = new FileOutputStream(new File("test1.xlsx")); 
     workbook.write(fos); 
     fos.close(); 
    } 

    public static String cellToString(XSSFCell cell) { 

     int type; 
     Object result = null; 
     type = cell.getCellType(); 

     switch (type) { 

     case XSSFCell.CELL_TYPE_NUMERIC: 
      result = BigDecimal.valueOf(cell.getNumericCellValue()) 
        .toPlainString(); 

      break; 
     case XSSFCell.CELL_TYPE_STRING: 
      result = cell.getStringCellValue(); 
      break; 
     case XSSFCell.CELL_TYPE_BLANK: 
      result = ""; 
      break; 
     case XSSFCell.CELL_TYPE_FORMULA: 
      result = cell.getCellFormula(); 
     } 

     return result.toString(); 
    } 
} 
+0

Да, вы правы. Я добавлю эту мысль. – alkis

+0

спасибо Алкис, это, безусловно, хорошее начало для меня, оцените его. У вас есть предложения по вопросу 1? – JavaPotter

+0

Проверьте код. Обновлено – alkis

Смежные вопросы