Привет, пожалуйста, потому что вывод неправильный apache-poi excel java - PullRequest
0 голосов
/ 25 сентября 2019

Код

public @ResponseBody byte[] generate(HttpServletResponse response) {

response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

Workbook workbook = new XSSFWorkbook();
ByteArrayOutputStream out = new ByteArrayOutputStream();

try {

  File excelFile = new File();

  List<Column> columns = new ArrayList<>();

  Column column = new Column();
  column.setHeader("Header 1");

  List<String> values = new ArrayList<>();
  values.add("1.1");
  values.add("1.2");
  values.add("1.3");
  values.add("1.4");

  column.setValues(values);
  columns.add(column);

  column = new Column();
  column.setHeader("Header 2");

  values = new ArrayList<>();
  values.add("2.1");
  values.add("2.2");
  values.add("2.3");
  values.add("2.4");
  values.add("2.5");

  column.setValues(values);
  columns.add(column);

  column = new Column();
  column.setHeader("Header 3");

  values = new ArrayList<>();
  values.add("3.1");
  values.add("3.2");
  values.add("3.3");
  values.add("3.4");
  values.add("3.5");
  values.add("3.6");

  column.setValues(values);
  columns.add(column);

  excelFile.setColumns(columns);
  excelFile.setName("customers");

  response.setHeader("Content-Disposition",
      "attachment; filename=\"" + excelFile.getName() + ".xlsx\"");

  workbook.getCreationHelper();


  // Row for Header
  Sheet mySheet = workbook.createSheet(excelFile.getName());

  Row headerRow = mySheet.createRow(0);

  int cellCounter = 0;
  for (Column header : excelFile.getColumns()) {

    Cell cell = headerRow.createCell(cellCounter++);
    cell.setCellValue(header.getHeader());

  }


  int cellnum = 0;

  for (Column colum : excelFile.getColumns()) {

    int rownum = 1;

    for (String value : colum.getValues()) {

      Row row = mySheet.createRow(rownum++);

      Cell cell = row.createCell(cellnum);
      cell.setCellValue(value);

      System.out.println("y: " + rownum + ", x: " + cellnum + ", value: " + value
          + ", Column Index: " + cell.getColumnIndex() + ", Row Index: " + cell.getRowIndex()
          + ", cell value: " + cell.getStringCellValue());

    }

    cellnum++;

  }

  workbook.write(out);
  InputStream byt = new ByteArrayInputStream(out.toByteArray());

  return IOUtils.toByteArray(byt);

} catch (IOException e) {
  log.error("(generate) IOException: " + e.getLocalizedMessage(), e);
  e.printStackTrace();
} finally {
  try {
    workbook.close();
    out.close();
  } catch (IOException e) {
    log.error("(generate) IOException: " + e.getLocalizedMessage(), e);
    e.printStackTrace();
  }
}


return null;
}

консольный вывод

y: 2, x: 0, значение: 1.1, индекс столбца: 0, индекс строки: 1, значение ячейки: 1.1y: 3, x: 0, значение: 1.2, индекс столбца: 0, индекс строки: 2, значение ячейки: 1.2y: 4, x: 0, значение: 1,3, индекс столбца: 0, индекс строки: 3, значение ячейки: 1,3y: 5, x: 0, значение: 1.4, индекс столбца: 0, индекс строки: 4, значение ячейки: 1.4y: 2, x: 1, значение: 2.1, индекс столбца: 1, индекс строки: 1, значение ячейки: 2.1у: 3, х: 1, значение: 2,2, индекс столбца: 1, индекс строки: 2, значение ячейки: 2,2y: 4, x: 1, значение: 2.3, индекс столбца: 1, индекс строки: 3, значение ячейки: 2.3y: 5, x: 1, значение: 2,4, индекс столбца: 1, индекс строки: 4, значение ячейки: 2,4y: 6, x: 1, значение: 2,5, индекс столбца: 1, индекс строки: 5, значение ячейки: 2,5y: 2, x: 2, значение: 3.1, индекс столбца: 2, индекс строки: 1, значение ячейки: 3.1y: 3, x: 2, значение: 3.2, индекс столбца: 2, индекс строки: 2, значение ячейки: 3.2y: 4, x: 2, значение: 3,3, индекс столбца: 2, индекс строки: 3, значение ячейки: 3,3y: 5, x: 2, значение: 3.4, индекс столбца: 2, индекс строки: 4, значение ячейки: 3.4y: 6, x: 2, значение: 3,5, индекс столбца: 2, индекс строки: 5, значение ячейки: 3,5

y: 7, x: 2, значение: 3,6, индекс столбца: 2, индекс строки: 6, значение ячейки: 3,6

, но вывод файла

Заголовок1 заголовок 2 заголовок 3

                    3.1
                    3.2
                    3.3
                    3.4
                    3.5
                    3.6

output_file

Я не могу понять, почему первые два столбца пусты

Я ценю любую помощьполный код

https://github.com/micha3lvega/FileManager ......

1 Ответ

1 голос
/ 26 сентября 2019

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

Таким образом, для столбца Заголовок 2 вы создаете новую строку для каждого элемента в значениях, она перезаписывает те строки, созданные для столбца Заголовок 1 .А для Заголовок 3 вы создаете новую строку для каждого элемента в значениях, она переопределяет строки, созданные для столбца Заголовок 2 .

И если вы попытаетесьвыведите значения столбца Заголовок 1 и Заголовок 2 вне цикла for, вы должны получить NullPointerException.

Согласно вашей структуре данных, выможно создать карту для повторного использования объекта Row вместо создания нового объекта каждый раз.

Пример кода показан следующим образом:

Map<String, Row> rowMap = new HashMap<>();
for (Column colum : excelFile.getColumns()) {
    int rownum = 1;
    for (String value : colum.getValues()) {
        Row row;
        if (rowMap.containsKey("Row" + String.valueOf(rownum))) {
            row = rowMap.get("Row" + String.valueOf(rownum));
        } else {
            row = mySheet.createRow(rownum);
            rowMap.put("Row" + String.valueOf(rownum), row);
        }
        Cell cell = row.createCell(cellnum);
        cell.setCellValue(value);

        System.out.println("y: " + rownum + ", x: " + cellnum + ", value: " + value
            + ", Column Index: " + cell.getColumnIndex() + ", Row Index: " + cell.getRowIndex()
            + ", cell value: " + cell.getStringCellValue());

        rownum++;
    }

    cellnum++;
}
...