Читать excel с Апачи POI в java по имени колонны

Хорошая вечером эксперты, у меня есть проблематика с проектом, который состоит в чтении файла excel и санкционировании из-за колонн данных тех же самых, мне удалось прочитать файл без проблем и утверждений также (посредством регулярных выражений) посредством книжного магазина Апачи POI деталь - что я только могу читать колонны из-за индекса колонны (пример индекс 0 = колонна 1, индекс 1 = колонна 2 и т.д.) с методом getColumnIndex() проблема состоит в том, что я нуждаюсь в том, чтобы прочитать их по Вашему имени колонны вместо из-за Вашего индекса ввиду того, что файл, который нужно читать, будет склоняться к тому, чтобы менять положения колонны, есть какой-то метод, чтобы это решать, я попытался с:

columnIndex = cell.getSheet().getRow(rowIndex).getCell(0).getRichStringCellValue().toString();

Но только я могу прочитать всю линию больше не все колонны и линии.

Я присоединяю код, который я использую, чтобы читать файлы:

 Workbook workbook = WorkbookFactory.create(new FileInputStream("C:\\archivo.xlsx"));

    Sheet sheet = workbook.getSheetAt(0);
    totalRows = sheet.getPhysicalNumberOfRows();
    System.out.println("Número total de filas: " + totalRows);
    Iterator<Row> rowIterator = sheet.iterator();

    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();
        rowIndex = row.getRowNum();

        int rowIndex2 = rowIndex +1;

        if (rowIndex2 < 8) {
            continue;
        }
        Iterator<Cell> cellIterator = row.cellIterator();

        while (cellIterator.hasNext()) {

            cell = cellIterator.next();
            columnIndex = cell.getColumnIndex();


            switch (columnIndex) {
                case 0:
                    columnName = "columna 1";
                    //System.out.println(columnName+" -> " + rowIndex);
                    break;
                case 1:
                    columnName = "Columna 2";
                    break;
                case 2:
                    columnName = "Columna 3";
                    break;

            }


            value = this.getValue(cell);
            valid = this.isValid(columnIndex, value);

            if (valid && (value != "")) {
                continue;
            }


            if (value!="")
            {
            System.out.print("Valorno válido: " + columnName + " - " + rowIndex2);
            System.out.println(" -> valor no válido: " + value);
            }

        }

    }

    return procesarBTR();
}

private String getValue(Cell cell) {
    switch (cell.getCellType()) {
        case Cell.CELL_TYPE_BLANK:
            // return columnName;
            return "";

        case Cell.CELL_TYPE_BOOLEAN:
             return "CELL_TYPE_BOOLEAN";
           // return cell.getStringCellValue();

        case Cell.CELL_TYPE_ERROR:
            return "CELL_TYPE_ERROR";

        case Cell.CELL_TYPE_FORMULA:

            /*switch (cell.getCachedFormulaResultType()) {
                case Cell.CELL_TYPE_STRING:
                    return cell.getStringCellValue();
                case Cell.CELL_TYPE_NUMERIC:
                    return cell.getNumericCellValue() + "";
                default:
                    return "";}*/
            return cell.getStringCellValue();


        case Cell.CELL_TYPE_NUMERIC:
            return fmt.formatCellValue(cell);

        case Cell.CELL_TYPE_STRING:
            return cell.getStringCellValue();

        default:
            return "valor desconocido";

    }

}

Код, который реализует утверждения...

3
задан 10.03.2016, 01:39
1 ответ

Как я упомянул в комментариях, (приспособленный):

В Excel ты не можешь называть в колонну, не существует эта концепция. Поэтому, не будет способа в других программных средствах читать колонны по Вашему "имени". POI работает читая линии посредством класса Row и ячейки, которые есть в этой линии посредством класса Cell. Согласно которому ты комментируешь мне, твой лучший выбор был бы:

  1. Объявлять карту, которая служила бы как метадата имени колонны и расположение (число) колонны.
  2. В твоем файле Excel и лист, который нужно анализировать, posicionarte в линии, у которой будут имена колонн.
  3. Для каждой ячейки вышеупомянутой линии:

    3.1. Если ячейка обладает текстом и не является пустой, хранить новый вход в карту. Ввод состоит из стоимости текста ячейки как ключа и числа колонны как стоимость.

  4. Как только была проанализирована метадата твоего файла, parsear оставшаяся часть данных в Excel используя только колонны, которые ты хочешь прочитать. Для этого, ты основываешься на карту метадаты. Для этой части, понимают, что у тебя должна быть коллекция или она располагает в порядке, где были "имена колонн", которые ты будешь обрабатывать.

Поставляется пример описанного алгоритма вверх (ВАЖНО: понимают, что ячейки не сочетались, и что только есть 1 единственная линия для имен колонн)

//paso 0. Definir una colección con nombres de las columnas a procesar
//considera que esto lo puedes leer de un archivo de configuración,
//input de usuario o cualquier otra fuente
List<String> columnas = Arrays.asList("Apellido", "Prima");
//paso 1.
Map<String, Integer> mapNombresColumnas = new HashMap<>();
//paso 2.
//número de fila donde están los nombres de celda
//recuerda que POI está basado con índice 0
//si tus nombres están en la fila 1, entonces deberías iniciar esta
//variable con 0.
final int filaNombresColumnas = ...;
//ubicación del archivo Excel a procesar
File archivoExcel = new File("/ruta/de/archivo/excel.xlsx");
//abrir el archivo con POI
Workbook workbook = WorkbookFactory.create(archivoExcel);
//ubicarse en la hoja donde vas a procesar
//si es la primera hoja, debes indicar 0
Sheet sheet = workbook.getSheetAt(...);
//acceder a la fila con los nombres de las columnas
Row filaNombresColumna = sheet.getRow(filaNombresColumnas);
//paso 3.
//utilizando el poder de Java 8
row.cellIterator().forEachRemaining(cell -> {
    //paso 3.1.
    String valorCelda = cell.getStringCellValue().trim();
    if (!valorCelda.isEmpty()) {
        mapNombresColumnas.put(valorCelda, cell.getColumnIndex());
    }
});
//paso 4.
//se asume que los valores para procesar se encuentran en la fila
//siguiente a la fila donde están los nombres de las columnas
int indiceDatos = filaNombresColumnas + 1;
Row filaDatos = null;
//recorrer todas las filas con datos
while ((filaDatos = sheet.getRow(indiceDatos++)) != null) {
    //se procesan solo las celdas en base a los "nombres" de esas columnas
    for (String col : columnas) {
       //el resultado de mapNombresColumnas.get(col) es
       //el número de columna a leer
       //en este caso, solo se imprime el resultado
       //puedes reemplazar esto por la manera en que debas procesar la información
       System.out.print(filaDatos.getCell(mapNombresColumnas.get(col)) + " ");
    }
    System.out.println();
}

Для файла Excel, где у первого листа есть следующая структура:

        A           B         C      D
1    Nombre   | Apellido  | Edad | Prima
2    Luis     | Hernández |   28 | 150.43
3    José     | Zavala    |   35 | 170.21
4    Mercedes | Velásquez |   17 | 112.86

И используя:

final int filaNombresColumnas = 0;
//...
Sheet sheet = workbook.getSheetAt(0);

Получается следующий результат:

Hernández 150.43 
Zavala 170.21 
Velásquez 112.86 
1
ответ дан 24.11.2019, 14:45

Теги

Похожие вопросы