Копирование данных из колонки Excel, как скопировать из определённой колонки?

Есть два файла exel. Первый - отчёт, во втором данные из которого он собирается. В файле отчёта есть 3 листа. Необходимо в третий лист отчёта в первую колонку (в коде этот лист фигурирует как "почта 24") поместить содержимое второго файла, первого листа, 13й колонки (лист "Logs_Table"). Мой класс на данный момент копирует полностью лист этого файла и вставляет скопированное в лист отчёта. Подскажите, пожалуйста, как сделать так, чтобы копировалась только нужная колонка? Вот мой класс. Используемая библиотека Apache POI. Если увидите как в целом улучшить код, буду благодарен.

public class Report {

public static void main(String[] args) throws IOException {
    
    FileInputStream fileRepord = new FileInputStream(new File("S:\\46\\Отчётность\\Анализ Почт. Сервера\\Отчёты 03.2022\\отчёт за сутки 18.03.2022.xlsx"));
    XSSFWorkbook repord = new XSSFWorkbook(fileRepord);
    
    FileInputStream fileMTA = new FileInputStream(new File("C:\\Users\\lopatin_iv\\Desktop\\General_Overview___MTA_Mar_1__2022_4_16_21_PM.xlsx"));
    XSSFWorkbook sender = new XSSFWorkbook(fileMTA);
    Sheet sheetsenderMTA = sender.getSheet("Logs_Table");
    Sheet sheetsenderRepord = repord.getSheet("почта 24");
    
    Set<Integer> columns = new HashSet<Integer>();
    Row row2 = null;
    Cell cell2 = null;
    for (Row row1 : sheetsenderMTA) {
      row2 = sheetsenderRepord.createRow(row1.getRowNum());
       for (Cell cell1 : row1) {
        columns.add(cell1.getColumnIndex());
        cell2 = row2.createCell(cell1.getColumnIndex());
        copyCells(cell1, cell2);
       }
      }

     fileMTA.close();

      for (Integer column : columns) {
       sheetsenderRepord.autoSizeColumn(column);
      } 
      
      FileOutputStream out = new FileOutputStream("S:\\46\\Отчётность\\Анализ Почт. Сервера\\Отчёты 03.2022\\Test.xlsx");
      repord.write(out);
      out.close();
      repord.close(); 
     
    
}

static Font copyFont(Font font1, Workbook wb2) {
      boolean isBold = font1.getBold();
      short color = font1.getColor();
      short fontHeight = font1.getFontHeight();
      String fontName = font1.getFontName();
      boolean isItalic = font1.getItalic();
      boolean isStrikeout = font1.getStrikeout();
      short typeOffset = font1.getTypeOffset();
      byte underline = font1.getUnderline();

      Font font2 = wb2.findFont(isBold, color, fontHeight, fontName, isItalic, isStrikeout, typeOffset, underline);
      if (font2 == null) {
       font2 = wb2.createFont();
       font2.setBold(isBold);
       font2.setColor(color);
       font2.setFontHeight(fontHeight);
       font2.setFontName(fontName);
       font2.setItalic(isItalic);
       font2.setStrikeout(isStrikeout);
       font2.setTypeOffset(typeOffset);
       font2.setUnderline(underline);
      }

      return font2;
     }

 static void copyStyles(Cell cell1, Cell cell2) {
      CellStyle style1 = cell1.getCellStyle();
      Map<String, Object> properties = new HashMap<String, Object>();

      //CellUtil.DATA_FORMAT
      short dataFormat1 = style1.getDataFormat();
      if (BuiltinFormats.getBuiltinFormat(dataFormat1) == null) {
       String formatString1 = style1.getDataFormatString();
       DataFormat format2 = cell2.getSheet().getWorkbook().createDataFormat();
       dataFormat1 = format2.getFormat(formatString1);
      }
      properties.put(CellUtil.DATA_FORMAT, dataFormat1);

      //CellUtil.FILL_PATTERN  
      //CellUtil.FILL_FOREGROUND_COLOR 
      FillPatternType fillPattern = style1.getFillPattern();
      short fillForegroundColor = style1.getFillForegroundColor(); //gets only indexed colors, no custom HSSF or XSSF colors
      properties.put(CellUtil.FILL_PATTERN, fillPattern);
      properties.put(CellUtil.FILL_FOREGROUND_COLOR, fillForegroundColor);

      //CellUtil.FONT
      Font font1 = cell1.getSheet().getWorkbook().getFontAt(style1.getFontIndexAsInt());
      Font font2 = copyFont(font1, cell2.getSheet().getWorkbook());
      properties.put(CellUtil.FONT, font2.getIndexAsInt());

      //BORDERS
      BorderStyle borderStyle = null;
      short borderColor = -1;
      //CellUtil.BORDER_LEFT 
      //CellUtil.LEFT_BORDER_COLOR
      borderStyle = style1.getBorderLeft();
      properties.put(CellUtil.BORDER_LEFT, borderStyle);
      borderColor = style1.getLeftBorderColor();
      properties.put(CellUtil.LEFT_BORDER_COLOR, borderColor);
      //CellUtil.BORDER_RIGHT 
      //CellUtil.RIGHT_BORDER_COLOR
      borderStyle = style1.getBorderRight();
      properties.put(CellUtil.BORDER_RIGHT, borderStyle);
      borderColor = style1.getRightBorderColor();
      properties.put(CellUtil.RIGHT_BORDER_COLOR, borderColor);
      //CellUtil.BORDER_TOP 
      //CellUtil.TOP_BORDER_COLOR
      borderStyle = style1.getBorderTop();
      properties.put(CellUtil.BORDER_TOP, borderStyle);
      borderColor = style1.getTopBorderColor();
      properties.put(CellUtil.TOP_BORDER_COLOR, borderColor);
      //CellUtil.BORDER_BOTTOM 
      //CellUtil.BOTTOM_BORDER_COLOR
      borderStyle = style1.getBorderBottom();
      properties.put(CellUtil.BORDER_BOTTOM, borderStyle);
      borderColor = style1.getBottomBorderColor();
      properties.put(CellUtil.BOTTOM_BORDER_COLOR, borderColor);

      CellUtil.setCellStyleProperties(cell2, properties);
     }
 static void copyCells(Cell cell1, Cell cell2) {
      switch (cell1.getCellType()) {
       case STRING:
       /*
        //TODO: copy HSSFRichTextString to XSSFRichTextString 
        RichTextString rtString1 = cell1.getRichStringCellValue();
        cell2.setCellValue(rtString1); // this fails if cell2 is XSSF and rtString1 is HSSF
       */
        String string1 = cell1.getStringCellValue();
        cell2.setCellValue(string1);
       break;
       case NUMERIC:
        if (DateUtil.isCellDateFormatted(cell1)) {
         Date date1 = cell1.getDateCellValue();
         cell2.setCellValue(date1);
        } else {
         double cellValue1 = cell1.getNumericCellValue();
         cell2.setCellValue(cellValue1);
        }
       break;
       case FORMULA:
        String formula1 = cell1.getCellFormula();
        cell2.setCellFormula(formula1);
       break;

       //case : //TODO: further cell types

      }

      copyStyles(cell1, cell2);

     }  

}


Ответы (0 шт):