为什么 XSSFRichTextString.applyFont() 不像 java 文档中所写的那样工作?

Why does not XSSFRichTextString.applyFont() work as it is written in java doc?

我正在尝试对字符串的一部分应用粗体并将其放入单元格中。

XSSFFont font = workbook.createFont();
font.setBold(true);
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
XSSFCell c = nextRow.createCell(4);
c.setCellStyle(style);
XSSFRichTextString string = new XSSFRichTextString(report.getSurroundText());
string.applyFont( startIndex, getEndOfWord(startIndex, report.getFoundWord()), font); 
c.setCellValue(string);

此代码作为我生成 .xlsx 文件的代码的一部分,它确实生成了一个未损坏的文件,但本应为粗体的文本不正确。相反,它突出显示从文本开头到我在 applyFont() 方法中设置为结束索引的索引。基本上由于某种原因 startIndex 被忽略了。

在调试期间,startIndexgetEndOfWord() 的 return 值都是正确的。

编辑:

try(FileOutputStream fileOut = new FileOutputStream(new File(directory.getAbsoluteFile() + File.separator + 
            FilenameUtils.getBaseName(csvFile.getAbsolutePath()) + ".xlsx"));) {
        try (XSSFWorkbook workbook = new XSSFWorkbook()) {
            XSSFSheet sheet = workbook.createSheet("Highlights");
            XSSFRow headerRow = sheet.createRow(0);
            headerRow.createCell(0).setCellValue(firstLine);

            XSSFRow titleRow = sheet.createRow(1);
            titleRow.createCell(0).setCellValue(SCANID);
            titleRow.createCell(1).setCellValue(DOCID);
            titleRow.createCell(2).setCellValue(FOUNDWORD);
            titleRow.createCell(3).setCellValue(OFFSET);
            titleRow.createCell(4).setCellValue(SURROUNDTEXT);

            XSSFFont font = workbook.createFont();
            font.setBold(true);
            XSSFFont deFont = workbook.createFont();
            font.setBold(false);

            int row = 2;
            for (MuiDetailReport report : lst) {
                XSSFRow nextRow = sheet.createRow(row);
                nextRow.createCell(0).setCellValue(report.getScanId());
                nextRow.createCell(1).setCellValue(report.getDocId());
                nextRow.createCell(2).setCellValue(report.getFoundWord());
                if (report.getOffset() != 0) nextRow.createCell(3).setCellValue(report.getOffset());
                else nextRow.createCell(3).setCellValue("");
                if (!report.getFoundWord().isBlank() && !report.getSurroundText().isBlank()) {
                    int startIndex = getStartOfWord(report.getFoundWord(), report.getSurroundText());
                    if (startIndex == -1) nextRow.createCell(4).setCellValue("");
                    else {
                        XSSFCell c = nextRow.createCell(4);
                        XSSFRichTextString string = new XSSFRichTextString(report.getSurroundText());
                        string.applyFont(startIndex, getEndOfWord(startIndex, report.getFoundWord()), font);
                        c.setCellValue(string);
                    }
                } else nextRow.createCell(4).setCellValue("");
                row++;
            }
            workbook.write(fileOut);
        }
        fileOut.flush();
    }

这是我创建 .xlsx 文件的方法。方法参数:String firstLine, List<MuiDetailReport> lst, File csvFile。所有大写字符的变量是 static final String

我的结果是“HellomynameisThad”而不是 "HellomynameisThad"

我通过 不将 CellStyle 应用于单元格而只是将 XSSFRichTextString 设置为单元格值来实现它。

查看此示例,它假设已经创建了一个 XSSFWorkbook 和一个 XSSFSheet:

XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
XSSFFont boldFont = new XSSFFont();
boldFont.setBold(true);
XSSFRichTextString rts = new XSSFRichTextString("BVB BVB BVB");
rts.applyFont(4, 7, boldFont);
cell.setCellValue(rts);

我省略了将工作簿写入文件系统的部分,我想你的已经可以了。

结果是第一个/左上角单元格中有 "BVB BVB BVB" 的工作簿。

这是我的 pom.xml(maven 项目)的一部分,其中设置了 apache poi 依赖项,也许您有它的旧版本:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>4.1.0</version>
</dependency>

让我们真正地Minimal, Reproducible Example

以下应导致文本

HellomynameisThad

在单元格 A1 中。

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

class CreateExcelBoldWord {

 public static void main(String[] args) throws Exception {

  Workbook workbook = new XSSFWorkbook(); 
  //Workbook workbook = new HSSFWorkbook();

  String fileName = (workbook instanceof XSSFWorkbook)?"Excel.xlsx":"Excel.xls";

  CreationHelper creationHelper = workbook.getCreationHelper();

  Font font = workbook.createFont(); // default font
  Font fontBold = workbook.createFont();
  fontBold.setBold(true);

  String text = "HellomynameisThad";
  String word = "name";

  RichTextString richTextString = creationHelper.createRichTextString(text);
  int startIndex = text.indexOf(word);
  int endIndex = startIndex + word.length();
  richTextString.applyFont(startIndex, endIndex, fontBold);

  Sheet sheet = workbook.createSheet();
  sheet.createRow(0).createCell(0).setCellValue(richTextString);

  FileOutputStream out = new FileOutputStream(fileName);
  workbook.write(out);
  out.close();
  workbook.close();
 }
}

没有?