当前位置: 首页 > 知识库问答 >
问题:

如何将示例格式的多行插入excel格式文件

郎俊雅
2023-03-14

我有一个像这样的excel格式:

我有两个函数来填充数据。这个是填充细节。

    public XSSFWorkbook getDetail(List<ResultDTO> ResultDTOList, XSSFWorkbook workBook,
        String sheetName) throws DaoException {

    XSSFSheet sheet = workBook.getSheet(sheetName);

    // first row at 9
    rowIdx = 9;

    int count = 0;
    for (ResultDTO dto : ResultDTOList) {

        colIdx = 0;
        count++;
        // get row 
        row = sheet.getRow(rowIdx);
        if (row == null) {
            row = sheet.createRow(rowIdx);
        }
        row.setHeightInPoints(16.5F);
        // No
        callCreateCell(row, colIdx++).setCellValue(count);
        // ItemNo
        callCreateCell(row, colIdx++).setCellValue(castRichTextString(dto.getItemNo()));
        // ArtistName
        callCreateCell(row, colIdx++).setCellValue(castRichTextString(dto.getArtistName()));
        colIdx++;
        // ItemTitle
        callCreateCell(row, colIdx++).setCellValue(castRichTextString(dto.getItemTitle()));
        colIdx++;

        // Size
        callCreateCell(row, colIdx++).setCellValue(dto.getSize());
        colIdx++;

        // Classification
        callCreateCell(row, colIdx++).setCellValue(dto.getClassification());
        colIdx++;

        // Detail
        callCreateCell(row, colIdx++).setCellValue(StringUtil.cutNewLineCharacter(dto.getPayDetail()));

        // Technique
        callCreateCell(row, colIdx++).setCellValue(dto.getTechnique());

        // Uriage
        callCreateCell(row, colIdx++).setCellValue(dto.getUriageWithoutTaxPrice());

        row = null;
        rowIdx++;
        rowIdx++;
    }
    return workBook;
}

这个用来填充总数

    public HSSFWorkbook getSum(UriageForm uriageForm, HSSFWorkbook workBook, String sheetName) {
    HSSFSheet sheet = workBook.getSheet(sheetName);

     CellStyle style1 = workBook.createCellStyle();

    style1.setAlignment(CellStyle.ALIGN_RIGHT);

    //set font size 14
    Font font1 = workBook.createFont();
    font1.setFontHeightInPoints((short)14);
    style1.setFont(font1);

    style1.setBorderLeft(CellStyle.BORDER_THIN);
    style1.setBorderBottom(CellStyle.BORDER_MEDIUM);

    Row row = sheet.getRow(20);
    //SUM1
    Cell cell2 = row.getCell(8);
    cell2.setCellValue(uriageForm.getPrintNestedSize());
    cell2.setCellStyle(style1);

    //SUM2
    Cell cell3 = row.getCell(9);
    cell3.setCellValue(uriageForm.getPrintTxtShouhi());
    cell3.setCellStyle(style1);

    //SUM3
    Cell cell4 = row.getCell(10);
    cell4.setCellValue(uriageForm.getPrintTxtSum());
    cell4.setCellStyle(style1);

    //SUM4
    Cell cell5 = row.getCell(12);
    cell5.setCellValue(uriageForm.getPrintTxtSumAll());
    cell5.setCellStyle(style1);

    return workBook;
}

问题是,如果我有超过5条记录,数据将被填充到第20行,我的格式被破坏。我的预期结果是,如果有超过5条记录,那么它将为每个添加的记录添加2行(作为格式),并且我的SUM始终是工作表的最后2行。

