POI Excel单元格突出显示“修复记录:格式来自/xl/style.xml部分(样式)

时间:2015-06-26 07:17:08

标签: java css excel excel-vba apache-poi vba

当我使用Ms-excel-2007打开处理过的文件(.xlsx文件)时,我一直在excel表格中突出显示单元格,我正面临两个弹出窗口。其中指定的代码和图像:< / p>

  HSSFWorkbook xlsWB = new HSSFWorkbook(file1InputStream);

  XSSFWorkbook xlsxWB = new XSSFWorkbook(file2InputStream);

  CellStyle xlsxStyle = getCellStyle(xlsxWB);

  int numbeoOfSheetsFile1 = xlsWB.getNumberOfSheets();
  int numbeoOfSheetsFile2 = xlsxWB.getNumberOfSheets();

  for (int sheetIndex = 0; sheetIndex < numbeoOfSheetsFile1 && sheetIndex < numbeoOfSheetsFile2; sheetIndex++) {

   HSSFSheet sheetFile1 = xlsWB.getSheetAt(sheetIndex);
   XSSFSheet sheetFile2 = xlsxWB.getSheetAt(sheetIndex);

   int noOfRowsSheetFile1 = sheetFile1.getLastRowNum();
   int noOfRowsSheetFile2 = sheetFile2.getLastRowNum();

   if (noOfRowsSheetFile1 < noOfRowsSheetFile2) {
    for (int vRow = noOfRowsSheetFile1; vRow <= noOfRowsSheetFile2 - 1; vRow++) {
     sheetFile2.createRow(vRow).setRowStyle(xlsxStyle);
     //sheetFile2.getRow(vRow).setRowStyle(xlsxStyle);
    }
   }
   if (noOfRowsSheetFile1 > noOfRowsSheetFile2) {
    for (int vRow = noOfRowsSheetFile2 + 1; vRow <= noOfRowsSheetFile1; vRow++) {
     sheetFile2.createRow(vRow).setRowStyle(xlsxStyle);
     //sheetFile2.getRow(vRow).setRowStyle(xlsxStyle);
    }
   }

   for (int vRow = 0; vRow <= noOfRowsSheetFile1; vRow++) {
    HSSFRow rwFile1 = sheetFile1.getRow(vRow);
    XSSFRow rwFile2 = sheetFile2.getRow(vRow);

    int noOfColSheetFile1 = sheetFile1.getRow(vRow).getLastCellNum();

    int noOfColSheetFile2 = 0;
    try {
     noOfColSheetFile2 = sheetFile2.getRow(vRow).getLastCellNum();
    } catch (NullPointerException e) {
     rwFile2 = sheetFile2.createRow(vRow);
     noOfColSheetFile2 = 0;
    }

    // Coloring of mismatch columns
    if (noOfColSheetFile1 < noOfColSheetFile2) {
     for (int vCol = noOfColSheetFile1 + 1; vCol <= noOfColSheetFile2; vCol++) {
      rwFile2.createCell(vCol);
      //rwFile2.getCell(vCol).setCellStyle(xlsxStyle);
     }
    }


    if (noOfColSheetFile1 > noOfColSheetFile2) {
     for (int vCo2 = noOfColSheetFile2 + 1; vCo2 <= noOfColSheetFile1; vCo2++) {
      rwFile2.createCell(vCo2);
      //rwFile2.getCell(vCo2).setCellStyle(xlsxStyle);
     }
    }
    for (int vCol = 0; vCol < noOfColSheetFile1; vCol++) {
     //System.out.println("vCol>>" + vCol + "--vRow>>" + vRow);
     HSSFCell cellFile1 = rwFile1.getCell(vCol);
     XSSFCell cellFile2 = rwFile2.getCell(vCol);
     String cellFile1Value = null;
     if (null != cellFile1) {
      cellFile1Value = cellFile1.toString();

     }
     String cellFile2Value = null;
     if (null != cellFile2) {
      cellFile2Value = cellFile2.toString();
     }

  if ((null == cellFile1Value && null != cellFile2Value) || (null != cellFile1Value && null == cellFile2Value)          || (null != cellFile1Value && cellFile1Value.compareTo(cellFile2Value) != 0)) {

  if ((null != cellFile1Value && !cellFile1Value.isEmpty()) || (null != cellFile2Value && !          cellFile2Value.isEmpty())) { 
    CellValues cellValues = new CellValues();
    cellValues.setValue1(cellFile1Value);
    cellValues.setValue2(cellFile2Value);
    cellValues.setCellRow(vRow);
    cellValues.setCellColumn(vCol);
    scenarioResultDetails.addDifference(cellValues);
    XSSFCell cellDiff = rwFile2.getCell(vCol);
    if (null == cellDiff) {
     cellDiff = rwFile2.createCell(vCol);
    }
    cellDiff.setCellStyle(xlsxStyle);
   }
  }
    }
   }
  }
  String fileDiff = file2.replace(".xls", "_diff.xls");
  FileOutputStream fileOut = new FileOutputStream(fileDiff);
  xlsxWB.write(fileOut);
  if (null != fileOut) {
   try {
    fileOut.close();
   } catch (Exception e) {
   }
  }
  if (scenarioResultDetails.getDifferencesList().size() > 0) {
   scenarioResultDetails.setResult(false);
   scenarioResultDetails.setResultText("Not Matched");
   scenarioResultDetails.setDiffExcel(fileDiff);
  } else {
   scenarioResultDetails.setResult(true);
   scenarioResultDetails.setResultText("Matched");
  }
  return scenarioResultDetails;
 }

 public static void openFile(String fileName){
  ReportGenerator.getDriver().get("file://"+fileName);
 }
 private static CellStyle getCellStyle(XSSFWorkbook xssfWorkbook){
  CellStyle style = xssfWorkbook.createCellStyle();
  Font font = xssfWorkbook.createFont();
  font.setColor(IndexedColors.BLACK.getIndex());
  style.setFont(font);
  style.setFillForegroundColor(HSSFColor.YELLOW.index);
  style.setFillBackgroundColor(HSSFColor.YELLOW.index);
  style.setFillPattern(CellStyle.ALIGN_RIGHT);
  return style;
 }
}

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

此行为仍然存在(或再次存在)。我使用的是NuGet NPOI软件包的2.4.1版本,该软件包显然具有FontHeight属性的错误修正,但它也引入了这一点。

问题是xssfWorkbook.createFont();返回的字体的字体大小。很小。您必须像这样明确地设置它:

If pck.Workbook.Worksheets.Count <> 0 Then
    Dim ws = pck.Workbook.Worksheets.First
    Dim hasHeader = True ' adjust accordingly '
    For Each firstRowCell In ws.Cells(1, 1, 1, ws.Dimension.End.Column)
        dtCurrent.Columns.Add(
         If(hasHeader,
              firstRowCell.Text,
              String.Format("Column {0}", firstRowCell.Start.Column)))
    Next
    Dim startRow = If(hasHeader, 2, 1)
    For rowNum = startRow To ws.Dimension.End.Row
        Dim wsRow = ws.Cells(rowNum, 1, rowNum, ws.Dimension.End.Column)
        dtCurrent.Rows.Add(wsRow.Select(Function(cell) cell.Text).ToArray)
    Next
End If

在覆盖先前已修复的文件时,我也遇到类似的错误。确保每次更改代码时都写入一个干净/新文件,以免以前的损坏。

完整示例:

    IFont font = excel.CreateFont();
    font.FontHeightInPoints = 11;