HSSFWorkbook - Запись данных Excel с отдельным столбцом для разных значений - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь получить данные из mysql и записать их в excel с некоторыми условиями, как показано ниже,

 List<DataClass> getdata = reports.getReportData(); //This will return data from jdbcTemplate



deviceId    value  date
T01         59        2-sep
T01         67        3-sep
T01         78        4-sep
T01         79        5-sep
T02         68        2-sep
T02         69        3-sep
T02         75        4-sep
T03         70        2-sep
T03         78        3-sep
T03         80        4-sep
T03         89        5-sep

Пример кода, который я пытаюсь,

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Report");
HSSFRow header = sheet.createRow(0);

 int counter = 1;
 for (DataClass e : getdata ) {  
    if(counter != 1)
       if(getdata.get(counter-1).getDeviceId() != (getdata.get(counter).getDeviceId())
                      #here i want to create seperate column for different deviceId values


  HSSFRow row = sheet.createRow(counter++);());
  row.createCell(0).setCellValue(e.getValue());
  row.createCell(1).setCellValue(e.getDate());

   }

Я хочу написать этиданные в Excel, как показано ниже,

enter image description here

Как это сделать?

1 Ответ

0 голосов
/ 04 октября 2018

Создайте новый класс для сохранения информации о положении данных:

class DataPosition {
    public Integer colNum;
    public Integer rowNum;

    public DataPosition(Integer colNum,Integer rowNum) {
        this.colNum = colNum;
        this.rowNum = rowNum;
    }
}

Зацикливая данные, вы проверяете, включен ли deviceId в excel.Если это так, вы используете последний столбец и номер строки, соответствующий этому идентификатору устройства.Если он не включен, то используйте информацию о последнем столбце, чтобы добавить новые данные устройства и сохранить их на карте, содержащей положение этих данных

Map<String, DataPosition> excelIds = new HashMap<>();
DataPosition position;
// Start at -2 so when it comes to the first value, you add 2 to place the column number to 0
Integer currentColNum = -2;
Integer currentRowNum = 1;
HSSFRow row;
for (DataClass e: getdata) {  
    position = excelIds.get(e.getDeviceId());
    if (position != null) {
        // Add a new row
        position.rowNum++;
        currentRowNum = position.rowNum;
    } else {
        // Add a new column (increments by two because you need two columns for the representation)
        currentColNum += 2;
        currentRowNum = 1;
        excelIds.put(e.getDeviceId(), new DataPosition(currentColNum, currentRowNum));
    }

    row = sheet.getRow(currentRowNum);
    if (row == null) {
        row = sheet.createRow(currentRowNum);
    }

    row.createCell(currentColNum).setCellValue(e.getValue());
    row.createCell(currentColNum + 1).setCellValue(e.getDate());
}
...