我正在考虑将 SUM 性别删除到另一个工作表中,并将其复制到最后一个工作表中,直到详细信息完成。但是我遇到了一些问题:

  1. 哪个函数可以帮助我将行从一个工作表复制到另一个工作表?
  2. 我只为5条记录设置了格式,那么如何为6th中的每个添加记录插入2行,以保持与旧记录相同的格式?(例如:第10行的复制格式

如果有点混乱,我很抱歉。这是我第一次使用Java和POI,所以我非常期待你的帮助!谢谢大家!

共有1个答案

魏鹤轩
2023-03-14

添加CopRow函数

    private void copyRow(XSSFWorkbook workbook, XSSFSheet worksheet, int sourceRowNum, int destinationRowNum) {
        XSSFRow newRow = worksheet.getRow(destinationRowNum);
        XSSFRow sourceRow = worksheet.getRow(sourceRowNum);

          if (newRow != null) {
            worksheet.shiftRows(destinationRowNum, worksheet.getLastRowNum(), 1);
            newRow = worksheet.createRow(destinationRowNum);
          } else {
            newRow = worksheet.createRow(destinationRowNum);
          }

          // copy process
          for (int i = 0; i < sourceRow.getLastCellNum(); i++) {
            Cell oldCell = sourceRow.getCell(i);
            Cell newCell = newRow.createCell(i);

            // if source cell is blank -> stop
            if (oldCell == null) {
              newCell = null;
              continue;
            }

            //copy style
            CellStyle newCellStyle = workbook.createCellStyle();
            newCellStyle.cloneStyleFrom(oldCell.getCellStyle());
            newCell.setCellStyle(newCellStyle);

            //copy cell type
            newCell.setCellType(oldCell.getCellType());

            //copy cell value
            switch (oldCell.getCellType()) {
            case Cell.CELL_TYPE_BLANK:
              newCell.setCellValue(oldCell.getStringCellValue());
              break;
            case Cell.CELL_TYPE_BOOLEAN:
              newCell.setCellValue(oldCell.getBooleanCellValue());
              break;
            case Cell.CELL_TYPE_ERROR:
              newCell.setCellErrorValue(oldCell.getErrorCellValue());
              break;
            case Cell.CELL_TYPE_FORMULA:
              newCell.setCellFormula(oldCell.getCellFormula());
              break;
            case Cell.CELL_TYPE_NUMERIC:
              newCell.setCellValue(oldCell.getNumericCellValue());
              break;
            case Cell.CELL_TYPE_STRING:
              newCell.setCellValue(oldCell.getRichStringCellValue());
              break;
            }
          }

          //copy column merge
          for (int i = 0; i < worksheet.getNumMergedRegions(); i++) {
            CellRangeAddress cellRangeAddress = worksheet.getMergedRegion(i);
            if (cellRangeAddress.getFirstRow() == sourceRow.getRowNum()) {
              CellRangeAddress newCellRangeAddress = new CellRangeAddress(newRow.getRowNum(),
                  (newRow.getRowNum() + (cellRangeAddress.getLastRow() - cellRangeAddress.getFirstRow())),
                  cellRangeAddress.getFirstColumn(), cellRangeAddress.getLastColumn());
              worksheet.addMergedRegion(newCellRangeAddress);
            }
          }
        }

在< code>getDetail函数中,添加以下代码:

int listSize = resultUriageWorkDTOList.size();
//add 2 rows for each record from 5th record 
for (int  i = 1; i <= (listSize - 5); i++) {
    this.copyRow(workBook, sheet, 10, 12);
    this.copyRow(workBook, sheet, 11, 13);
    sheet.addMergedRegion(new CellRangeAddress(11,12,4,5));
}

资料来源:https://www.sukerou.com/2019/03/poi-apache-poi-tips.html

 类似资料:
  • 如果这一行文本没有以方括号开头,我想把这一行连接到上面的一行。我可以读它在正常使用这个代码。我试着用String.StartsWith但是我搞不懂。 我正在寻找对此方法的更改,以使它以我想要的格式读取它,或者可能是一个将作用于我的并对此问题排序的方法。谢谢

  • 问题内容: 我收到了JSON文件,但不知道如何读取。有转换器可以在其中生成漂亮的CSV文件,以便将其加载到MS Excel中吗?我不懂JSON,所以如果有人编写脚本或将我链接到可以完成此任务的脚本,那将非常棒。 我在http://json.bloople.net上找到了一些接近的东西,但是不幸的是,它是JSON到HTML。 编辑:jsonformat.com越来越近,但是它仍然不是CSV。 问题答

  • 我正在尝试使用Jackson写json。它起作用了,而且据我所知,它的格式是正确的。但是,它仍然只出现在json文件中的一行中。这让它很难读懂。有没有办法让它多行,这样它就可读了? 代码: toJson文件中的结果: “{”name“:”div“,”attributes“:[{”type“:”text“,”info“:”two“},{”type“:”class“,”info“:”test“},{”

  • 问题内容: 我正在创建一个HTML表,将在Excel中作为电子表格打开。我可以使用哪种HTML标记或CSS样式“讲述” Excel以将单元格的内容显示为文本? 问题答案: 您可以将格式应用于数字,文本,日期等的单元格。 请参阅我以前关于此的答案:HTML toExcel:如何告诉Excel将列视为数字? (已调整的代码段) 如果将CSS类添加到页面: 并在您的TD上拍那些课,行得通吗?